
واحدة من المشاكل المزعجة التي تنشأ عند إنشاء NAS ، هو أنه لا يمكن لجميع البرامج العمل مع LDAP ، وبعضها لا يحتوي على آليات المصادقة.
الحل هو مصادقة شاملة من خلال وكيل عكسي.
تتم مناقشة مثال حول كيفية القيام بذلك بتفصيل كبير ، على سبيل المثال ، في هذه المقالة .
نظرًا لأن هذا المقال جزء من دورة NAS ،
هنا سأركز على كيفية تكييف هذا الحل مع الخدمات في حاويات Docker.
يعتمد الحل على مثال تطبيق المصادقة من خلال وكيل Nginx LDAP Auth خارجي ، لكنني أستخدم الإصدار الموجود في حاوية من LinuxServer.io لأنه صورة جاهزة تلبي معايير معينة.
كانت المشكلة الوحيدة هي أن تصحيحات LinuxServer.io حطمت مصادقة HTTP الأساسية ، ولكن بعد تحميل الإصلاح ، أصبح من الممكن استخدام ذلك مرة أخرى.
المصادقة العامة
كما هو موضح في المقالات ، يتم إجراء المصادقة على النحو التالي:
- يصل العميل إلى الخدمة.
- سيتم إعادة توجيه الوكيل العكسي إذا تم تعيين ملف تعريف ارتباط.
- إذا لم يكن هناك ملف تعريف ارتباط ، يتم تقديم طلب إلى خدمة المصادقة.
- تطلب خدمة المصادقة اسم مستخدم وكلمة مرور ، يتحققان من خلال الوصول إلى خادم LDAP.
- إذا نجحت عملية التحقق ، فإنها تقوم بتعيين ملف تعريف ارتباط وإعادة توجيه إلى الخدمة.

