RegistryAdmin es la herramienta de interfaz de usuario del registro de Docker que permite a los usuarios administrar el acceso y las entradas de un registro de Docker privado. Proporciona una interfaz de usuario basada en web para administrar repositorios, imágenes y acceso de usuarios, y permite a los usuarios autenticarse utilizando cualquiera password
. El objetivo principal del proyecto es proporcionar una API de alto nivel para administrar el acceso de los usuarios a un registro privado y restringir las acciones de los usuarios (como push y pull) para repositorios específicos basados en la imagen oficial del registro privado de Docker. Esto puede resultar útil para los propietarios de registros que desean tener más control sobre su registro y poder administrar el acceso a él más fácilmente.
Interfaz de usuario web creada con el marco React-Admin y componentes MUI.
pull
/ push
) para el esquema de autenticación token
) RegistryAdmin es una herramienta que funciona junto con un registro Docker privado y utiliza la API V2 del registro para comunicarse con él. Tiene el punto final HTTP que se utiliza para autenticar a los usuarios mediante un token y verificar sus derechos de acceso. Para utilizar RegistryAdmin con un registro, el registro debe estar configurado para admitir la autenticación basada en token. Esto permite a los usuarios obtener o restringir el acceso a determinadas acciones (como pull
o push
) en función de su token de autenticación.
# 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
Puede utilizar el esquema de autenticación htpasswd
, pero con este método sólo puede administrar usuarios y no restringir el acceso a los repositorios a un usuario específico. Esta función solo está disponible cuando se utiliza la autenticación basada en token.
Para mejorar la experiencia del usuario con funciones como clasificación, búsqueda y autocompletar, RegistryAdmin tiene un sistema de almacenamiento integrado que se sincroniza con los datos del registro. Esto es necesario para evitar los límites de la API de búsqueda (catálogo) expuestos por la API de registro, ya que la función de búsqueda solo permite la paginación con un cursor y no admite la búsqueda por entrada del repositorio. La aplicación también incluye un recolector de basura interno para verificar la coherencia de los datos en el almacenamiento integrado.
Para detectar cambios en el registro, debe configurar la notificación del registro para que se envíe a la aplicación 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
Acceso a la interfaz de usuario de RegistryAdmin según el rol de los usuarios:
Admin
: derechos completos de lectura y escritura para los usuarios, acceso y entradas de repositorios.Manager
: derechos limitados para explorar la lista de acceso y las entradas de los repositorios.User
: solo puede explorar las entradas de los repositorios asignados.RegistryAdmin se distribuye como un pequeño binario autónomo y como una imagen acoplable. Binary admite múltiples arquitecturas y múltiples sistemas operativos, incluidos linux_x86_64, linux_arm64, linux_arm, macos_x86_64, macos_arm64 y windows_x86_64. La imagen de Docker admite las arquitecturas linux_x86_64, linux_arm64 y linux_arm.
La última versión estable tiene la etiqueta acoplable :vX.YZ (con el alias :latest) y el maestro actual tiene la etiqueta :master.
Para comenzar, deberá configurar los parámetros requeridos en un archivo Docker-Compose o usar indicadores de línea de comando. Puede encontrar varios ejemplos de configuración en la carpeta _examples.
Cuando inicia RegistryAdmin como contenedor acoplable, debe establecer permisos para el usuario de las carpetas de la aplicación ( certs
, config
, data
) con UID 1001
. Para anular el UID dentro de un contenedor, debe usar la variable de entorno en un contenedor a partir de los parámetros APP_UID
.
chown -R 1001:1001 {root-registry-admin-folder}
hostname
: define el nombre de host o la dirección IP para incluir en el encabezado AllowedOrigins
que se utiliza para verificar las solicitudes CORS
.
port
: define el puerto que la aplicación utilizará para escuchar las solicitudes HTTP (el valor predeterminado es 80). Nota: Si inicia la aplicación como un contenedor Docker, solo los puertos 80
y 443
quedan expuestos dentro del contenedor.
store.type
: define el tipo de almacenamiento para los datos principales de la tienda (usuarios, accesos, repositorios). Predeterminado ( embed
)
Now implement embed storage type only
store.admin_password
: anula la contraseña de administrador predeterminada cuando se crea el almacenamiento primero (contraseña predeterminada: admin
)store.embed.path
: define la ruta para el archivo de almacenamiento integrado (predeterminado: ./data.db
) registry.host
: define el host principal o la dirección IP de la instancia de registro privado con el prefijo del esquema de protocolo.
example: host: https://{registry-host}
registry.port
: puerto de una instancia de registro de Docker privada (predeterminado: 5000
)registry.auth_type
: define el tipo de autenticación token
o basic
(predeterminado: token
).issuer
: nombre del emisor que se verifica dentro del registro; el nombre del emisor debe ser el mismo en el registro privado de Docker y en RegistryAdmin.service
: nombre del servicio que se definió en la configuración del registro, el nombre del servicio debe ser el mismo en el registro privado de Docker y en RegistryAdmin. ❗ Tenga en cuenta que se deben definir las opciones certs
requeridos para el tipo de autenticación token
.
registry.certs.path
: directorio raíz donde se generarán y almacenarán los certificados para la firma de tokensregistry.certs.key
: ruta a la clave privada para la firma del tokenregistry.certs.public_key
: ruta a la clave pública para verificar el signo del tokenregistry.certs.ca
- ruta al paquete de autoridad de certificaciónregistry.certs.fqdns
: FQDN que se deben agregar para el certificado de registro y las verificaciones a pedido de los clientesregistry.certs.ip
: se agregará una dirección IP al campo de extensión del certificado (SAN). Si se omitió, se puede producir un error de certificado. Los certificados se generarán automáticamente si registry.certs.path
es válido y el directorio está vacío. Si las opciones certs
no están definidas, los certificados se crearán en el directorio de inicio del usuario en la subcarpeta .registry-certs
:
~/.registry-certs/
registry_auth.key
registry_auth.pub
registry_auth_ca.crt
Aviso: cuando se utilizan certificados autofirmados, debe configurar Docker Engine en un host cliente para trabajar con ellos.
# https://docs.docker.com/config/daemon/
# /etc/docker/daemon.json (Linux)
# C:ProgramDatadockerconfigdaemon.json (Windows)
{
...
"insecure-registries": ["{registry-host}:{port}"],
...
}
Los certificados generados para el token de registro también se pueden utilizar para HTTP TLS/SSL. Ese certificado se agrega automáticamente a la CA confiable. Pero si utiliza otro certificado para el acceso HTTPS, debe agregarlo al grupo de CA confiable. Para ello utilice la opción
--registry.https-certs
para definir la ruta a un certificado usado que se utiliza para el acceso TLS/SSL. También es necesario para los certificados emitidos por Let's Encrypt. Además, puede definir la opción --registry.https-insecure
para omitir la verificación del certificado confiable, pero NO RECOMENDADO.
# in a registry-admin config
registry :
...
certs :
...
https_cert : /{path-to-ssl}/cert.pem
...
Tenga en cuenta que si utiliza el modo SSL auto
, debe definir la opción --ssl.acme-location
para almacenar la caché ACME. Luego, la fecha del caché debe definirse en la configuración registry
en la opción letsencrypt:
letsencrypt :
cachefile : /path/to/cache-file
email : [email protected]
hosts : [you-registry.domain.org]
Registro compatible únicamente con V2. Para utilizar el registro de Docker con autenticación de token, debe configurarlo como un administrador de control de acceso independiente para recursos alojados en otros servicios que deseen autenticar y administrar la autorización mediante un administrador de control de acceso independiente. Para obtener más información al respecto, siga la documentación oficial.
Al principio, debe definir la opción auth
para la autenticación token
y establecer certificate
y key
específicos que se generaron con la aplicación RegistryAdmin. Las opciones de token deben ser las mismas que las opciones definidas Registry
de RegistryAdmin ( issuer
, service
, cert_ca
). La aplicación RegistryAdmin tiene un punto final público para autenticar las solicitudes de los usuarios en el registro, que debe usarse en la opción de registro realm
.
https://{registry-admin-host}:{port}/api/v1/auth
❗ realm
es una opción de dirección IP o instancia de Hostname RegistryAdmin a la que deben acceder los clientes de Docker que la utilizan para autenticarse en un registro privado.
auth :
token :
realm : http://{registry-admin-hostname}/api/v1/registry/auth
service : container_registry
issuer : registry_token_issuer
rootcertbundle : /certs/cert.crt
Para manejar eventos de registro y activar tareas de repositorio (como agregar nueva, actualizar o eliminar entrada de repositorio), debe configurar las opciones de notificación de registro:
url
: URL http(s) al host de RegistryAdmin con la ruta del punto final de eventos.
Authorization
a cualquier usuario habilitado y registrado y su contraseña en la aplicación RegistryAdmin, codificada en 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
opción basic
que usa el archivo .htpasswd
y no admite restringir el acceso a repositorios específicos. Para utilizar la autenticación basic
, necesita las siguientes opciones:
login
: nombre de usuario para acceder al registro de Dockerpassword
: contraseña para acceder al registro de Docker El registro de Docker lee el archivo .htpasswd
cada vez que se realiza una llamada de autenticación y no requiere reiniciar el servicio de registro después de la actualización o eliminación del usuario en RegistryAdmin.
De forma predeterminada, no se genera ningún registro de solicitudes. Esto se puede activar configurando --logger.enabled
. El registro (girado automáticamente) tiene el formato de registro combinado de Apache.
El usuario también puede activar el inicio de sesión estándar con --logger.stdout
. No afectará el registro de archivos anterior, pero generará información mínima sobre las solicitudes procesadas, algo como esto:
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
Cuando RegistryAdmin tiene acceso desde Internet, debe configurar al mínimo las reglas de seguridad para evitar la fuerza bruta de la contraseña. La forma más sencilla de utilizar el servicio fail2ban
con un archivo de registro de acceso en un host Docker.
access.log
para el servicio RegistryAdmin # 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
con regla para el servicio registry-admin
que maneja los errores de autenticación/z 401
y 403
# /etc/fail2ban/filter.d/registry-admin.conf
[Definition]
failregex = ^<HOST> .+" 40[1,3] d+ .*$
ignoreregex =
fail2ban
en la declaración de la cadena, porque el tráfico normal del sistema tradicionalmente llega a la cadena INPUT
, mientras que el tráfico del contenedor Docker se envía a través de la cadena 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
jail
con la regla registry-admin
# 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
Cada opción se puede proporcionar en tres formas: línea de comando, clave de entorno: par de valores o archivo de configuración (formatos json
o yaml
). Las opciones de la línea de comando solo tienen un formato largo, como --hostname=localhost. La clave de entorno (nombre) enumerada para cada opción como sufijo, es decir, [$HOSTNAME].
Archivo de configuración permitido en formato json
y 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
local, debe ejecutar RegistryAdmin con la variable de entorno definida RA_DEV_HOST=http://127.0.0.1:3000
para evitar errores CORS
en un navegador. Además, .env.development
debe contener un nombre de host de desarrollo válido de RegistryAdmin.engine
y se puede utilizar para ampliar el tipo de almacenamiento admitido.Embed
utiliza la base de datos SQLite
y requiere CGO
habilitadoEl proyecto está en desarrollo activo y puede tener cambios importantes hasta que se lance la versión 1. Sin embargo, hacemos todo lo posible para no romper cosas a menos que haya una buena razón.
Este proyecto se inspiró en proyectos e ideas de Umputun.