تكامل LDAP

هيّئ اتحاد LDAP أو Active Directory لـ IBM Bob ذاتي الاستضافة باستخدام المورد المخصص BobIDP والأمر bobctl configure-idp.

استخدم bobctl configure-idp لربط بيئة LDAP أو Active Directory بـ Keycloak كموفر اتحاد مستخدمين. يمكنك إتمام هذا الإعداد أثناء التثبيت أو في أي وقت بعد النشر.

قبل البدء

قبل تكوين اتحاد LDAP، تأكد من استيفاء المتطلبات التالية:

  • مجموعة OpenShift Container Platform (OCP) لها اتصال شبكي بخادم LDAP على المنفذ المناسب:
    • 389 لـ ldap://
    • 636 لـ ldaps://
  • حساب خدمة (bind DN) يملك وصول القراءة للدليل متاح، أو خادم LDAP مُكوَّن للسماح بالربط المجهول.
  • إذا كنت تستخدم ldaps:// مع مرجع مصادقة (CA) خاص أو موقَّع داخليًا، احصل على شهادة CA لخادم LDAP بتنسيق PEM.
  • أداة سطر الأوامر bobctl مثبَّتة، وoc مُكوَّنة ومصادَق عليها مقابل المجموعة المستهدفة.

مرجع ملف التكوين

أنشئ ملف تكوين IDP من القالب المقدَّم قبل تسجيل موفر LDAP.

cp config-idp-template.yaml my-idp.yaml

يتضمن ملف التكوين قسمين: حقول المستوى الأعلى التي تنطبق على النشر بأكمله، وقائمة ldaps الاختيارية التي يصف كل مدخل فيها موفر اتحاد LDAP واحدًا.

حقول المستوى الأعلى

الحقلمطلوبالوصف
domainsنعمقائمة نطاقات البريد الإلكتروني التي يقبلها Bob عند تسجيل الدخول. يؤدي إزالة نطاق إلى إلغاء تسجيله؛ لن يتمكن المستخدمون الذين يملكون هذا النطاق من تسجيل الدخول.
adminEmailsلاقائمة عناوين بريد المستخدمين الذين سيُمنحون وصول مسؤول Bob. يُحدّث المُشغِّل مجموعة bob-admins في Keycloak وقاعدة بيانات مسؤولي Bob بصورة ذرية.
ldapsلاقائمة تكوينات موفري اتحاد LDAP. احذفها بالكامل للنشرات التي تستخدم مستخدمي Keycloak المباشرين فقط.

الحقول المطلوبة (لكل مدخل موفر LDAP)

