RegistryAdmin は、ユーザーがプライベート Docker レジストリのアクセスとエントリを管理できるようにする Docker レジストリ UI ツールです。リポジトリ、イメージ、およびユーザー アクセスを管理するための Web ベースのユーザー インターフェイスを提供し、ユーザーがいずれかのpassword
使用して認証できるようにします。プロジェクトの主な目標は、プライベート レジストリへのユーザー アクセスを管理するための高レベル API を提供し、公式のプライベート Docker レジストリ イメージに基づいて特定のリポジトリに対するユーザー アクション (プッシュやプルなど) を制限することです。これは、レジストリをより詳細に制御したい、またレジストリへのアクセスをより簡単に管理したいと考えているレジストリ所有者にとって便利です。
React-Admin フレームワークと MUI コンポーネントを使用して作成された Web ユーザー インターフェイス。
token
認証スキームのユーザーアクション( pull
/ push
)に基づいてリポジトリへのアクセスを制限します)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 タグがあります。
開始するには、 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
- クライアントからの要求に応じてレジストリ証明書とチェックに追加する必要がある FQDNregistry.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
オプションを定義する必要があることに注意してください。次に、キャッシュの日付を letsencrypt オプションのregistry
設定で定義する必要があります。
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
、プライベート レジストリへの認証に使用する Docker クライアントがアクセスできる必要があるIP アドレスまたはホスト名RegistryAdmin インスタンスのオプションです。
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 アプリ内の有効化および登録済みのユーザーとそのパスワード (Base64 でエンコードされたもの) Authorization
。
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
を使用して 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
チェーンを介して送信されるため、チェーン ステートメントで failed2ban アクションを準備する必要があります。 # 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
形式) の 3 つの形式で提供できます。コマンド ライン オプションには、--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
開発の場合、ブラウザでのCORS
エラーを防ぐために、環境変数RA_DEV_HOST=http://127.0.0.1:3000
を定義して RegistryAdmin を実行する必要があります。また、 .env.development
には RegistryAdmin の有効な開発ホスト名が含まれている必要があります。engine
インターフェイスを使用してストレージを実装し、サポートされているストレージ タイプを拡張するために使用できますEmbed
SQLite
データベースを使用し、 CGO
有効にする必要がありますプロジェクトは現在鋭意開発中であり、v1 がリリースされるまで重大な変更が加えられる可能性があります。ただし、特別な理由がない限り、壊れないように最善を尽くしています。
このプロジェクトは、ウムプトゥンのプロジェクトとアイデアに触発されました。