RegistryAdmin adalah alat UI registri buruh pelabuhan yang memungkinkan pengguna mengelola akses dan entri registri Docker pribadi. Ini menyediakan antarmuka pengguna berbasis web untuk mengelola repositori, gambar, dan akses pengguna, dan memungkinkan pengguna untuk mengautentikasi menggunakan password
. Tujuan utama dari proyek ini adalah untuk menyediakan API tingkat tinggi untuk mengelola akses pengguna ke registri pribadi, dan untuk membatasi tindakan pengguna (seperti push dan pull) untuk repositori tertentu berdasarkan gambar registri Docker pribadi resmi. Hal ini dapat berguna bagi pemilik registri yang ingin memiliki kontrol lebih besar atas registri mereka dan ingin mengelola akses ke registri dengan lebih mudah.
Antarmuka pengguna web dibuat dengan kerangka React-Admin dan komponen MUI.
pull
/ push
) untuk skema otentikasi token
) RegistryAdmin adalah alat yang bekerja bersama dengan registri Docker pribadi dan menggunakan API V2 registri untuk berkomunikasi dengannya. Ini memiliki titik akhir HTTP yang digunakan untuk mengautentikasi pengguna menggunakan token dan untuk memeriksa hak akses mereka. Untuk menggunakan RegistryAdmin dengan registri, registri harus dikonfigurasi untuk mendukung autentikasi berbasis token. Hal ini memungkinkan pengguna untuk diberikan atau dibatasi aksesnya ke tindakan tertentu (seperti pull
atau push
) berdasarkan token autentikasi mereka.
# 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
Anda dapat menggunakan skema otentikasi htpasswd
, tetapi dengan metode ini Anda hanya dapat mengelola pengguna dan tidak membatasi akses ke repositori oleh pengguna tertentu. Fitur ini hanya tersedia ketika menggunakan otentikasi berbasis token.
Untuk meningkatkan pengalaman pengguna dengan fitur seperti pengurutan, pencarian, dan pelengkapan otomatis, RegistryAdmin memiliki sistem penyimpanan tertanam yang menyinkronkan dengan data di registri. Hal ini diperlukan untuk menghindari batasan API pencarian (katalog) yang diekspos oleh API registri, karena fungsi pencarian hanya mengizinkan penomoran halaman dengan kursor dan tidak mendukung pencarian berdasarkan entri repositori. Aplikasi ini juga menyertakan pengumpul sampah internal untuk memeriksa konsistensi data di penyimpanan tertanam.
Untuk mengetahui perubahan pada registri, Anda harus mengonfigurasi pemberitahuan registri untuk dikirim ke aplikasi 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
Akses ke UI RegistryAdmin berdasarkan peran pengguna:
Admin
- hak penuh untuk membaca dan menulis untuk pengguna, akses dan entri repositori.Manager
- hak terbatas untuk menelusuri daftar akses dan entri repositori.User
- hanya dapat menelusuri entri repositori yang ditetapkan.RegistryAdmin didistribusikan sebagai biner mandiri kecil serta gambar buruh pelabuhan. Biner mendukung banyak arsitektur dan beberapa sistem operasi, termasuk linux_x86_64, linux_arm64, linux_arm, macos_x86_64, macos_arm64 dan windows_x86_64. Gambar Docker mendukung arsitektur linux_x86_64, linux_arm64 dan linux_arm.
Versi stabil terbaru memiliki tag buruh pelabuhan :vX.YZ (dengan alias terbaru) dan master saat ini memiliki tag :master.
Untuk memulai, Anda perlu menyiapkan parameter yang diperlukan dalam file penulisan buruh pelabuhan atau menggunakan flag baris perintah. Anda dapat menemukan berbagai contoh konfigurasi di folder _examples.
Saat Anda memulai RegistryAdmin sebagai wadah buruh pelabuhan, Anda harus menetapkan izin untuk pengguna folder aplikasi ( certs
, config
, data
) dengan UID 1001
. Untuk mengganti UID di dalam sebuah wadah, Anda harus menggunakan variabel lingkungan dalam parameter awal wadah APP_UID
.
chown -R 1001:1001 {root-registry-admin-folder}
hostname
- tentukan nama host atau alamat IP untuk disertakan dalam header AllowedOrigins
yang digunakan untuk memeriksa permintaan CORS
port
- tentukan port yang akan digunakan aplikasi untuk mendengarkan permintaan HTTP (defaultnya adalah 80). Catatan: Jika Anda memulai aplikasi sebagai container Docker, hanya port 80
dan 443
yang ditampilkan di dalam container.
store.type
- menentukan jenis penyimpanan untuk menyimpan data utama (pengguna, akses, repositori). Bawaan ( embed
)
Now implement embed storage type only
store.admin_password
- mengganti kata sandi admin default saat penyimpanan dibuat pertama kali (kata sandi default: admin
)store.embed.path
- tentukan nama jalur untuk file penyimpanan yang disematkan (default: ./data.db
) registry.host
- menentukan host utama atau alamat IP dari instance registri pribadi dengan awalan skema protokol.
example: host: https://{registry-host}
registry.port
- port dari instance registri buruh pelabuhan pribadi (default: 5000
)registry.auth_type
- mendefinisikan tipe otentikasi token
atau basic
(default: token
).issuer
- nama penerbit yang diperiksa di dalam registri, nama penerbit harus sama di registri buruh pelabuhan pribadi dan Admin Registri.service
- nama layanan yang ditentukan dalam pengaturan registri, nama layanan harus sama di registri buruh pelabuhan pribadi dan Admin Registri. ❗ Ingatlah bahwa opsi certs
yang diperlukan jenis autentikasi token
harus ditentukan.
registry.certs.path
- direktori root tempat sertifikat penandatanganan token akan dibuat dan disimpanregistry.certs.key
- jalur ke kunci pribadi untuk penandatanganan tokenregistry.certs.public_key
- jalur ke kunci publik untuk memverifikasi tanda tokenregistry.certs.ca
- jalur ke bundel otoritas sertifikatregistry.certs.fqdns
- FQDN diperlukan untuk menambahkan sertifikat registri dan pemeriksaan berdasarkan permintaan dari klienregistry.certs.ip
- alamat IP akan ditambahkan ke bidang ekstensi sertifikat (SAN). Jika dihilangkan, kesalahan sertifikat dapat terjadi. Sertifikat akan dihasilkan secara otomatis jika registry.certs.path
valid dan direktori kosong. Jika opsi certs
tidak ditentukan, sertifikat akan dibuat di direktori home pengguna di sub folder .registry-certs
:
~/.registry-certs/
registry_auth.key
registry_auth.pub
registry_auth_ca.crt
Pemberitahuan: ketika sertifikat yang ditandatangani sendiri digunakan, Anda harus mengonfigurasi Mesin Docker pada host klien agar dapat bekerja dengan sertifikat tersebut.
# https://docs.docker.com/config/daemon/
# /etc/docker/daemon.json (Linux)
# C:ProgramDatadockerconfigdaemon.json (Windows)
{
...
"insecure-registries": ["{registry-host}:{port}"],
...
}
Sertifikat yang dihasilkan untuk token registri juga dapat digunakan untuk HTTP TLS/SSL. Sertifikat itu secara otomatis ditambahkan ke CA tepercaya. Namun jika Anda menggunakan sertifikat lain untuk akses HTTPS, Anda harus menambahkannya ke kumpulan CA tepercaya. Untuk itu gunakan opsi
--registry.https-certs
untuk menentukan jalur ke sertifikat bekas yang digunakan untuk akses TLS/SSL. Ini juga diperlukan untuk sertifikat yang diterbitkan oleh Let's Encrypt. Selain itu, Anda dapat menentukan opsi --registry.https-insecure
untuk melewati pemeriksaan sertifikat tepercaya, tetapi TIDAK DIANJURKAN.
# in a registry-admin config
registry :
...
certs :
...
https_cert : /{path-to-ssl}/cert.pem
...
Perlu diingat jika Anda menggunakan mode ssl auto
, Anda harus menentukan opsi --ssl.acme-location
untuk menyimpan cache ACME. Maka tanggal cache harus ditentukan dalam konfigurasi registry
di opsi letsencrypt:
letsencrypt :
cachefile : /path/to/cache-file
email : [email protected]
hosts : [you-registry.domain.org]
Hanya registri V2 yang didukung. Untuk menggunakan registri buruh pelabuhan dengan otentikasi token, Anda perlu mengonfigurasinya sebagai manajer kontrol akses mandiri untuk sumber daya yang dihosting oleh layanan lain yang ingin mengautentikasi dan mengelola otorisasi menggunakan manajer kontrol akses terpisah. Untuk mendapatkan informasi lebih lanjut tentangnya, ikuti dokumentasi resminya.
Pada awalnya, Anda perlu menentukan opsi auth
untuk autentikasi token
dan mengatur certificate
dan key
tertentu yang dihasilkan dengan aplikasi RegistryAdmin. Opsi token harus sama dengan opsi yang ditentukan RegistryAdmin Registry
( issuer
, service
, cert_ca
). Aplikasi RegistryAdmin memiliki titik akhir publik untuk mengautentikasi permintaan pengguna ke registri, yang harus digunakan dalam opsi registri realm
.
https://{registry-admin-host}:{port}/api/v1/auth
❗ realm
adalah opsi alamat IP atau instance Hostname RegistryAdmin yang harus dapat diakses oleh klien buruh pelabuhan yang menggunakannya untuk mengautentikasi ke registri pribadi.
auth :
token :
realm : http://{registry-admin-hostname}/api/v1/registry/auth
service : container_registry
issuer : registry_token_issuer
rootcertbundle : /certs/cert.crt
Untuk menangani peristiwa registri dan memicu tugas repositori (seperti menambah baru, memperbarui, atau menghapus entri repositori), Anda harus menyiapkan opsi pemberitahuan registri:
url
- url http(s) ke host RegistryAdmin dengan jalur titik akhir acara.
Authorization
setiap pengguna yang diaktifkan dan terdaftar serta kata sandinya di aplikasi RegistryAdmin, yang dikodekan dalam 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
opsi basic
menggunakan file .htpasswd
dan tidak mendukung pembatasan akses ke repositori tertentu. Untuk menggunakan otentikasi basic
, Anda memerlukan opsi berikut:
login
- nama pengguna untuk akses ke registri buruh pelabuhanpassword
- kata sandi untuk akses ke registri buruh pelabuhan Registri Docker membaca file .htpasswd
setiap kali saat mengautentikasi panggilan dan tidak memerlukan restart layanan registri setelah pengguna memperbarui atau menghapus di RegistryAdmin
Secara default, tidak ada log permintaan yang dibuat. Ini dapat diaktifkan dengan mengatur --logger.enabled
. Log (diputar otomatis) memiliki Format Log Gabungan Apache
Pengguna juga dapat mengaktifkan log masuk stdout dengan --logger.stdout
. Ini tidak akan mempengaruhi pencatatan file di atas tetapi akan menampilkan beberapa informasi minimal tentang permintaan yang diproses, seperti ini:
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
Ketika RegistryAdmin memiliki akses dari Internet, Anda harus menyiapkan aturan keamanan minimal untuk mencegah kekerasan kata sandi. Cara paling sederhana menggunakan layanan fail2ban
dengan akses file log pada host buruh pelabuhan.
access.log
untuk layanan 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
dengan aturan untuk layanan registry-admin
yang menangani kesalahan 401
dan 403
auth/z # /etc/fail2ban/filter.d/registry-admin.conf
[Definition]
failregex = ^<HOST> .+" 40[1,3] d+ .*$
ignoreregex =
fail2ban
pada pernyataan rantai, karena lalu lintas sistem normal biasanya muncul di rantai INPUT
, sedangkan lalu lintas kontainer Docker dikirim melalui rantai 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
dengan aturan 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
Setiap opsi dapat disediakan dalam tiga bentuk: baris perintah, kunci lingkungan: pasangan nilai, atau file konfigurasi (format json
atau yaml
). Opsi baris perintah hanya memiliki bentuk yang panjang, seperti --hostname=localhost. Kunci lingkungan (nama) terdaftar untuk setiap opsi sebagai sufiks, yaitu [$HOSTNAME].
File konfigurasi diperbolehkan dalam format json
dan 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
lokal Anda harus menjalankan RegistryAdmin dengan variabel lingkungan yang ditentukan RA_DEV_HOST=http://127.0.0.1:3000
untuk mencegah kesalahan CORS
di browser. Juga .env.development
harus berisi nama host pengembangan RegistryAdmin yang valid.engine
dan dapat digunakan untuk memperluas jenis penyimpanan yang didukungEmbed
menggunakan database SQLite
dan CGO
yang diperlukan diaktifkanProyek ini sedang dalam pengembangan aktif dan mungkin mengalami perubahan besar hingga v1 dirilis. Namun, kami berusaha semaksimal mungkin untuk tidak merusak barang kecuali ada alasan kuat.
Proyek ini terinspirasi oleh proyek dan ide Umputun