الحقلالوصف
nameمعرّف فريد ووصفي لموفر LDAP. يجب أن يكون لكل موفر مُكوَّن اسم مميز.
vendorيُحدد نوع دليل LDAP للتكامل معه. القيم المدعومة: other (OpenLDAP والمتوافق مع LDAPv3)، ad (Microsoft Active Directory)، rhds (Red Hat Directory Server)، tivoli (IBM Security Directory Server)، edirectory (NetIQ eDirectory).
connectionUrlعنوان URL الكامل لخادم LDAP، بما فيه البروتوكول (ldap:// أو ldaps://) واسم المضيف ورقم المنفذ.
usersDnموقع الدليل الذي تُخزَّن فيه حسابات المستخدمين ومنه تُبحث مدخلات المستخدمين وتُستورد.
usernameLDAPAttributeسمة الدليل التي يوفرها المستخدمون كاسم مستخدم عند المصادقة.
rdnLDAPAttributeسمة الدليل المستخدمة لتعريف المدخلات ضمن هيكل الدليل. في معظم التكوينات، تكون مماثلة لـ usernameLDAPAttribute.
uuidLDAPAttributeسمة دليل فريدة ومستقرة وغير متغيرة تُستخدم لتعريف كل حساب مستخدم بشكل دائم.
userObjectClassesقائمة مفصولة بفواصل من فئات كائنات LDAP التي تُعرّف مدخلات الدليل التي تُعرَّف وتُعالَج كحسابات مستخدمين.
مهم:

حقل domains هو الطريقة الوحيدة لتكوين التوجيه المستند إلى النطاق في عمليات النشر المحلية. لا تُكوّن النطاقات من خلال واجهة مستخدم إدارة Bob لأن ذلك ليس الطريقة الصحيحة ويمكن أن يُسبب أخطاء مصادقة.

الحقول الاختيارية (لكل مدخل موفر LDAP)

الحقلالوصف
bindDnDN لحساب الخدمة المستخدم للمصادقة والاتصال بالدليل. يمكن حذفه إذا كان الدليل يسمح بوصول الربط المجهول.
bindPasswordSecretاسم Secret موجود مسبقًا يحتوي على كلمة مرور حساب الربط. يجب إنشاؤه في فضاء اسم المنشأة قبل تشغيل bobctl configure-idp.
useTruststoreSpiيُحدد متى تُستخدم شهادة CA لـ LDAP للتحقق من الخادم. القيم: always (افتراضي، لشهادات CA الخاصة أو المُصدَرة داخليًا)، ldapsOnly (لشهادات CA الموثوقة عمومًا)، never (عند الاتصال عبر ldap:// غير المؤمَّن).
ldapsCACertSecretاسم Secret موجود مسبقًا يحتوي على شهادة CA لخادم LDAP بتنسيق PEM. يجب إنشاؤه في فضاء اسم المنشأة قبل تشغيل bobctl configure-idp.
searchScopeيُحدد عمق عمليات بحث الدليل. 2 يبحث في جميع الحاويات والأشجار الفرعية (افتراضي)؛ 1 يقصر البحث على المدخلات الفرعية المباشرة فقط.
customUserSearchFilterمرشح إضافي يُطبَّق على جميع عمليات بحث المستخدمين، مثلًا لاستبعاد حسابات الخدمة أو تقييد البحث على أنواع مستخدمين محددة.
userSync.enabledعند التعيين إلى true، يُستورد جميع المستخدمين عند التكوين الأولي للموفر، وتُزامَن تغييرات الدليل اللاحقة كل خمس دقائق. موصى به لمعظم عمليات النشر.
userAttributeMappingsيُعرّف كيفية تعيين سمات الدليل لحقول ملف مستخدم Bob، مثل email وfirstName وlastName.
priorityيُحدد الترتيب الذي تُقيَّم فيه الموفرون عند تكوين موفرين متعددين. تُفحص الموفرون ذوو القيم المنخفضة أولًا. الافتراضي هو 0.
groupMapperيُزامن مجموعات LDAP في Keycloak. راجع تكوين مزامنة مجموعات LDAP.

سلوك مزامنة المستخدمين

عند تعيين userSync.enabled إلى true، يُجري Bob استيرادًا لمرة واحدة لجميع المستخدمين عند تسجيل موفر LDAP. بعد اكتمال الاستيراد الأولي، تُعالَج مزامنة دورة حياة المستخدمين المستمرة تلقائيًا عبر SCIM.

تلميح:

لأدلة LDAP الكبيرة، فكّر في ترك userSync.enabled معيَّنًا إلى false والسماح بتوفير المستخدمين عند تسجيل دخولهم الأول. يمكن أن يُقلل هذا النهج من الوقت اللازم لتسجيل موفر LDAP.

تكوين مزامنة مجموعات LDAP

استخدم تكوين groupMapper الاختياري لمزامنة مجموعات LDAP مع Keycloak. مع مزامنة المجموعات، يُستورد المستخدمون وعضوياتهم في المجموعات المُعرَّفة في دليل LDAP من خلال Keycloak وتُدار عبره.

المعامل groupsDn مطلوب. جميع المعاملات الأخرى اختيارية ويمكن تخصيصها لتتناسب مع مخطط دليل LDAP وهيكل مجموعته.

قيد:

مجموعتا bob-admins وbob-users هما مجموعتان تُديرهما المنصة. وهما غير مضمَّنتين في مزامنة مجموعات LDAP.

المعاملالقيمة الافتراضيةالوصف
groupsDnمطلوباسم DN الأساسي المميز الذي يحتوي على مدخلات مجموعة LDAP.
namegroupsالاسم المعروض لمحوّل المجموعة في Keycloak.
groupNameLdapAttributecnسمة LDAP التي يستخدمها Keycloak كاسم مجموعة.
groupObjectClassesgroupOfNamesفئة أو فئات كائنات LDAP التي تُعرّف مدخلات المجموعة.
membershipLdapAttributememberالسمة في مدخل المجموعة التي تحتوي على معلومات العضوية.
membershipAttributeTypeDNتنسيق قيم العضوية. القيم المدعومة: DN (أسماء مميزة) وUID (معرّفات المستخدمين).
userRolesRetrieveStrategyLOAD_GROUPS_BY_MEMBER_ATTRIBUTEالأسلوب المستخدم لتحديد عضويات المجموعة.
memberOfLdapAttributememberOfسمة المستخدم التي تحتوي على معلومات عضوية المجموعة عند استخدام GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE.
customGroupSearchFilterلا شيءمرشح LDAP إضافي يُستخدم عند البحث عن مجموعات. يجب أن يُحاط المرشح بأقواس، مثلًا (cn=dept-*).
modeLDAP_ONLYوضع المزامنة. القيم المدعومة: LDAP_ONLY وREAD_ONLY.
groupsPath/الموقع في تسلسل هرمية مجموعة Keycloak حيث تُنشأ المجموعات المتزامنة.

استراتيجيات استرداد عضوية المجموعة

يتحكم معامل userRolesRetrieveStrategy في كيفية تعريف Keycloak لعضويات مجموعة المستخدم.

الاستراتيجيةالوصف
LOAD_GROUPS_BY_MEMBER_ATTRIBUTEتسترد عضويات المجموعة بالبحث في مدخلات المجموعة التي تحتوي على مراجع للمستخدمين.
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTEتسترد عضويات المجموعة من سمة memberOf الخاصة بالمستخدم.
LOAD_GROUPS_BY_MEMBER_ATTRIBUTE_RECURSIVELYتسترد عضويات المجموعة بشكل تكراري، بما فيها المجموعات المتداخلة عند دعم دليل LDAP لذلك.
تلميح:

استخدم LOAD_GROUPS_BY_MEMBER_ATTRIBUTE ما لم يُخزّن دليل LDAP معلومات عضوية المجموعة في مدخلات المستخدمين من خلال سمة memberOf أو يستخدم هياكل مجموعة متداخلة تتطلب عمليات بحث تكرارية.

مثال على التكوين

# نطاقات البريد الإلكتروني التي يقبلها Bob عند تسجيل الدخول
domains:
  - corp.example.com

# المستخدمون الذين سيُمنحون وصول مسؤول Bob
adminEmails:
  - alice@corp.example.com

# موفرو اتحاد LDAP
ldaps:
  - name: corp-ldap

    vendor: other
    connectionUrl: ldaps://ldap.corp.example.com:636
    usersDn: ou=People,dc=corp,dc=example,dc=com
    usernameLDAPAttribute: uid
    rdnLDAPAttribute: uid
    uuidLDAPAttribute: entryUUID
    userObjectClasses: inetOrgPerson,organizationalPerson,person

    bindDn: cn=bob-svc,ou=ServiceAccounts,dc=corp,dc=example,dc=com
    bindPasswordSecret: corp-ldap-bind

    useTruststoreSpi: always
    ldapsCACertSecret: corp-ldap-ca

    userSync:
      enabled: true

    userAttributeMappings:
      - ldapAttribute: mail
        userModelAttribute: email
      - ldapAttribute: givenName
        userModelAttribute: firstName
      - ldapAttribute: sn
        userModelAttribute: lastName

    # Optional: synchronize LDAP groups into Keycloak
    groupMapper:
      groupsDn: ou=Groups,dc=corp,dc=example,dc=com
      groupObjectClasses: groupOfNames
      membershipLdapAttribute: member
./bobctl configure-idp --config my-idp.yaml

التحقق من تكوين LDAP قبل تطبيقه

قبل تطبيق تكوين LDAP على المجموعة، استخدم خيار --dry-run للتحقق من التكوين ومعاينة الموارد التي ستُنشأ. يمكن أن يساعد تشغيل dry run في تحديد مشكلات التكوين الشائعة قبل إجراء أي تغييرات على المجموعة.

./bobctl configure-idp --config my-idp.yaml \
  --bind-password '<bind-password>' \
  --ca-cert-file /path/to/ca.crt \
  --dry-run

يُجري dry run الفحوصات التالية:

  • يتحقق من وجود جميع معاملات التكوين المطلوبة في ملف التكوين.
  • يعرض معاينة للمورد المخصص BobIDP الذي سيُنشأ أو يُحدَّث.
  • ينتهي دون إنشاء أي موارد أو تعديلها أو حذفها في المجموعة.
ملاحظة:

لا تتحقق عملية dry-run من الاتصال الشبكي بخادم LDAP، ولا تُصادق بيانات الاعتماد المُقدَّمة مقابل الدليل، ولا تؤكد وجود Secrets المُشار إليها في المجموعة. تُجرى هذه التحقيقات فقط بعد تطبيق التكوين وتنعكس في شروط الحالة LDAPReachable وLDAPAuthenticated.

تطبيق التكوين

بعد إنشاء ملف تكوين LDAP والتحقق منه، شغّل أمر configure-idp لتطبيق التكوين على المجموعة.

./bobctl configure-idp --config my-idp.yaml \
  --bind-password '<bind-password>' \
  --ca-cert-file /path/to/ca.crt
الرايةمطلوبالوصف
--config <file>نعميُحدد مسار ملف تكوين IDP.
--dry-runلايتحقق من التكوين ويعرض معاينة للموارد التي ستُنشأ أو تُحدَّث، دون تطبيق أي تغييرات على المجموعة.

عند تشغيل الأمر، ينتظر bobctl حتى يُسوّي المُشغِّل التكوين ويتحقق من IDP بفحص شروط الحالة التي يُبلّغ عنها المورد المخصص BobIDP.

الفحصما يؤكده
Readyتم تطبيق التكوين بنجاح.
LDAPRegisteredتم تسجيل موفر LDAP في Keycloak.
LDAPReachableخادم LDAP قابل للوصول من المجموعة.
LDAPAuthenticatedبيانات اعتماد الربط المُكوَّنة صالحة.
LDAPUserSyncSucceededاكتمل الاستيراد الأولي للمستخدمين بنجاح. يُقيَّم هذا الشرط فقط عند تعيين userSync.enabled إلى true.

المهلة الافتراضية للتحقق هي 600 ثانية (10 دقائق). في البيئات ذات الأدلة الكبيرة، يمكن أن تستغرق المزامنة الأولية للمستخدمين عدة دقائق للاكتمال. لزيادة المهلة، عيّن متغير البيئة BOB_IDP_WAIT_TIMEOUT:

BOB_IDP_WAIT_TIMEOUT=900 ./bobctl configure-idp --config my-idp.yaml

تكوين موفرين متعددين لـ LDAP

لدمج مستخدمين من مصادر LDAP أو Active Directory متعددة، أضف كل دليل كمدخل منفصل في قائمة ldaps في ملف تكوين IDP وأعد تشغيل configure-idp.

./bobctl configure-idp --config my-idp.yaml

فحص حالة مورد IDP

لعرض حالة تكوين IDP:

oc get bobidp -n <instance-namespace>

لعرض معلومات التكوين والحالة التفصيلية:

oc get bobidp bob-idp -n <instance-namespace> -o yaml

التحقق من التكامل

بعد اكتمال bobctl configure-idp بنجاح، تحقق من أن تكامل LDAP يعمل بشكل صحيح.

افحص حالة المورد المخصص BobIDP:

oc get bobidp bob-idp -n <instance-namespace> -o yaml

تحقق من أن شروط الحالة التالية معيَّنة إلى True:

الشرطالغرض
Readyيؤكد تطبيق التكوين بنجاح.
LDAPRegisteredيؤكد تسجيل موفر LDAP في Keycloak.
LDAPReachableيؤكد قدرة المجموعة على التواصل مع خادم LDAP.
LDAPAuthenticatedيؤكد صحة بيانات اعتماد الربط المُكوَّنة.
LDAPUserSyncSucceededيؤكد استيراد جميع المستخدمين بنجاح. موجود فقط عند userSync.enabled: true.

إذا كان أي شرط False، راجع حقل message المقابل للحصول على تفاصيل التشخيص.

سجّل الدخول باستخدام بيانات اعتماد من دليل LDAP الموحَّد للتحقق من عمل مصادقة المستخدم.

افتح عنوان URL الخاص بـ Bob:

https://bob.<namespace>.<ingress-domain>

يؤكد تسجيل الدخول الناجح عمل الاتصال والمصادقة وتوجيه النطاق وتوفير SCIM وتعيين الأدوار بشكل صحيح.

بعد تسجيل دخول المستخدم للمرة الأولى، تأكد من توافر سجل المستخدم في Bob.

افتح واجهة إدارة Bob:

https://bob.<namespace>.<ingress-domain>/admin

سجّل الدخول كمسؤول Bob وتحقق من ظهور المستخدم التجريبي في قائمة المستخدمين.

إذا كان groupMapper مُكوَّنًا لتعيين مجموعة LDAP لمسؤولي Bob:

  1. سجّل الدخول بحساب مستخدم ينتمي إلى مجموعة المسؤولين المعيَّنة.
  2. تأكد من قدرة المستخدم على الوصول إلى واجهة إدارة Bob.
  3. تحقق من توافر وظائف مستوى المسؤول.

إذا كان userSync.enabled: true، يُستورد المستخدمون تلقائيًا بعد تسجيل موفر LDAP. يجب أن يظهر المستخدم التجريبي في Bob دون تسجيل دخول أولي.

إذا لم يظهر المستخدم بعد عدة دقائق، راجع سجلات bob-admin بحثًا عن أخطاء التوفير:

oc logs -n <instance-namespace> -l app=bob-admin --tail=100

راجع أي أخطاء مرتبطة بـ SCIM وأصلحها قبل إعادة محاولة عملية المزامنة.

ما رأيك في هذا الموضوع؟