O RegistryAdmin é a ferramenta de UI do registro do Docker que permite aos usuários gerenciar o acesso e as entradas de um registro Docker privado. Ele fornece uma interface de usuário baseada na Web para gerenciar repositórios, imagens e acesso de usuários e permite que os usuários se autentiquem usando qualquer password . O principal objetivo do projeto é fornecer uma API de alto nível para gerenciar o acesso do usuário a um registro privado e restringir ações do usuário (como push e pull) para repositórios específicos com base na imagem oficial do registro privado do Docker. Isso pode ser útil para proprietários de registros que desejam ter mais controle sobre seus registros e poder gerenciar o acesso a eles com mais facilidade.
Interface de usuário da Web criada com estrutura React-Admin e componentes MUI.

pull / push ) para esquema de autenticação token ) RegistryAdmin é uma ferramenta que funciona em conjunto com um registro Docker privado e usa a API V2 do registro para se comunicar com ele. Possui o endpoint HTTP que é usado para autenticar usuários usando um token e verificar seus direitos de acesso. Para usar o RegistryAdmin com um registro, o registro deve ser configurado para suportar autenticação baseada em token. Isso permite que os usuários tenham acesso concedido ou restrito a determinadas ações (como pull ou push ) com base em seu token de autenticação.
# 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 Você pode usar o esquema de autenticação htpasswd , mas com este método você só pode gerenciar usuários e não restringir o acesso aos repositórios por usuário específico. Este recurso só está disponível ao usar autenticação baseada em token.
Para aprimorar a experiência do usuário com recursos como classificação, pesquisa e preenchimento automático, o RegistryAdmin possui um sistema de armazenamento integrado que sincroniza com os dados do registro. Isso é necessário para evitar os limites da API de busca (catálogo) expostos pela API do registro, pois a função de busca só permite a paginação com cursor e não suporta busca por entrada de repositório. O aplicativo também inclui um coletor de lixo interno para verificar a consistência dos dados no armazenamento incorporado.
Para capturar alterações no registro, você deve configurar a notificação do registro para ser enviada ao aplicativo 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-streamAcesso à UI do RegistryAdmin com base na função do usuário:
Admin - direitos totais de leitura e gravação para usuários, acesso e entradas de repositórios.Manager - direitos limitados para navegar na lista de acesso e entradas de repositórios.User - pode navegar apenas pelas entradas de repositórios atribuídas.RegistryAdmin distribuído como um pequeno binário independente, bem como uma imagem docker. O binário suporta múltiplas arquiteturas e vários sistemas operacionais, incluindo linux_x86_64, linux_arm64, linux_arm, macos_x86_64, macos_arm64 e windows_x86_64. A imagem Docker suporta as arquiteturas linux_x86_64, linux_arm64 e linux_arm.
A versão estável mais recente possui a tag docker :vX.YZ (com :latest alias) e o master atual possui a tag :master.
Para começar, você precisará configurar os parâmetros necessários em um arquivo docker-compose ou usando sinalizadores de linha de comando. Você pode encontrar vários exemplos de configuração na pasta _examples.
Ao iniciar o RegistryAdmin como contêiner docker, você deve definir a permissão para o usuário das pastas do aplicativo ( certs , config , data ) com UID 1001 . Para substituir o UID dentro de um contêiner, você deve usar a variável de ambiente em um contêiner iniciando os parâmetros APP_UID .
chown -R 1001:1001 {root-registry-admin-folder} hostname - define o nome do host ou endereço IP para incluir no cabeçalho AllowedOrigins que é usado para verificar solicitações CORS
port - defina a porta que a aplicação utilizará para escutar solicitações HTTP (o padrão é 80). Observação: se você iniciar o aplicativo como um contêiner Docker, somente as portas 80 e 443 serão expostas dentro do contêiner.
store.type - define o tipo de armazenamento para os principais dados da loja (usuários, acessos, repositórios). Padrão ( embed )
Now implement embed storage type only
store.admin_password - substitui a senha de administrador padrão ao criar o armazenamento primeiro (senha padrão: admin )store.embed.path - define o nome do caminho para o arquivo de armazenamento incorporado (padrão: ./data.db ) registry.host - define o host principal ou endereço IP da instância de registro privado com o prefixo do esquema de protocolo.
example: host: https://{registry-host}
registry.port - porta de uma instância de registro do Docker privada (padrão: 5000 )registry.auth_type - define o tipo de autenticação token ou basic (padrão: token ).issuer - nome do emissor que verifica dentro do registro, o nome do emissor deve ser o mesmo no registro do docker privado e no RegistryAdmin.service - nome do serviço definido nas configurações do registro, o nome do serviço deve ser o mesmo no registro do docker privado e no RegistryAdmin. ❗ Lembre-se de que as opções certs obrigatórios do tipo de autenticação token devem ser definidas.
registry.certs.path - diretório raiz onde serão gerados e armazenados os certificados para assinatura de tokenregistry.certs.key – caminho para a chave privada para assinatura de tokenregistry.certs.public_key - caminho para a chave pública para verificar o sinal do tokenregistry.certs.ca - caminho para o pacote de autoridade de certificaçãoregistry.certs.fqdns - FQDN(s) necessários para adicionar certificados de registro e verificações mediante solicitação dos clientesregistry.certs.ip - um endereço IP será adicionado ao campo de extensão de certificado (SANs). Se for omitido, poderá ocorrer um erro de certificado. Os certificados serão gerados automaticamente se registry.certs.path for válido e o diretório estiver vazio. Se as opções certs não estiverem definidas, os certificados serão criados em um diretório inicial do usuário na subpasta .registry-certs :
~/.registry-certs/
registry_auth.key
registry_auth.pub
registry_auth_ca.crt
Aviso: quando certificados autoassinados são usados, você deve configurar o Docker Engine em um host cliente para trabalhar com eles.
# https://docs.docker.com/config/daemon/
# /etc/docker/daemon.json (Linux)
# C:ProgramDatadockerconfigdaemon.json (Windows)
{
...
"insecure-registries": ["{registry-host}:{port}"],
...
}
Os certificados gerados para token de registro também podem ser usados para HTTP TLS/SSL. Esse certificado é adicionado automaticamente à CA confiável. Mas se você usar outro certificado para acesso HTTPS, deverá adicioná-lo ao pool de CA confiável. Para isso use a opção
--registry.https-certs para definir o caminho para um certificado usado para acesso TLS/SSL. Também é necessário para certificados emitidos pela Let's Encrypt. Além disso, você pode definir a opção --registry.https-insecure para ignorar a verificação do certificado confiável, mas NÃO RECOMENDADO.
# in a registry-admin config
registry :
...
certs :
...
https_cert : /{path-to-ssl}/cert.pem
...
Lembre-se de que, se você usar o modo SSL auto , deverá definir a opção --ssl.acme-location para armazenar o cache ACME. Então a data do cache deve ser definida na configuração registry na opção letsencrypt:
letsencrypt :
cachefile : /path/to/cache-file
email : [email protected]
hosts : [you-registry.domain.org] Somente registro V2 compatível. Para usar o registro docker com autenticação de token, você precisa configurá-lo como um gerenciador de controle de acesso independente para recursos hospedados por outros serviços que desejam autenticar e gerenciar a autorização usando um gerenciador de controle de acesso separado. Para obter mais informações sobre o assunto, siga as documentações oficiais.
Primeiramente, você precisa definir a opção auth para autenticação token e definir certificate e key específicos gerados com o aplicativo RegistryAdmin. As opções de token devem ser iguais às opções definidas pelo Registry RegistryAdmin ( issuer , service , cert_ca ). O aplicativo RegistryAdmin possui endpoint público para autenticar solicitações de usuários ao registro, que deve ser usado na opção de registro realm .
https://{registry-admin-host}:{port}/api/v1/auth
❗ realm é a opção de endereço IP ou instância Hostname RegistryAdmin que deve ser acessível para clientes docker que o utilizam para autenticação no registro privado.

