RegistryAdmin — это инструмент пользовательского интерфейса реестра Docker, который позволяет пользователям управлять доступом и записями частного реестра Docker. Он предоставляет пользовательский веб-интерфейс для управления репозиториями, изображениями и доступом пользователей, а также позволяет пользователям проходить аутентификацию с использованием любого password
. Основная цель проекта — предоставить высокоуровневый API для управления доступом пользователей к частному реестру и ограничить действия пользователей (такие как push и pull) для определенных репозиториев на основе официального образа частного реестра Docker. Это может быть полезно для владельцев реестров, которые хотят иметь больший контроль над своим реестром и упростить управление доступом к нему.
Веб-интерфейс пользователя, созданный с использованием платформы React-Admin и компонентов MUI.
pull
/ push
) для схемы аутентификации token
) RegistryAdmin — это инструмент, который работает совместно с частным реестром Docker и использует API реестра V2 для связи с ним. Он имеет конечную точку 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
Доступ к пользовательскому интерфейсу администратора реестра в зависимости от роли пользователя:
Admin
— полные права на чтение и запись для пользователей, доступ и запись в репозитории.Manager
— ограниченные права на просмотр списка доступа и записей репозиториев.User
— может просматривать только записи назначенных репозиториев.RegistryAdmin распространяется в виде небольшого автономного двоичного файла, а также образа докера. Двоичная поддержка нескольких архитектур и нескольких операционных систем, включая linux_x86_64, linux_arm64, linux_arm, macos_x86_64, macos_arm64 и windows_x86_64. Образ Docker поддерживает архитектуры linux_x86_64, linux_arm64 и linux_arm.
Последняя стабильная версия имеет тег docker :vX.YZ (с псевдонимом :latest), а текущий мастер имеет тег :master.
Чтобы начать работу, вам нужно будет настроить необходимые параметры в файле docker-compose или с помощью флагов командной строки. Различные примеры конфигурации вы можете найти в папке _examples.
Когда вы запускаете RegistryAdmin как Docker-контейнер, вы должны установить разрешения для пользователей папок приложений ( certs
, config
, data
) с UID 1001
. Для переопределения UID внутри контейнера вы должны использовать переменную среды в стартовых параметрах контейнера APP_UID
.
chown -R 1001:1001 {root-registry-admin-folder}
hostname
— определите имя хоста или IP-адрес для включения в заголовок AllowedOrigins
, который используется для проверки запросов CORS
.
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
— порт частного экземпляра реестра докера (по умолчанию: 5000
)registry.auth_type
— определяет тип аутентификации token
или basic
(по умолчанию: token
).issuer
— имя эмитента, который проверяет внутри реестра, имя эмитента должно совпадать в частном реестре докера и RegistryAdmin.service
— имя службы, определенное в настройках реестра, имя службы должно совпадать в частном реестре докеров и в RegistryAdmin. ❗ Помните, что для типа аутентификации token
необходимо определить необходимые параметры certs
.
registry.certs.path
— корневой каталог, в котором будут генерироваться и храниться сертификаты для подписи токенов.registry.certs.key
— путь к закрытому ключу для подписи токенаregistry.certs.public_key
— путь к открытому ключу для проверки знака токена.registry.certs.ca
— путь к пакету центра сертификацииregistry.certs.fqdns
— полные доменные имена, необходимые для добавления сертификата реестра и проверки по запросу клиентов.registry.certs.ip
— IP-адрес будет добавлен в поле расширения сертификата (SAN). Если он опущен, может возникнуть ошибка сертификата. Сертификаты будут созданы автоматически, если registry.certs.path
действителен, а каталог пуст. Если параметры certs
не определены, сертификаты будут созданы в домашнем каталоге пользователя в подпапке .registry-certs
:
~/.registry-certs/
registry_auth.key
registry_auth.pub
registry_auth_ca.crt
Примечание: при использовании самозаверяющих сертификатов необходимо настроить Docker Engine на клиентском хосте для работы с ними.
# https://docs.docker.com/config/daemon/
# /etc/docker/daemon.json (Linux)
# C:ProgramDatadockerconfigdaemon.json (Windows)
{
...
"insecure-registries": ["{registry-host}:{port}"],
...
}
Сертификаты, созданные для токена реестра, также можно использовать для HTTP TLS/SSL. Этот сертификат автоматически добавляется в доверенный центр сертификации. Но если вы используете другой сертификат для доступа по HTTPS, вам следует добавить его в пул доверенных центров сертификации. Для этого используйте опцию
--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, вы должны определить опцию --ssl.acme-location
для кэша ACME хранилища. Затем дату кэша следует определить в конфигурации registry
в опции letsencrypt:
letsencrypt :
cachefile : /path/to/cache-file
email : [email protected]
hosts : [you-registry.domain.org]
Поддерживается только реестр V2. Для использования реестра Docker с аутентификацией по токену вам необходимо настроить его как автономный диспетчер контроля доступа для ресурсов, размещенных другими службами, которые хотят проходить аутентификацию и управлять авторизацией с помощью отдельного диспетчера контроля доступа. Чтобы получить дополнительную информацию об этом, перейдите к официальной документации.
Сначала вам нужно определить параметр auth
для аутентификации token
и установить конкретный certificate
и key
, сгенерированные с помощью приложения RegistryAdmin. Параметры токена должны совпадать с параметрами, определенными RegistryAdmin Registry
( issuer
, service
, cert_ca
). Приложение RegistryAdmin имеет общедоступную конечную точку для аутентификации запросов пользователей к реестру, которую необходимо использовать в опции реестра realm
.
https://{registry-admin-host}:{port}/api/v1/auth
❗ realm
— это вариант IP-адреса или экземпляра RegistryAdmin имени хоста , который должен быть доступен для клиентов Docker, которые используют его для аутентификации в частном реестре.
auth :
token :
realm : http://{registry-admin-hostname}/api/v1/registry/auth
service : container_registry
issuer : registry_token_issuer
rootcertbundle : /certs/cert.crt
Для обработки событий реестра и запуска задач репозитория (например, добавления новой, обновления или удаления записи репозитория) вам необходимо настроить параметры уведомления реестра:
url
— http(s) URL-адрес хоста RegistryAdmin с путем к конечной точке событий.
Authorization
любого включенного и зарегистрированного пользователя и его пароль в приложении RegistryAdmin, закодированный в 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
вариант с использованием файла .htpasswd
и не поддерживает ограничение доступа к определенным репозиториям. Для использования basic
аутентификации вам необходимы следующие параметры:
login
— имя пользователя для доступа к реестру докеровpassword
— пароль для доступа к реестру докеров Реестр Docker читает файл .htpasswd
каждый раз при проверке подлинности вызова и не требует перезапуска службы реестра после обновления или удаления пользователя в RegistryAdmin.
По умолчанию журнал запросов не создается. Это можно включить, установив --logger.enabled
. Журнал (с автоматическим поворотом) имеет комбинированный формат журнала Apache.
Пользователь также может включить вход в систему стандартного вывода с помощью --logger.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 имеет доступ из Интернета, вам следует минимально настроить правила безопасности для предотвращения подбора пароля. Самый простой способ использовать службу fail2ban
с файлом журнала доступа на хосте докера.
access.log
для службы 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
с правилом для службы registry-admin
, которая обрабатывает ошибки 401
и 403
auth/z. # /etc/fail2ban/filter.d/registry-admin.conf
[Definition]
failregex = ^<HOST> .+" 40[1,3] d+ .*$
ignoreregex =
fail2ban
в операторе Chain, поскольку обычный системный трафик традиционно попадает в цепочку INPUT
, а трафик Docker-контейнера отправляется через цепочку 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
с правилом 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
Каждый параметр может быть предоставлен в трех формах: командная строка, пара ключ:значение среды или файл конфигурации (форматы json
или yaml
). Параметры командной строки имеют только длинную форму, например --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
вам следует запустить RegistryAdmin с определенной переменной среды RA_DEV_HOST=http://127.0.0.1:3000
чтобы предотвратить ошибку CORS
в браузере. Также .env.development
должен содержать допустимое имя хоста разработки RegistryAdmin.engine
и может использоваться для расширения поддерживаемого типа хранилища.Embed
использует базу данных SQLite
и требует включения CGO
Проект находится в активной разработке и может иметь критические изменения до выхода v1. Однако мы изо всех сил стараемся не ломать вещи, если на то нет веской причины.
Этот проект был вдохновлен проектами и идеями Умпутуна.