RegistryAdmin هي أداة واجهة مستخدم تسجيل Docker التي تتيح للمستخدمين إدارة الوصول وإدخالات سجل Docker الخاص. وهو يوفر واجهة مستخدم قائمة على الويب لإدارة المستودعات والصور ووصول المستخدم، ويسمح للمستخدمين بالمصادقة باستخدام أي من password
. الهدف الرئيسي للمشروع هو توفير واجهة برمجة تطبيقات عالية المستوى لإدارة وصول المستخدم إلى سجل خاص، وتقييد إجراءات المستخدم (مثل الدفع والسحب) لمستودعات محددة بناءً على صورة سجل Docker الخاص الرسمي. يمكن أن يكون هذا مفيدًا لأصحاب التسجيل الذين يريدون الحصول على مزيد من التحكم في السجل الخاص بهم والذين يريدون أن يكونوا قادرين على إدارة الوصول إليه بسهولة أكبر.
تم إنشاء واجهة مستخدم الويب باستخدام إطار عمل React-Admin ومكونات MUI.
pull
/ push
) لنظام مصادقة token
) RegistryAdmin هي أداة تعمل جنبًا إلى جنب مع سجل Docker الخاص وتستخدم واجهة برمجة التطبيقات 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 على نظام تخزين مضمن يتزامن مع البيانات الموجودة في السجل. يعد ذلك ضروريًا لتجنب حدود واجهة برمجة تطبيقات البحث (الكتالوج) التي تعرضها واجهة برمجة تطبيقات التسجيل، حيث أن وظيفة البحث تسمح فقط بترقيم الصفحات باستخدام المؤشر ولا تدعم البحث عن طريق إدخال المستودع. يتضمن التطبيق أيضًا أداة تجميع البيانات المهملة الداخلية للتحقق من تناسق البيانات في وحدة التخزين المدمجة.
للحصول على تغييرات الالتقاط في السجل، يجب عليك تكوين إشعار التسجيل ليتم إرساله إلى تطبيق 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
الوصول إلى واجهة مستخدم RegistryAdmin استنادًا إلى دور المستخدمين:
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.
يحتوي أحدث إصدار ثابت على: علامة عامل الإرساء vX.YZ (مع: أحدث الاسم المستعار) والنسخة الرئيسية الحالية تحتوي على: العلامة الرئيسية.
للبدء، ستحتاج إلى إعداد المعلمات المطلوبة في ملف إنشاء عامل إرساء أو باستخدام إشارات سطر الأوامر. يمكنك العثور على أمثلة تكوين متنوعة في المجلد _examples.
عند بدء تشغيل RegistryAdmin كحاوية عامل إرساء، يجب عليك تعيين الإذن لمستخدم مجلدات التطبيق ( 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. ❗ انتبه إلى ضرورة تحديد خيارات certs
المطلوبة لنوع المصادقة token
.
registry.certs.path
- الدليل الجذر حيث سيتم إنشاء الشهادات وتخزينها لتوقيع الرمز المميزregistry.certs.key
- المسار إلى المفتاح الخاص لتوقيع الرمز المميزregistry.certs.public_key
- المسار إلى المفتاح العام للتحقق من علامة الرمز المميزregistry.certs.ca
- المسار إلى حزمة المرجع المصدقregistry.certs.fqdns
- FQDN (s) المطلوبة للإضافة لشهادة التسجيل والفحوصات بناءً على طلب من العملاءregistry.certs.ip
- سيتم إضافة عنوان IP إلى حقل ملحق الشهادة (SANs). إذا تم حذفه يمكن أن يحدث خطأ في الشهادة. سيتم إنشاء الشهادات تلقائيًا إذا كان 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. تتم إضافة هذه الشهادة تلقائيًا إلى المرجع المصدق (CA) الموثوق به. ولكن إذا كنت تستخدم شهادة أخرى للوصول إلى HTTPS، فيجب عليك إضافتها إلى تجمع CA الموثوق به. لذلك استخدم الخيار
--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
...
ضع في اعتبارك أنه إذا كنت تستخدم وضع ssl auto
، فيجب عليك تحديد خيار --ssl.acme-location
لتخزين ذاكرة التخزين المؤقت لـ ACME. ثم يجب تحديد تاريخ ذاكرة التخزين المؤقت في تكوين registry
في خيار Letsencrypt:
letsencrypt :
cachefile : /path/to/cache-file
email : [email protected]
hosts : [you-registry.domain.org]
التسجيل المدعوم V2 فقط. لاستخدام سجل عامل الإرساء مع مصادقة الرمز المميز، تحتاج إلى تكوينه كمدير مستقل للتحكم في الوصول للموارد التي تستضيفها الخدمات الأخرى التي ترغب في مصادقة وإدارة الترخيص باستخدام مدير تحكم وصول منفصل. للحصول على مزيد من المعلومات حول هذا الموضوع، اتبع الوثائق الرسمية.
في البداية، تحتاج إلى تحديد خيار auth
لمصادقة token
وتعيين certificate
key
محددين تم إنشاؤهما باستخدام تطبيق RegistryAdmin. يجب أن تكون خيارات الرمز المميز هي نفسها خيارات Registry
المحددة لـ RegistryAdmin ( issuer
، service
، cert_ca
). يحتوي تطبيق RegistryAdmin على نقطة نهاية عامة لمصادقة طلبات المستخدمين للتسجيل، والتي يجب استخدامها في خيار التسجيل realm
.
https://{registry-admin-host}:{port}/api/v1/auth
❗ realm
هو خيار عنوان IP أو مثيل Hostname RegistryAdmin الذي يجب أن يصل إليه عملاء عامل الإرساء الذين يستخدمونه للمصادقة على السجل الخاص.
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 المدمج
يمكن للمستخدم أيضًا تشغيل تسجيل الدخول stdout باستخدام --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
في بيان السلسلة، لأن حركة مرور النظام العادية تأتي عادةً عبر سلسلة 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
المشروع قيد التطوير النشط وقد يتضمن تغييرات جذرية حتى يتم إصدار الإصدار الأول. ومع ذلك، فإننا نبذل قصارى جهدنا لعدم كسر الأشياء ما لم يكن هناك سبب وجيه.
هذا المشروع مستوحى من مشاريع وأفكار أومبوتون