auth :
token :
realm : http://{registry-admin-hostname}/api/v1/registry/auth
service : container_registry
issuer : registry_token_issuer
rootcertbundle : /certs/cert.crtPara lidar com eventos de registro e acionar tarefas de repositório (como adicionar nova, atualizar ou excluir entrada de repositório), você deve configurar opções de notificação de registro:
url - url http(s) para o host RegistryAdmin com caminho do endpoint de eventos.
Authorization de qualquer usuário habilitado e cadastrado e sua senha no app RegistryAdmin, codificada em 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 opção basic usando arquivo .htpasswd e não suporta acesso restrito a repositórios específicos. Para usar a autenticação basic , você precisa das seguintes opções:
login - nome de usuário para acesso ao registro do dockerpassword - senha para acesso ao registro do docker O registro do Docker lê o arquivo .htpasswd sempre que autentica a chamada e não requer a reinicialização do serviço de registro após a atualização ou exclusão do usuário no RegistryAdmin
Por padrão, nenhum log de solicitação é gerado. Isso pode ser ativado configurando --logger.enabled . O log (girado automaticamente) tem formato de log combinado Apache
O usuário também pode ativar o logon stdout com --logger.stdout . Isso não afetará o registro do arquivo acima, mas gerará algumas informações mínimas sobre as solicitações processadas, algo como isto:
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
Quando o RegistryAdmin tiver acesso pela Internet, você deve configurar regras de segurança mínimas para evitar a força bruta da senha. A maneira mais simples de usar o serviço fail2ban com arquivo de log de acesso em um host docker.
access.log para o serviço 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 com regra para o serviço registry-admin que lida com erros 401 e 403 auth/z # /etc/fail2ban/filter.d/registry-admin.conf
[Definition]
failregex = ^<HOST> .+" 40[1,3] d+ .*$
ignoreregex =
fail2ban na instrução chain, porque o tráfego normal do sistema tradicionalmente vem na cadeia INPUT , enquanto o tráfego do contêiner Docker é enviado através da cadeia 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.confjail com a regra 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 opção pode ser fornecida em três formas: linha de comando, par chave:valor de ambiente ou arquivo de configuração (formatos json ou yaml ). As opções de linha de comando têm apenas um formato longo, como --hostname=localhost. A chave de ambiente (nome) listada para cada opção como um sufixo, ou seja, [$HOSTNAME].
Arquivo de configuração permitido nos formatos json e 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, você deve executar o RegistryAdmin com a variável de ambiente definida RA_DEV_HOST=http://127.0.0.1:3000 para evitar erros CORS em um navegador. Além disso, .env.development deve conter um nome de host de desenvolvimento válido de RegistryAdmin.engine e pode ser usado para estender o tipo de armazenamento suportadoEmbed usa banco de dados SQLite e CGO necessário habilitadoO projeto está em desenvolvimento ativo e pode ter alterações significativas até o lançamento da v1. No entanto, estamos fazendo o possível para não quebrar as coisas, a menos que haja um bom motivo.
Este projeto foi inspirado em projetos e ideias de Umputun