يتناول هذا المقال المفاهيم الأساسيّة للاستيثاق باستخدام 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.
يجب أن نعدّ بضعة أمور بعد اكتمال التثبيت.
-
تأكّد من 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
-
ضبط الحساب الإداري لـOpenLDAP وتعيين كلمة سرّ له:
# slappasswd
مثل ما يظهر في الصّورة التالية:
ثم ننشئ ملفّ 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 المستخدمة أعلاه.
-
-
نضيف الآن مدخلا إلى دليل LDAP باستخدام الأمر
ldapadd
وتحديد عنوان URI الخاصّ بالخادوم وملفّ LDIF الخاصّ بالمدخل على النحو التالي:# ldapadd -Y EXTERNAL -H ldapi:/// -f ldaprootpasswd.ldif
ثم نضيف تعريفات للدليل باستيراد الأمثلة الموجودة في المجلّد
etc/openldap/schema/
:# for def in cosine.ldif nis.ldif inetorgperson.ldif; do ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/$def; done
-
جعل 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
-
ننشئ ملفّ 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
ملحوظة: أدخل كلمة السّر التي أنشأتها سابقا عندما تُطلب منك.
-
ننشئ حسابَ مستخدم لإضافته إلى دليل 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
نعرّف في ملفّ 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
يمكن باستخدام الأمر
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
-
ننتقل إلى العميل لتفعيل إمكانيّة التسجيل لمستخدمي LDAP.
تأكّد من أن العميل يمكنه الوصول إلى الخادوم (والعكس). غيّر - إن لزم الأمر - ملفّ
etc/hosts/
لإضافة عنوان الخادوم على العميل (والعكس، العميل على الخادوم). ننفّذ الأمر التالي - على العميل - لضبط طرق الاستيثاق عليه:# authoconfig-tui
تظهر الواجهة التالية:
تأكد من تحديد خياري
Use LDAP
وUse LDAP authentication
بوضع علامة*
أمامهما. استخدم الأسهم للانتقال بين الخيارات، والمسافة لتفعيل خيّار أو تعطيله؛ ثمEnter
عند الوصول إلى زرّNext
. أضف في الشاشة المواليّة عنوان خادوم LDAP بالصّيغةldap://academy1.virtuallab.dev
ثم الاسم المُميّز القاعدي DN. لم نستخدم شهادة TLS لذا اترك الخيّارTLS
غير محدّد.يمكننا الآن اختبار عمل 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.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.