RegistryAdmin ist das Docker-Registrierungs-UI-Tool, mit dem Benutzer den Zugriff und die Einträge einer privaten Docker-Registrierung verwalten können. Es bietet eine webbasierte Benutzeroberfläche zum Verwalten von Repositorys, Bildern und Benutzerzugriff und ermöglicht Benutzern die Authentifizierung mit einem beliebigen password
. Das Hauptziel des Projekts besteht darin, eine High-Level-API für die Verwaltung des Benutzerzugriffs auf eine private Registrierung bereitzustellen und Benutzeraktionen (z. B. Push und Pull) für bestimmte Repositorys basierend auf dem offiziellen privaten Docker-Registrierungsimage einzuschränken. Dies kann für Registrierungsbesitzer nützlich sein, die mehr Kontrolle über ihre Registrierung haben und den Zugriff darauf einfacher verwalten möchten.
Mit dem React-Admin-Framework und MUI-Komponenten erstellte Webbenutzeroberfläche.
pull
/ push
) für token
Authentifizierungsschema) RegistryAdmin ist ein Tool, das mit einer privaten Docker-Registrierung zusammenarbeitet und die V2-API der Registrierung verwendet, um mit dieser zu kommunizieren. Es verfügt über den HTTP-Endpunkt, der zur Authentifizierung von Benutzern mithilfe eines Tokens und zur Überprüfung ihrer Zugriffsrechte verwendet wird. Um RegistryAdmin mit einer Registrierung verwenden zu können, muss die Registrierung so konfiguriert sein, dass sie die tokenbasierte Authentifizierung unterstützt. Dadurch kann Benutzern basierend auf ihrem Authentifizierungstoken der Zugriff auf bestimmte Aktionen (z. B. pull
oder push
) gewährt oder eingeschränkt werden.
# 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
Sie können das htpasswd
Authentifizierungsschema verwenden, aber mit dieser Methode können Sie nur Benutzer verwalten und den Zugriff auf Repositorys nicht durch bestimmte Benutzer einschränken. Diese Funktion ist nur verfügbar, wenn die tokenbasierte Authentifizierung verwendet wird.
Um das Benutzererlebnis durch Funktionen wie Sortieren, Suchen und automatische Vervollständigung zu verbessern, verfügt RegistryAdmin über ein eingebettetes Speichersystem, das mit den Daten in der Registrierung synchronisiert wird. Dies ist notwendig, um die durch die Registrierungs-API aufgedeckten Einschränkungen der Such-API (Katalog) zu umgehen, da die Suchfunktion nur eine Paginierung mit einem Cursor zulässt und die Suche nach Repository-Eintrag nicht unterstützt. Die App enthält außerdem einen internen Garbage Collector zur Überprüfung der Datenkonsistenz im eingebetteten Speicher.
Um Änderungen in der Registrierung abzufangen, sollten Sie die Registrierungsbenachrichtigung so konfigurieren, dass sie an die RegistryAdmin-App gesendet wird.
# 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
Zugriff auf die RegistryAdmin-Benutzeroberfläche basierend auf der Benutzerrolle:
Admin
– volle Lese- und Schreibrechte für Benutzer, Zugriff und Einträge von Repositories.Manager
– eingeschränkte Rechte zum Durchsuchen von Zugriffslisten und Repository-Einträgen.User
– kann nur zugewiesene Repository-Einträge durchsuchen.RegistryAdmin wird als kleine eigenständige Binärdatei sowie als Docker-Image verteilt. Binär unterstützt mehrere Architekturen und mehrere Betriebssysteme, einschließlich linux_x86_64, linux_arm64, linux_arm, macos_x86_64, macos_arm64 und windows_x86_64. Docker-Image unterstützt die Architekturen linux_x86_64, linux_arm64 und linux_arm.
Die neueste stabile Version hat das Docker-Tag :vX.YZ (mit dem Alias :latest) und der aktuelle Master hat das Tag :master.
Um zu beginnen, müssen Sie die erforderlichen Parameter in einer Docker-Compose- Datei oder mithilfe von Befehlszeilen-Flags einrichten. Im Ordner _examples finden Sie verschiedene Konfigurationsbeispiele.
Wenn Sie RegistryAdmin als Docker-Container starten, sollten Sie die Berechtigung für Anwendungsordner ( certs
, config
, data
) als Benutzer mit der UID 1001
festlegen. Um die UID innerhalb eines Containers zu überschreiben, sollten Sie die Umgebungsvariable in einem Container mit den Startparametern APP_UID
verwenden.
chown -R 1001:1001 {root-registry-admin-folder}
hostname
– Definieren Sie den Hostnamen oder die IP-Adresse, die in den AllowedOrigins
-Header aufgenommen werden soll, der zur Prüfung auf CORS
Anfragen verwendet wird
port
– Definieren Sie den Port, den die Anwendung zum Abhören von HTTP-Anfragen verwendet (der Standardwert ist 80). Hinweis: Wenn Sie die App als Docker-Container starten, werden im Container nur die Ports 80
und 443
verfügbar gemacht.
store.type
– Definieren Sie den Speichertyp für die Hauptdaten des Geschäfts (Benutzer, Zugriffe, Repositorys). Standard ( embed
)
Now implement embed storage type only
store.admin_password
– überschreibt das Standard-Administratorkennwort bei der ersten Speichererstellung (Standardkennwort: admin
)store.embed.path
– Pfadnamen für die eingebettete Speicherdatei definieren (Standard: ./data.db
) registry.host
– Definieren Sie den Haupthost oder die IP-Adresse der privaten Registry-Instanz mit Protokollschema-Präfix.
example: host: https://{registry-host}
registry.port
– Port einer privaten Docker-Registry-Instanz (Standard: 5000
)registry.auth_type
– definiert den Authentifizierungstyp token
oder basic
(Standard: token
).issuer
– Name des Ausstellers, der in der Registrierung überprüft wird. Der Name des Ausstellers muss in der privaten Docker-Registrierung und in RegistryAdmin identisch sein.service
– Dienstname, der in den Registrierungseinstellungen definiert ist. Der Dienstname muss in der privaten Docker-Registrierung und in RegistryAdmin identisch sein. ❗ Beachten Sie, dass für token
-Authentifizierungstyp erforderliche certs
definiert werden müssen.
registry.certs.path
– Stammverzeichnis, in dem Zertifikate für die Tokensignierung generiert und gespeichert werdenregistry.certs.key
– Pfad zum privaten Schlüssel für die Tokensignierungregistry.certs.public_key
– Pfad zum öffentlichen Schlüssel zur Überprüfung des Token-Signaturregistry.certs.ca
– Pfad zum Zertifizierungsstellenpaketregistry.certs.fqdns
– FQDN(s), die für das Hinzufügen von Registrierungszertifikaten und Prüfungen auf Anfrage von Clients erforderlich sindregistry.certs.ip
– eine IP-Adresse wird zum Zertifikaterweiterungsfeld (SANs) hinzugefügt. Wenn es weggelassen wird, kann ein Zertifikatsfehler auftreten. Zertifikate werden automatisch generiert, wenn registry.certs.path
gültig und das Verzeichnis leer ist. Wenn keine certs
definiert sind, werden Zertifikate in einem Benutzer-Home-Verzeichnis im Unterordner .registry-certs
erstellt:
~/.registry-certs/
registry_auth.key
registry_auth.pub
registry_auth_ca.crt
Hinweis: Wenn selbstsignierte Zertifikate verwendet werden, sollten Sie Docker Engine auf einem Client-Host für die Arbeit mit diesen konfigurieren.
# https://docs.docker.com/config/daemon/
# /etc/docker/daemon.json (Linux)
# C:ProgramDatadockerconfigdaemon.json (Windows)
{
...
"insecure-registries": ["{registry-host}:{port}"],
...
}
Für das Registrierungstoken generierte Zertifikate können auch für HTTP TLS/SSL verwendet werden. Dieses Zertifikat wird automatisch zur vertrauenswürdigen Zertifizierungsstelle hinzugefügt. Wenn Sie jedoch ein anderes Zertifikat für den HTTPS-Zugriff verwenden, sollten Sie es dem vertrauenswürdigen CA-Pool hinzufügen. Verwenden Sie dazu die Option
--registry.https-certs
zum Definieren des Pfads zu einem verwendeten Zertifikat, das für den TLS/SSL-Zugriff verwendet wird. Es ist auch für Zertifikate erforderlich, die von Let's Encrypt ausgestellt wurden. Sie können auch die Option --registry.https-insecure
definieren, um die Prüfung auf das vertrauenswürdige Zertifikat zu überspringen, dies wird jedoch NICHT EMPFOHLEN.
# in a registry-admin config
registry :
...
certs :
...
https_cert : /{path-to-ssl}/cert.pem
...
Beachten Sie, dass Sie bei Verwendung auto
SSL-Modus die Option --ssl.acme-location
für den ACME-Cache-Speicher definieren müssen. Dann sollte das Cache-Datum in registry
in der Option „letsencrypt“ definiert werden:
letsencrypt :
cachefile : /path/to/cache-file
email : [email protected]
hosts : [you-registry.domain.org]
Unterstützt nur Registrierung V2. Um die Docker-Registrierung mit Token-Authentifizierung verwenden zu können, müssen Sie sie als eigenständigen Zugriffskontrollmanager für Ressourcen konfigurieren, die von anderen Diensten gehostet werden, die die Autorisierung mithilfe eines separaten Zugriffskontrollmanagers authentifizieren und verwalten möchten. Weitere Informationen hierzu finden Sie in den offiziellen Dokumentationen.
Zunächst müssen Sie auth
für token
Authentifizierung definieren und ein bestimmtes certificate
und key
festlegen, die mit der RegistryAdmin-App generiert wurden. Die Token-Optionen müssen mit den in der RegistryAdmin- Registry
definierten Optionen ( issuer
, service
, cert_ca
) identisch sein. Die RegistryAdmin-App verfügt über einen öffentlichen Endpunkt zur Authentifizierung von Benutzeranforderungen an die Registrierung, der in realm
-Registrierungsoption verwendet werden muss.
https://{registry-admin-host}:{port}/api/v1/auth
❗ realm
ist eine Option für die IP-Adresse oder den Hostnamen der RegistryAdmin-Instanz, auf die Docker-Clients zugreifen müssen, die sie zur Authentifizierung bei der privaten Registrierung verwenden.
auth :
token :
realm : http://{registry-admin-hostname}/api/v1/registry/auth
service : container_registry
issuer : registry_token_issuer
rootcertbundle : /certs/cert.crt
Um Registrierungsereignisse zu verarbeiten und Repository-Aufgaben auszulösen (z. B. einen neuen Repository-Eintrag hinzufügen, aktualisieren oder löschen), sollten Sie Registrierungsbenachrichtigungsoptionen einrichten:
url
– http(s)-URL zum RegistryAdmin-Host mit Ereignisendpunktpfad.
Authorization
aller aktivierten und registrierten Benutzer und ihres Passworts in der RegistryAdmin-App, codiert in 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
basic
mit der Datei .htpasswd
und unterstützt keine Einschränkung des Zugriffs auf bestimmte Repositorys. Für die Verwendung basic
benötigen Sie folgende Optionen:
login
– Benutzername für den Zugriff auf die Docker-Registrierungpassword
– Passwort für den Zugriff auf die Docker-Registrierung Die Docker-Registrierung liest die Datei .htpasswd
bei jedem Authentifizierungsaufruf und erfordert keinen Neustart des Registrierungsdienstes nach der Benutzeraktualisierung oder -löschung in RegistryAdmin
Standardmäßig wird kein Anforderungsprotokoll generiert. Dies kann durch die Einstellung --logger.enabled
aktiviert werden. Das Protokoll (automatisch gedreht) hat das Apache Combined Log Format
Der Benutzer kann die stdout-Anmeldung auch mit --logger.stdout
aktivieren. Es hat keinen Einfluss auf die obige Dateiprotokollierung, es werden jedoch einige minimale Informationen über verarbeitete Anfragen ausgegeben, etwa so:
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
Wenn RegistryAdmin Zugriff über das Internet hat, sollten Sie minimale Sicherheitsregeln einrichten, um Passwort-Brute-Force zu verhindern. Der einfachste Weg ist die Verwendung fail2ban
-Dienstes mit Zugriffsprotokolldatei auf einem Docker-Host.
access.log
für den RegistryAdmin-Dienst # 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
filter
mit einer Regel für den registry-admin
Dienst, der 401
und 403
Auth/Z-Fehler behandelt # /etc/fail2ban/filter.d/registry-admin.conf
[Definition]
failregex = ^<HOST> .+" 40[1,3] d+ .*$
ignoreregex =
fail2ban
in der Chain-Anweisung vorbereiten, da der normale Systemverkehr traditionell in der INPUT
-Kette erfolgt, während der Docker-Container-Verkehr über die FORWARD
-Kette gesendet wird. # 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
jail
mit der registry-admin
Regel # 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
Jede Option kann in drei Formen bereitgestellt werden: Befehlszeile, Umgebungsschlüssel:Wert-Paar oder Konfigurationsdatei ( json
oder yaml
-Formate). Befehlszeilenoptionen haben nur eine Langform, etwa --hostname=localhost. Der Umgebungsschlüssel (Name), der für jede Option als Suffix aufgeführt ist, z. B. [$HOSTNAME].
Konfigurationsdatei im json
und yml
-Format zulässig
--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
-Entwicklung sollten Sie RegistryAdmin mit der definierten Umgebungsvariablen RA_DEV_HOST=http://127.0.0.1:3000
ausführen, um CORS
Fehler in einem Browser zu verhindern. Außerdem muss .env.development
einen gültigen Entwicklungs-Hostnamen von RegistryAdmin enthalten.engine
Schnittstelle und kann zur Erweiterung des unterstützten Speichertyps verwendet werdenEmbed
verwendet SQLite
Datenbank und erfordert die Aktivierung CGO
Das Projekt befindet sich in der aktiven Entwicklung und kann bis zur Veröffentlichung von Version 1 wichtige Änderungen aufweisen. Wir geben jedoch unser Bestes, um nichts kaputt zu machen, es sei denn, es gibt einen guten Grund.
Dieses Projekt wurde von Projekten und Ideen von Umputun inspiriert