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-stream
Acesso à 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.crt
Para 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.conf
jail
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