RegistryAdmin 是 Docker 註冊表 UI 工具,可讓使用者管理私有 Docker 註冊表的存取和條目。它提供了一個基於 Web 的使用者介面,用於管理儲存庫、圖像和使用者訪問,並允許使用者使用任一password
進行身份驗證。該專案的主要目標是提供一個高級 API 來管理使用者對私有註冊表的訪問,並根據官方私有 Docker 註冊表映像限制使用者對特定儲存庫的操作(例如推送和拉取)。這對於希望對其註冊表有更多控制權並希望能夠更輕鬆地管理對其註冊表的訪問的註冊表所有者來說非常有用。
使用 React-Admin 框架和 MUI 元件建立的 Web 使用者介面。
pull
/ push
)限制對儲存庫的訪問,用於token
驗證方案)RegistryAdmin 是一個與私有 Docker 註冊表結合使用的工具,並使用註冊表的 V2 API 與其進行通訊。它具有 HTTP 端點,用於使用令牌對使用者進行身份驗證並檢查他們的存取權限。為了將RegistryAdmin 與註冊表一起使用,必須將註冊表配置為支援基於令牌的身份驗證。這允許使用者根據其身份驗證令牌被授予或限制對某些操作(例如pull
或push
)的存取權限。
# in registry config file
...
auth :
token :
realm : https://{registry-admin-host}/api/v1/registry/auth
service : container_registry_service_name
issuer : registry_token_issuer_name
rootcertbundle : /certs/cert.crt # path to certificate bundle
您可以使用htpasswd
驗證方案,但使用此方法只能管理用戶,而不能限制特定用戶對儲存庫的存取。此功能僅在使用基於令牌的身份驗證時可用。
為了透過排序、搜尋和自動完成等功能來增強使用者體驗,RegistryAdmin 有一個嵌入式儲存系統,可以與登錄中的資料同步。這是必要的,以避免註冊表 API 公開的搜尋 API(目錄)的限制,因為搜尋功能僅允許使用遊標分頁,不支援透過儲存庫條目進行搜尋。該應用程式還包括一個內部垃圾收集器,用於檢查嵌入式儲存中的資料一致性。
若要捕捉註冊表中的更改,您應該配置要傳送到RegistryAdmin應用程式的註冊表通知。
# in registry config file
...
notifications :
events :
includereferences : true
endpoints :
- name : ra-listener
disabled : false
url : http://{registry-admin-host}/api/v1/registry/events
headers :
Authorization : [ Basic Y2xpZW50MDg6Y0t1cnNrQWdybzA4 ]
timeout : 1s
threshold : 5
backoff : 3s
ignoredmediatypes :
- application/octet-stream
ignore :
mediatypes :
- application/octet-stream
根據使用者角色存取RegistryAdmin UI:
Admin
- 使用者讀寫、儲存庫存取和條目的完全權限。Manager
- 瀏覽存取清單和儲存庫條目的有限權限。User
- 只能瀏覽指定的儲存庫條目。RegistryAdmin 以一個小型獨立二進位檔案以及 Docker 映像進行分發。二進位支援多種架構和多種作業系統,包括linux_x86_64、linux_arm64、linux_arm、macos_x86_64、macos_arm64和windows_x86_64。 Docker 映像支援 linux_x86_64、linux_arm64 和 linux_arm 架構。
最新穩定版本具有 :vX.YZ docker 標籤(帶有 :latest 別名),目前 master 具有 :master 標籤。
首先,您需要在docker-compose檔案中或使用命令列標誌設定所需的參數。您可以在 _examples 資料夾中找到各種設定範例。
當您將RegistryAdmin作為docker容器啟動時,您應該為具有UID 1001
的應用程式資料夾( certs
、 config
、 data
)使用者設定權限。若要覆寫容器內的 UID,您應該在容器中使用環境變數來啟動參數APP_UID
。
chown -R 1001:1001 {root-registry-admin-folder}
hostname
- 定義要包含在用於檢查CORS
請求的AllowedOrigins
標頭中的主機名稱或 IP 位址
port
- 定義應用程式用於偵聽 HTTP 請求的連接埠(預設為 80)。注意:如果您將應用程式作為 Docker 容器啟動,則只有連接埠80
和443
會在容器內公開。
store.type
- 定義儲存主要資料的儲存類型(使用者、存取、儲存庫)。預設( embed
)
Now implement embed storage type only
store.admin_password
- 首次建立儲存時覆蓋預設管理員密碼(預設密碼: admin
)store.embed.path
- 定義嵌入儲存檔案的路徑名稱(預設值: ./data.db
) registry.host
- 使用協定方案前綴定義私人註冊表實例的主主機或 IP 位址。
example: host: https://{registry-host}
registry.port
- 私人 docker 註冊表實例的連接埠(預設值: 5000
)registry.auth_type
- 定義驗證類型token
或basic
(預設值: token
)。issuer
- 檢查註冊表內部的發行者名稱,發行者名稱在私有 docker 註冊表和RegistryAdmin 中必須相同。service
- 在登錄設定中定義的服務名稱,私有 docker 註冊表和RegistryAdmin 中的服務名稱必須相同。 ❗ 請記住,必須定義token
身分驗證類型所需的certs
選項。
registry.certs.path
- 將在其中產生和儲存用於令牌簽署的憑證的根目錄registry.certs.key
- 用於令牌簽署的私鑰路徑registry.certs.public_key
- 用於驗證令牌簽署的公鑰的路徑registry.certs.ca
- 憑證授權單位組合包的路徑registry.certs.fqdns
- 需要新增登錄憑證的 FQDN 並依照客戶端的要求進行檢查registry.certs.ip
- IP 位址將會新增至憑證擴充欄位 (SAN)。如果省略證書,可能會發生錯誤。如果registry.certs.path
有效且目錄為空,則會自動產生憑證。如果未定義certs
選項,將在使用者主目錄的子資料夾.registry-certs
中建立憑證:
~/.registry-certs/
registry_auth.key
registry_auth.pub
registry_auth_ca.crt
注意:當使用自簽名憑證時,您應該在用戶端主機上設定 Docker 引擎才能使用自簽名憑證。
# https://docs.docker.com/config/daemon/
# /etc/docker/daemon.json (Linux)
# C:ProgramDatadockerconfigdaemon.json (Windows)
{
...
"insecure-registries": ["{registry-host}:{port}"],
...
}
為註冊表令牌產生的憑證也可用於 HTTP TLS/SSL。此憑證會自動新增至受信任的 CA。但如果您使用其他憑證進行 HTTPS 訪問,則應將其新增至受信任的 CA 池中。對於它使用選項--registry.https-certs
用於定義用於 TLS/SSL 存取的已使用憑證的路徑。 Let's Encrypt 頒發的憑證也需要它。另外,您可以定義--registry.https-insecure
選項來跳過對受信任憑證的檢查,但不建議。
# in a registry-admin config
registry :
...
certs :
...
https_cert : /{path-to-ssl}/cert.pem
...
請記住,如果您使用auto
ssl 模式,則必須為儲存 ACME 快取定義--ssl.acme-location
選項。然後快取日期應該在registry
配置中的 LetsEncrypt 選項中定義:
letsencrypt :
cachefile : /path/to/cache-file
email : [email protected]
hosts : [you-registry.domain.org]
僅支援註冊表 V2。要將 docker 註冊表與令牌身份驗證一起使用,您需要將其配置為獨立的存取控制管理器,用於其他希望使用單獨的存取控制管理器進行身份驗證和管理授權的服務託管的資源。要獲取有關它的更多信息,請參閱官方文檔。
首先,您需要為token
驗證定義auth
選項,並設定使用RegistryAdmin應用程式產生的特定certificate
和key
。令牌選項必須與RegistryAdmin Registry
定義的選項相同( issuer
、 service
、 cert_ca
)。 RegistryAdmin 應用程式具有公共端點,用於驗證使用者對註冊表的請求,必須在realm
註冊表選項中使用該端點。
https://{registry-admin-host}:{port}/api/v1/auth
❗ realm
是IP 位址或主機名稱RegistryAdmin 實例的選項,docker 用戶端必須可以存取該實例,並使用它來對私有註冊表進行身份驗證。
auth :
token :
realm : http://{registry-admin-hostname}/api/v1/registry/auth
service : container_registry
issuer : registry_token_issuer
rootcertbundle : /certs/cert.crt
為了處理登錄事件並觸發儲存庫任務(例如新增的、更新或刪除儲存庫項目),您應該設定登錄通知選項:
url
- 帶有事件端點路徑的RegistryAdmin 主機的http(s) url。
在RegistryAdmin 應用程式中對任何啟用和註冊的使用者及其密碼Authorization
,以Base64 編碼。
notifications :
events :
includereferences : true
endpoints :
- name : ra-listener
disabled : false
url : http://registry-admin/api/v1/registry/events
headers :
Authorization : [Basic YWRtaW46c3VwZXItc2VjcmV0] # encoded in Base64 as 'admin:super-secret'
timeout : 1s
threshold : 5
backoff : 3s
ignoredmediatypes :
- application/octet-stream
ignore :
mediatypes :
- application/octet-stream
使用.htpasswd
檔案的basic
選項,不支援限制對特定儲存庫的存取。要使用basic
身份驗證,您需要以下選項:
login
- 用於存取 docker 註冊表的使用者名password
- 存取 docker 註冊表的密碼Docker註冊表每次驗證呼叫時都會讀取.htpasswd
文件,並且在RegistryAdmin中更新或刪除用戶後不需要重新啟動註冊表服務
預設情況下,不產生請求日誌。可以透過設定--logger.enabled
來開啟此功能。日誌(自動旋轉)具有 Apache 組合日誌格式
使用者也可以使用--logger.stdout
開啟標準輸出登入。它不會影響上面的文件日誌記錄,但會輸出一些有關已處理請求的最小信息,如下所示:
127.0.0.1 - - [06/Dec/2022:18:36:34 +0300] "GET /auth/user HTTP/2.0" 200 159
127.0.0.1 - - [06/Dec/2022:18:36:34 +0300] "GET /api/v1/registry/auth HTTP/2.0" 200 198
當RegistryAdmin可以從網路存取時,您應該最少設定安全規則以防止密碼暴力破解。最簡單的方法是在 docker 主機上使用fail2ban
服務和存取日誌檔案。
access.log
# in registry-admin config file
logger :
enabled : true
filename : /var/log/registry-admin/access.log # mount the directory to a docker host folder for get access for fail2ban
max_size : 5M
max_backups : 3
401
和403
auth/z 錯誤的registry-admin
服務規則建立filter
# /etc/fail2ban/filter.d/registry-admin.conf
[Definition]
failregex = ^<HOST> .+" 40[1,3] d+ .*$
ignoreregex =
fail2ban
操作,因為正常的系統流量傳統上是在INPUT
鏈上遇到的,而 Docker 容器流量是透過FORWARD
鏈發送的。 # in the /etc/fail2ban/action.d/ directory
sudo cp iptables-common.conf iptables-common-forward.conf
sudo sed -i ' s/INPUT/FORWARD/g ' iptables-common-forward.conf
sudo cp iptables-multiport.conf iptables-multiport-forward.conf
sudo sed -i ' s/iptables-common.conf/iptables-common-forward.conf/g ' iptables-multiport-forward.conf
registry-admin
規則建立jail
# in /etc/fail2ban/jail.local
[registry-admin]
enabled = true
port = http,https # or set your custom port
filter = registry-admin
banaction = iptables-multiport-forward
logpath = /{path-to-logs-mounted-dir}/logs/access.log
maxretry = 5
findtime = 1h
bantime = 1d
每個選項都可以以三種形式提供:命令列、環境鍵:值對或設定檔( json
或yaml
格式)。命令列選項只有長格式,例如 --hostname=localhost。為每個選項列出的環境鍵(名稱)作為後綴,即 [$HOSTNAME]。
允許使用json
和yml
格式的設定文件
--listen: listen on host:port (127.0.0.1:80/443 without) (default: *) [$RA_LISTEN]
--hostname: Main hostname of service (default: localhost) [$RA_HOST_NAME]
--port: Main web-service port. Default:80 (default: 80) [$RA_PORT]
--config-file: Path to config file [$RA_CONFIG_FILE]
--debug enable the debug mode [$RA_DEBUG]
registry:
--registry.host: Main host or address to docker registry service [$RA_REGISTRY_HOST]
--registry.port: Port which registry accept requests. Default:5000 (default: 5000) [$RA_REGISTRY_PORT]
--registry.auth-type:[basic|token] Type for auth to docker registry service. Available 'basic' and 'token'. Default 'token' (default: token) [$RA_REGISTRY_AUTH_TYPE]
--registry.login: Username is a credential for access to registry service using basic auth type [$RA_REGISTRY_LOGIN]
--registry.password: Password is a credential for access to registry service using basic auth type [$RA_REGISTRY_PASSWORD]
--registry.htpasswd: Path to htpasswd file when basic auth type selected [$RA_REGISTRY_HTPASSWD]
--registry.https-insecure Set https connection to registry insecure [$RA_REGISTRY_HTTPS_INSECURE]
--registry.service: A service name which defined in registry settings [$RA_REGISTRY_SERVICE]
--registry.issuer: A token issuer name which defined in registry settings [$RA_REGISTRY_ISSUER]
--registry.token-ttl: Define registry auth token TTL (in seconds). Default value 60 seconds. [$RA_REGISTRY_TOKEN_TTL]
--registry.gc-interval: Use for define custom time interval for garbage collector execute (minutes), default 1 hours [$RA_REGISTRY_GC_INTERVAL]
certs:
--registry.certs.path: A path to directory where will be stored new self-signed cert,keys and CA files, when 'token' auth type is used [$RA_REGISTRY_CERTS_CERT_PATH]
--registry.certs.key: A path where will be stored new self-signed private key file, when 'token' auth type is used [$RA_REGISTRY_CERTS_KEY_PATH]
--registry.certs.public-key: A path where will be stored new self-signed public key file, when 'token' auth type is used [$RA_REGISTRY_CERTS_PUBLIC_KEY_PATH]
--registry.certs.ca-root: A path where will be stored new CA bundles file, when 'token' auth type is used [$RA_REGISTRY_CERTS_CA_ROOT_PATH]
--registry.certs.fqdn: FQDN(s) for registry certificates [$RA_REGISTRY_CERTS_FQDN]
--registry.certs.ip: Address which appends to certificate SAN (Subject Alternative Name) [$RA_REGISTRY_CERTS_IP]
--registry.https-certs: A path to a HTTPS certificate used for TLS access to registry instance [$RA_REGISTRY_HTTPS_CERT]
auth:
--auth.token-secret: Main secret for auth token sign [$RA_AUTH_TOKEN_SECRET]
--auth.jwt-issuer: Token issuer signature (default: zebox) [$RA_AUTH_ISSUER_NAME]
--auth.jwt-ttl: Define JWT expired timeout (default: 1h) [$RA_AUTH_JWT_TTL]
--auth.cookie-ttl: Define cookies expired timeout (default: 24h) [$RA_AUTH_COOKIE_TTL]
logger:
--logger.stdout enable stdout logging [$RA_LOGGER_STDOUT]
--logger.enabled enable access and error rotated logs [$RA_LOGGER_ENABLED]
--logger.file: location of access log (default: access.log) [$RA_LOGGER_FILE]
--logger.max-size: maximum size before it gets rotated (default: 10M) [$RA_LOGGER_SIZE]
--logger.max-backups: maximum number of old log files to retain (default: 10) [$RA_LOGGER_BACKUPS]
ssl:
--ssl.type:[none|static|auto] ssl (auto) support. Default is 'none' (default: none) [$RA_SSL_TYPE]
--ssl.cert: path to cert.pem file [$RA_SSL_CERT]
--ssl.key: path to key.pem file [$RA_SSL_KEY]
--ssl.acme-location: dir where certificates will be stored by autocert manager (default: ./acme) [$RA_SSL_ACME_LOCATION]
--ssl.acme-email: admin email for certificate notifications [$RA_SSL_ACME_EMAIL]
--ssl.port: Main web-service secure SSL port. Default:443 (default: 443) [$RA_SSL_PORT]
--ssl.http-port: http port for redirect to https and acme challenge test (default: 80) [$RA_SSL_ACME_HTTP_PORT]
--ssl.fqdn: FQDN(s) for ACME certificates [$RA_SSL_ACME_FQDN]
store:
--store.type:[embed] type of storage (default: embed) [$RA_STORE_DB_TYPE]
--store.admin-password: Define password for default admin user when storage create first (default: admin) [$RA_STORE_ADMIN_PASSWORD]
embed:
--store.embed.path: Parent directory for the sqlite files (default: ./data.db) [$RA_STORE_EMBED_DB_PATH]
Help Options:
-? Show this help message
-h, --help Show this help message
frontend
開發,您應該使用定義的環境變數RA_DEV_HOST=http://127.0.0.1:3000
執行RegistryAdmin,以防止瀏覽器中出現CORS
錯誤。此外.env.development
必須包含RegistryAdmin 的有效開發主機名稱。engine
介面的儲存實現,可用於擴展支援的儲存類型Embed
使用SQLite
資料庫並啟用所需的CGO
該專案正在積極開發中,在 v1 發布之前可能會發生重大變化。然而,除非有充分的理由,否則我們會盡力不破壞東西。
這個專案的靈感來自於 Umputun 的專案和想法