إعداد الاستيثاق باستخدام LDAP على Red Hat Enterprise Linux


محمد أحمد العيل

يتناول هذا المقال المفاهيم الأساسيّة للاستيثاق باستخدام LDAP: ماهيّته، متى يُستخدَم ولماذا؛ وكيفيةَ ضبط خادوم LDAP وإعداد عميل للاستيثاق عن طريقه اعتمادا على Red Hat Enterprise Linux 7. سنركّز في هذا الدّرس على الاستيثاق المعتمد على LDAP رغم وجود طرق أخرى للاستيثاق.

بيئة المختبر

سنفترض وجود بيئة اختبار مكوّنة من جهازيْن تشغّلهما توزيعة RHEL 7:

  • الخادوم: 192.168.2.100 واسم نطاقه المعرَّف بالكامل academy1.virtuallab.dev.
  • العميل: 192.168.2.200 واسم نطاقه المعرَّف بالكامل ldapclient.virtuallab.dev.

راجع مقال إنشاء شبكة داخلية افتراضية باستخدام Oracle VirtualBox للمزيد حول إنشاء هذه البيئة باستخدام Oracle VirtualBox، ومقال حول إعداد أسماء المضيفات.

ما هو LDAP؟

يعرفّ LDAP (اختصار لـLightweight Directory Access Protocol، الميثاق الخفيف للوصول إلى الدّليل) مجموعة من البروتوكولات التي تسمح لعميل بالوصول إلى معلومات مخزّنة مركزيًّا عبر الشبكة. يتعلّق الأمر بمعلومات يُتاح الوصول إليها من أماكن مختلفة أو لمستخدمين كثر؛ مثل صدفات الدّخول (الولوج) Login shells، مسارات الوصول إلى المجلّدات الشخصيّة للمستخدمين أو معلومات أخرى - عناوين أشخاص، أرقام هواتف - عن مستخدمي النظام، على سبيل المثال لا الحصر. جعلُ هذه المعلومات في مكان مركزي يسهّل من صيانتها وتحديثها ويعني أنه يمكن لأي شخص الوصول إليها إذا كان لديه التصريح بذلك.

يدور LDAP حول مفاهيم أساسية ثلاثة:

  • مَدخَل Entry: يُمثّل المَدخَل في LDAP معلومة أو وحدة معلومات، ويُعرَّف باسم مُميَّز Distinguished name.
  • خاصيّة Attribute: وهي بيانات تتعلّق بالمَدخَل.
  • قيم Values: تُسنَد لكلّ خاصيّة قيمة أو مجموعة قيم تفصِل بينها مسافة. يُشار إلى القيمة الوحيدة في المَدخَل (أي التي لا توجد إلا مرة واحدة في خاصيّات المدخل) بالاسم المُميَّز النسبي Relative Distinguished Name.

سنرى في الخطوة التاليّة كيفية تثبيت LDAP على كلّ من الخادوم والعميل.

تثبيت LDAP وإعداده على الخادوم والعميل

يُنفّذ برنامج OpenLDAP مبادئ LDAP على RHEL 7؛ يمكن تثبيته على الخادوم والعميل على التوالي بالأمرين التاليّين:

# yum update && yum install openldap openldap-clients openldap-servers
# yum update && yum install openldap openldap-clients nss-pam-ldapd

تحوي الحزمة nss-pam-ldapd التي نثبّتها على العميل مجموعة دوال مهمّتها البحث عن معلومات في دليل LDAP والاستيثاق من المستخدمين بناءً على المعلومات المتوفّرة على خادوم LDAP.