قد يكون البديل هو استخدام وحدة نمطية مترجمة لـ nginx ، لكنني لن أفكر في هذا الخيار هنا نظرًا لوجود بعض المشكلات في هذه الوحدة ونقص مرونتها.
توجد صورة معدلة لخادم OpenLDAP هنا .
مصادقة الحاوية
داخل NAS ، تعمل الخدمات في حاويات ، لذلك هناك رغبة في جعل من الممكن تبديل أوضاع المصادقة ببساطة عن طريق تعيين المتغيرات داخل الحاوية.
هذه الآلية موجودة بالفعل في صورة ngingx-proxy المستخدمة ويتم تنفيذها من خلال القوالب التي تعالج عمليات عامل النقل .
يقوم بإدراج بيانات التعريف في القالب الذي يحتوي على وصف لحاويات Docker التي تعمل حاليًا.
وبالتالي ، كل ما يجب القيام به هو تحسين قالب تكوين الوكيل العكسي بحيث إذا كان هناك متغير شرطي في الحاوية ، فسيتم تضمين إعادة التوجيه إلى خدمة المصادقة الشاملة ، والتي تعمل أيضًا في الحاوية.
ثم ، قم بإجراء التعديلات المناسبة على تكوين عامل التهيئة.
تنفيذ المصادقة
تعديل قالب تكوين nginx-proxy
بادئ ذي بدء ، يتم إضافة upstream جديد ، والذي يسمح لك بالوصول إلى خدمة المصادقة في التكوين:
proxy_cache_path cache/ keys_zone=auth_cache:10m; upstream ldap-backend { server {{ $.Env.LDAP_BACKEND }}:{{ or $.Env.LDAP_LOGIN_PORT "9000" }}; }
يمكن ملاحظة أن خدمة المصادقة تعمل على المضيف ${LDAP_BACKEND}
والميناء ${LDAP_LOGIN_PORT }
، القيمة الافتراضية هي 9000.
سيتم استبدال قيم المتغيرات بواسطة عامل النقل العام بحيث يبدو هذا الجزء من التكوين كما هو في /etc/nginx/conf.d/default.conf
داخل الحاوية:
تقوم الإضافة التالية بتعيين المتغير ext_ldap_auth
إذا تم تغيير المتغير LDAP_EXT_AUTH في حاوية خدمة معينة.
أيضا ، يتم تعيين عدد قليل من المتغيرات لتكوين المصادقة.
{{/* Nginx LDAP authentication enabled */}} {{ $ext_ldap_auth := parseBool (or (first (groupByKeys $containers "Env.LDAP_EXT_AUTH")) "false") }} {{/* User need to be participated in these groups to use service */}} {{ $ldap_add_groups := or (first (groupByKeys $containers "Env.LDAP_EXT_ADD_GROUPS")) "" }} {{/* Use HTML login page or HTTP Basic authentication */}} {{ $ldap_use_login_page := parseBool (or $.Env.LDAP_USE_LOGIN_PAGE "false" ) }}
ويرد أدناه كتلة من الإضافات أدناه. يتم تنشيطه فقط إذا تم ext_ldap_auth
متغير ext_ldap_auth
.
إذا ldap_use_login_page
تعيين ldap_use_login_page
، فسيتم تمكين إعادة التوجيه إلى صفحة المصادقة ، وإلا سيتم استخدام نافذة مصادقة HTTP الأساسية.
المسار /auth-proxy
هو إعادة التوجيه إلى خدمة المصادقة.
سيتم تمرير المعلمات من خلال رؤوس HTTP.
ما المعلمات ولماذا هناك حاجة ، ويرد وصفها بالتفصيل في التعليقات.
قسم LDAP {{ if ($ext_ldap_auth) }}
أخيرًا ، عند تمكين مصادقة LDAP للخدمة ، auth_request
إضافة auth_request
إلى موقعها:
location / { {{ if ($ext_ldap_auth) }} auth_request /auth-proxy; {{ if ($ldap_use_login_page) }}
فيما يلي قائمة كاملة بالقالب.
nginx.tmpl {{ $CurrentContainer := where $ "ID" .Docker.CurrentContainerID | first }} {{ define "upstream" }} {{ if .Address }} {{/* If we got the containers from swarm and this container's port is published to host, use host IP:PORT */}} {{ if and .Container.Node.ID .Address.HostPort }} # {{ .Container.Node.Name }}/{{ .Container.Name }} server {{ .Container.Node.Address.IP }}:{{ .Address.HostPort }}; {{/* If there is no swarm node or the port is not published on host, use container's IP:PORT */}} {{ else if .Network }}
عامل تكوين تكوين التكوين
في docker-compose.yml
أضيفت:
- خدمة جديدة "ldap-auth" ، المسؤولة عن الترخيص.
- كتلة من المتغيرات التي تقوم بتكوين التفاعلات مع خادم LDAP.
ما هو مكتوب في المتغيرات ، سيمر nginx خدمة المصادقة من خلال رؤوس HTTP.
الغرض من المعلمات واضح من الأسماء المتغيرة ، لذلك لن أتناولها.
انظر التكوين الكامل أدناه.
عامل ميناء-compose.yml version: '2' networks: internal: docker0: external: name: docker0 services: ldap-auth: image: linuxserver/ldap-auth:latest container_name: ldap-auth networks: - internal - docker0 environment: - TZ=Europe/Moscow expose: - 8888 - 9000 restart: unless-stopped nginx-proxy: depends_on: - ldap-auth networks: - internal - docker0 restart: always image: jwilder/nginx-proxy ports: - "80:80" - "443:443" volumes: - ./certs:/etc/nginx/certs:ro - ./vhost.d:/etc/nginx/vhost.d - ./html:/usr/share/nginx/html - /var/run/docker.sock:/tmp/docker.sock:ro - ./local-config:/etc/nginx/conf.d - ./nginx.tmpl:/app/nginx.tmpl environment: - DEFAULT_HOST=nas.nas - LDAP_BACKEND=ldap-auth #- LDAP_BACKEND_PORT=8888 #- LDAP_LOGIN_PORT=9000 - LDAP_HOST=ldap://172.21.0.1:389 #- LDAP_METHOD=start_tls - LDAP_METHOD=plain - LDAP_UID=uid - LDAP_PASS=LDAP_PASSWORD - LDAP_BASE=ou=users,dc=nas,dc=nas - LDAP_BIND_DN=cn=readonly,dc=nas,dc=nas - LDAP_USER_FILTER=(uid=%(username)s) #- LDAP_USE_LOGIN_PAGE=true labels: - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true" letsencrypt-dns: image: adferrand/letsencrypt-dns restart: always volumes: - ./certs/letsencrypt:/etc/letsencrypt environment: - "LETSENCRYPT_USER_MAIL=MAIL@MAIL.COM" - "LEXICON_PROVIDER=cloudns" - "LEXICON_OPTIONS=--delegated NAS.cloudns.cc" - "LEXICON_PROVIDER_OPTIONS=--auth-id=CLOUDNS_ID --auth-password=CLOUDNS_PASSWORD"
استخدام عن طريق الخدمة
يتم إيقاف تشغيل المصادقة الشاملة بشكل افتراضي.
لتمكينه ، يكفي تعيين المتغيرات في بيئة الحاوية المطلوبة:
LDAP_EXT_AUTH=true
- تمكين المصادقة.LDAP_EXT_ADD_GROUPS=(memberOf=cn=users_cloud,ou=groups,dc=nas,dc=nas)
- مرشح اختياري ، قائمة بالمجموعات التي يجب أن ينتمي إليها المستخدم من أجل المصادقة. هذا يوفر الدعم إذن.
environment: - LDAP_EXT_AUTH=true - LDAP_EXT_ADD_GROUPS=(memberOf=cn=users_cloud,ou=groups,dc=nas,dc=nas)
استنتاج
بشكل عام ، كان الحل يعمل لفترة طويلة ويوفر ليس فقط المصادقة ، ولكن أيضًا التفويض.
يتيح لك ذلك استخدام أي خدمات في حاويات في NAS ، بغض النظر عما إذا كانت تدعم المصادقة من خلال LDAP.
رغم وجود بعض المشاكل:
- HTML ,
ldap_use_login_page
. . — . - . LDAP , , docker-gen .
- , . , , , . .
NAS .