يجب أن نعدّ بضعة أمور بعد اكتمال التثبيت.

  1. تأكّد من SELinux يسمح لـLDAP بالعمل عن طريق تفعيل الإعدادات التاليّة على كلّ من الخادوم والعميل. لا تنس استخدام الخيار P- حتى تستمر التعديلات لما بعد إعادة تشغيل النّظام:

    # setsebool -P allow_ypbind=1 authlogin_nsswitch_use_ldap=1

    يتطلّب الاستيثاق عبر LDAP تفعيل الإعداد allow_ypbind، بينما تحتاج برامج أخرى تفعيل الإعداد authlogin_nsswitch_use_ldap حتى يمكنها استخدام LDAP للاستيثاق.

    ثم نفعّل خدمة slapd التي تنصِت للاتصالات القادمة إلى خادوم LDAP، مبدئيّا على المنفذ 389 وتجيب على الطلبات التي تتلقّاها عبر هذه الاتصالات:

    # systemctl enable slapd.service
    # systemctl start slapd.service

    تذكّر أن نظام التمهيد SystemD يمكّنك من تعطيل الخدمة، إعادة تشغيلها أو إيقافها:

     
    # systemctl disable slapd.service
    # systemctl restart slapd.service
    # systemctl stop slapd.service
    

    تعمل خدمة slapd بصلاحيّات الحساب ldap (وهو ما يمكن التأكد منه بتنفيذ الأمر ps -e -o pid,uname,comm | grep slapd)، الأمر الذي يعني أن هذا الحساب يجب أن يكون مالكَ المجلّد var/lib/ldap/ من أجل أن تستطيع خدمة slapd تعديل مداخل LDAP التي تُنشئها الأدوات الإداريّة، التي لا تعمل إلا بصلاحيّات الحساب الجذر، في المجلّد المذكور.

    تأكّد قبل تغيير ملكيّة المجلّد var/lib/ldap/ من نسخ نموذج ملفّ الإعداد لقاعدة بيانات LDAP:

    # cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
    # chown -R ldap:ldap /var/lib/ldap

     

  2. ضبط الحساب الإداري لـOpenLDAP وتعيين كلمة سرّ له:

    # slappasswd

    مثل ما يظهر في الصّورة التالية:

    01_slappasswd.png

    ثم ننشئ ملفّ LDIF باسم ldaprootpasswd.ldif. ملفّات LDIF (اختصار لـ LDAP Data Interchange Format، صيغة تبادل البيانات في LDAP) هي تمثيل للبيانات الموجودة في خادوم LDAP والتغيرات التي تطرأ عليها. نضع البيانات التاليّة في الملفّ ldaprootpasswd.ldif:

    dn: olcDatabase={0}config,cn=config
        changetype: modify
        add: olcRootPW
        olcRootPW: {SSHA}PASSWORD

    حيث:

    • PASSWORD: كلمة السّر التي حصلنا عليها أعلاه.
    • cn=config: تشير إلى خيار إعداد عامّ.
    • olcDatabase: اسم قاعادة بيانات معيّنة، توجد عادة على المسار etc/openldap/slapd.d/cn=config/.

    يُضيف ملفّ ldaprootpasswd.ldif مدخلا إلى دليل LDAP. يشير كلّ سطر في هذا المدخل إلى خاصيّة وقيمتها اللتين تفصل بينهما نقطتان عموديّتان :؛ أي أن changetype، add، dn وolcRootPW خاصيّات توجد قيمها على نفس السّطر، يمين النقطتين.

    تنبغي المحافظة في الخطوات المواليّة على نفس الأسماء الشائعة =Common Names, cn المستخدمة أعلاه.

  3. نضيف الآن مدخلا إلى دليل LDAP باستخدام الأمر ldapadd وتحديد عنوان URI الخاصّ بالخادوم وملفّ LDIF الخاصّ بالمدخل على النحو التالي:

    # ldapadd -Y EXTERNAL -H ldapi:/// -f ldaprootpasswd.ldif

    02_ldapadd.png

    ثم نضيف تعريفات للدليل باستيراد الأمثلة الموجودة في المجلّد etc/openldap/schema/:

     
    # for def in cosine.ldif nis.ldif inetorgperson.ldif; do ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/$def; done
    

    03_ldapadd_import.png

  4. جعل LDAP يستخدم اسم النطاق في قاعدة بياناته.

    dn:olcDatabase={1}monitor,cn=config
    changetype:modify
    replace: olcAccess
    olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=virtuallab,dc=dev" read by * none
    
    dn:olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcSuffix
    olcSuffix: dc=virtuallab,dc=dev
    
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    replace: olcRootDN
    olcRootDN: cn=Manager,dc=virtuallab,dc=dev
    
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    add: olcRootPW
    olcRootPW: {SSHA}07/TOeaEPDlpTscePfA5kyij9mmepdr0
    
    dn: olcDatabase={2}hdb,cn=config
    changetype: modify
    add: olcAccess
    olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=virtuallab,dc=dev" write by anonymous auth by self write by * none
    olcAccess: {1}to dn.base="" by * read olcAccess: {2}to * by dn="cn=Manager,dc=virtuallab,dc=dev" write by * read

    نستخدم الأمر ldapmodify للتعديل على مَداخل الدليل:

    # ldapmodify -Y EXTERNAL -H ldapi:/// -f ldapdomain.ldif

    04_ldapmodify.png

  5. ننشئ ملفّ LDIF باسم baseldapdomain.ldif ونحدّد فيه مداخل لإضافتها إلى الدليل:

        dn: dc=virtuallab,dc=dev
        objectClass: top
        objectClass: dcObject
        objectclass: organization
        o: virtuallab dev
        dc: virtuallab
    
        dn: cn=Manager,dc=virtuallab,dc=dev
        objectClass: organizationalRole
        cn: Manager
        description: Directory Manager
    
        dn: ou=People,dc=virtuallab,dc=dev
        objectClass: organizationalUnit
        ou: People
    
        dn: ou=Group,dc=virtuallab,dc=dev
        objectClass: organizationalUnit
        ou: Group

    ثم نضيفها إلى الدليل بتنفيذ الأمر ldapadd (مع تحديد اسم النطاق المناسب):

     # ldapadd -x -D cn=Manager,dc=virtuallab,dc=dev -W -f baseldapdomain.ldif

    ملحوظة: أدخل كلمة السّر التي أنشأتها سابقا عندما تُطلب منك.

    05_ldapadd_entry.png

  6. ننشئ حسابَ مستخدم لإضافته إلى دليل LDAP:

    # adduser ldapuser

    نبدأ بإنشاء ملفّ LDIF باسم ldapgroup.ldif سنستخدمه لإضافة المجموعة التي ينتمي إليها المستخدم السّابق إلى الدّليل:

     
    # nano ldapgroup.ldif
    

    نضيف المحتوى التالي إلى الملفّ:

     
    dn: cn=Manager,ou=Group,dc=virtuallab,dc=dev
    objectClass: top
    objectClass: posixGroup
    gidNumber: 1012
    

    قيمة الخاصيّة gidNumber هي معرّف المجموعة التي ينتمي إليها المستخدم ldapuserالسابق. يمكن الحصول عليه بتنفيذ الأمر id -g ldapuser. ننفذ الأمر ldapaddعلى النحو التالي لإضافة مدخل لمجموعة المستخدم إلى الدليل:

    # ldapadd -x -W -D "cn=Manager,dc=virtuallab,dc=dev" -f ldapgroup.ldif

    06_ldapgroup.png

    نعرّف في ملفّ LDIF جديد باسم ldapuser.ldif بيانات المستخدم ldapuser (استخدم الأمر slappasswd لإنشاء كلمة سرّ للمستخدم وإضافتها للملف):

    dn: uid=ldapuser,ou=People,dc=virtuallab,dc=dev
    objectClass: top
    objectClass: account
    objectClass: posixAccount
    objectClass: shadowAccount
    cn: ldapuser
    uid: ldapuser
    uidNumber: 1009
    gidNumber: 1012
    homeDirectory: /home/ldapuser
    userPassword: {SSHA}9A93CS4LCUx9L8s6HPw1PB3ClH5JEI0U
    loginShell: /bin/bash
    gecos: ldapuser
    shadowLastChange: 0
    shadowMax: 0
    shadowWarning: 0

    ثم ننفّذ الأمر:

    # ldapadd -x -D cn=Manager,dc=virtuallab,dc=dev -W -f ldapuser.ldif

    07_ldapuser.png

    يمكن باستخدام الأمر ldapdelete حذفُ نفس المستخدم من الدليل على النحو التالي (لن نفعل ذلك هنا):

     
    # ldapdelete -x -W -D cn=Manager,dc=virtuallab,dc=dev "uid=ldapuser,ou=People,dc=virtuallab,dc=dev"
    

    نطلُب من الجدار الناري السماح لخدمة LDAP بالعمل على المنفذ 389:

    # firewall-cmd --add-service=ldap
    # firewall-cmd --permanent --add-port=389/tcp
    # firewall-cmd reload

     

  7. ننتقل إلى العميل لتفعيل إمكانيّة التسجيل لمستخدمي LDAP.

    تأكّد من أن العميل يمكنه الوصول إلى الخادوم (والعكس). غيّر - إن لزم الأمر - ملفّ etc/hosts/ لإضافة عنوان الخادوم على العميل (والعكس، العميل على الخادوم). ننفّذ الأمر التالي - على العميل - لضبط طرق الاستيثاق عليه:

    # authoconfig-tui

    تظهر الواجهة التالية:

    08_ldapuser.png

    تأكد من تحديد خياري Use LDAP وUse LDAP authentication بوضع علامة * أمامهما. استخدم الأسهم للانتقال بين الخيارات، والمسافة لتفعيل خيّار أو تعطيله؛ ثم Enter عند الوصول إلى زرّ Next. أضف في الشاشة المواليّة عنوان خادوم LDAP بالصّيغة ldap://academy1.virtuallab.dev ثم الاسم المُميّز القاعدي DN. لم نستخدم شهادة TLS لذا اترك الخيّار TLS غير محدّد.

    09_ldapuser.png

    يمكننا الآن اختبار عمل LDAP على العميل بالبحث في الدليل عن المستخدم ldapuser:

    # ldapsearch -x cn=ldapuser -b dc=virtuallab,dc=dev

    يجب أن تظهر جميع معلومات المستخدم ldapuser في الدليل:

     
    # extended LDIF
    #
    # LDAPv3
    # base <dc=virtuallab,dc=dev> with scope subtree
    # filter: cn=ldapuser
    # requesting: ALL
    #
    
    # ldapuser, People, virtuallab.dev
    dn: uid=ldapuser,ou=People,dc=virtuallab,dc=dev
    objectClass: top
    objectClass: account
    objectClass: posixAccount
    objectClass: shadowAccount
    cn: ldapuser
    uid: ldapuser
    uidNumber: 1009
    gidNumber: 1012
    homeDirectory: /home/ldapuser
    userPassword:: e1NTSEF9OUE5M0NTNExDVXg5TDhzNkhQdzFQQjNDbEg1SkVJMFU=
    (...)
    

    نفس الشيء عند استخدام الأمر getent على العميل:

    # getent passwd ldapuser
    ldapuser:x:1009:1012:ldapuser:/home/ldapuser:/bin/bash

     

ترجمة - يتصرّف - لمقال RHCSA Series: Setting Up LDAP-based Authentication in RHEL 7 – Part 14 لصاحبه Gabriel Cánepa.





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن