البروتوكول الخفيف للوصول للدليل (Lightweight Directory Access Protocol) أو اختصارًا LDAP، هو بروتوكول لطلبيات وتعديل خدمة دليل مبني على X.500 يعمل عبر TCP/IP؛ الإصدارة الحالية من LDAP هي LDAPv3 كما هو معرَّف في RFC45101؛ والبرمجية المستخدمة في أوبنتو لتطبيق LDAPv3 هي OpenLDAP.
هذه هي بعض المصطلحات والمفاهيم الأساسية:
- دليل LDAP هو شجرة من قيود البيانات (entries) التي تكون ذات هيكليّةٍ بطبيعتها، وتسمى شجرة معلومات الدليل (Directory Information Tree [DIT]).
- يتكون القيد من مجموعة من الخاصيات (attributes).
- الخاصية لها نوع (type) يكون اسمًا أو شرحًا؛ وقيمةٌ واحدةٌ أو أكثر.
- يجب أن تُعرِّف كل خاصية ما يسمى objectClass واحدًا على الأقل.
- الخاصيات و objectClasses مُعرَّفةٌ في مخططات (schemas) حيث يُعتبَر objectClass نوعًا خاصًا من الخاصيات.
- لكل قيد معرِّف خاص به هو «الاسم الفريد» (Distinguished Name أو DN)؛ الذي يحتوي على «الاسم الفريد النسبي» (Relative Distinguished Name [RDN]) متبوعًا بالاسم الفريد للقيد الأب.
- الاسم الفريد للقيد ليس خاصيةً، بل يعتبر جزءًا من القيد نفسه.
ملاحظة: المصطلحات «الكائن» (object)، و«الحاوية» (container)، و«العقدة» (node) لها دلالات خاصة، لكنها أساسيًا تعني «قيد» (entry)؛ لكن «قيد» هو المصطلح الصحيح تقنيًا.
على سبيل المثال، لدينا هنا قيدٌ واحدٌ يحتوي على 11 خاصية:
- اسمه الفريد: «cn=John Doe,dc=example,dc=com»
- واسمه الفريد النسبي (RDN) هو: «cn=John Doe»
- واسم الأب الفريد هو: «dc=example,dc=com»
dn: cn=John Doe,dc=example,dc=com cn: John Doe givenName: John sn: Doe telephoneNumber: +1 888 555 6789 telephoneNumber: +1 888 555 1232 mail: john@example.com manager: cn=Larry Smith,dc=example,dc=com objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: person objectClass: top
القيد السابق مكتوب بصيغة LDIF (صيغة تبادل البيانات في LDAP [LDAP Data Interchange Format])؛ أيّة معلومات تضعها في شجرة معلومات الدليل (DIT) يجب أن تكون بهذه الصيغة؛ كما هي معرَّفة في RFC28492.
وعلى الرغم من أن هذا الفصل يستخدم LDAP للاستيثاق المركزي، لكنه يصلح لأي شيء فيه عدد كبير من طلبات الوصول لسندٍ خلفي (backend) تتمحور حول قراءة القيم المبنية على الخاصيات (name:value)؛ تتضمن الأمثلة على ذلك: دفترًا للعناوين، وقائمةً بعناوين البريد الإلكتروني، وضبطًا لخادوم البريد.
التثبيت
لتثبيت عفريت خادوم OpenLDAP مع أدوات إدارة LDAP التقليدية؛ عليك تثبيت حزمتَيّ slapd و ldap-utils على التوالي وبالترتيب.
سيؤدي تثبيت slapd إلى إنشاء ضبط قادر على العمل مباشرةً؛ وخصوصًا إنشاء قاعدة بيانات تستطيع استخدامها لتخزين بياناتك؛ لكن اللاحقة (suffix أو DN الأساسية) ستُحدَّد من اسم نطاق الجهاز المحلي؛ إذا أردت شيئًا مختلفًا، فعدِّل ملف /etc/hosts وبدِّل اسم النطاق باسمٍ ترغب في استخدامه كلاحقة؛ على سبيل المثال، إذا أردت أن تكون اللاحقة هي dc=example,dc=com، فعندها سيحتوي ملف hosts على سطرٍ شبيه بالآتي:
127.0.1.1 hostname.example.com hostname
تستطيع الرجوع إلى الإعدادات القديمة بعد تثبيت الحزمة.
ملاحظة: سنستخدم قاعدة بيانات ذات لاحقة dc=example,dc=com.
أكمل بتثبيت الحزمة:
sudo apt-get install slapd ldap-utils
منذ إصدارة أوبنتو 8.10، صُمِّمَ slapd ليُضبَط داخل slapd نفسه، باستخدام DIT خاصة به لهذا الغرض مما يسمح بأن يُعدَّ slapd ديناميكيًّا دون الحاجة إلى إعادة تشغيل الخدمة؛ وستتكون قاعدة بيانات الضبط من مجموعة من ملفات LDIF النصية الموجودة في المجلد /etc/ldap/slapd.d؛ طريقة العمل هذه معروفةٌ بعدَّة أسماء: طريقة slapd-config، وطريقة RTC (Real Time Configuration)، أو طريقة cn=config؛ ما زلتَ تستطيع استخدام ملف الضبط التقليدي slapd.conf لكن هذه الطريقة غير مستحسنة؛ وستلغى هذه الميزة تدريجيًا.
ملاحظة: تستخدم أوبنتو طريقة slapd-config لضبط slapd، وكذلك هذا الدرس.
سيُطلَب منك أثناء التثبيت تعريف «الأوراق الاعتمادية الإدارية» (administrative credentials)؛ وهي الأوراق الاعتمادية المبنية على LDAP لقاعدة rootDN؛ افتراضيًا، يكون DN للمستخدم هو cn=admin,dc=example, dc=com؛ وأيضًا افتراضيًا لا يُنشَأ حساب إداري لقاعدة بيانات slapd-config؛ لذا عليك الاستيثاق خارجيًا للوصول إلى LDAP وسنرى كيفية فعل ذلك لاحقًا.
تأتي بعض المخططات الكلاسيكية (cosine، و nis، و inetorgperson) افتراضيًا مع slapd هذه الأيام؛ وهنالك أيضًا مخطط «core» المطلوب ليعمل أي مخطط آخر.
ما يجب فعله بعد التثبيت
تُعِدّ عملية التثبيت شجرتين لمعلومات الدليل؛ واحدة لاستخدامها في ضبط slapd (slapd-config) وواحدة لبياناتك الشخصية (dc=example,dc=com)؛ لنلقِ نظرةً.
هذا ما تبدو عليه قاعدة بيانات slapd-config؛ تذكَّر أن هذه القاعدة مبنية على LDIF وموجودة في /etc/ldap/slapd.d:
/etc/ldap/slapd.d/ /etc/ldap/slapd.d/cn=config /etc/ldap/slapd.d/cn=config/cn=module{0}.ldif /etc/ldap/slapd.d/cn=config/cn=schema /etc/ldap/slapd.d/cn=config/cn=schema/cn={0}core.ldif /etc/ldap/slapd.d/cn=config/cn=schema/cn={1}cosine.ldif /etc/ldap/slapd.d/cn=config/cn=schema/cn={2}nis.ldif /etc/ldap/slapd.d/cn=config/cn=schema/cn={3}inetorgperson.ldif /etc/ldap/slapd.d/cn=config/cn=schema.ldif /etc/ldap/slapd.d/cn=config/olcBackend={0}hdb.ldif /etc/ldap/slapd.d/cn=config/olcDatabase={0}config.ldif /etc/ldap/slapd.d/cn=config/olcDatabase={-1}frontend.ldif /etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif /etc/ldap/slapd.d/cn=config.ldif
ملاحظة: لا تُعدِّل قاعدة بيانات slapd-config مباشرةً، أجرِ التعديلات باستخدام بروتوكول LDAP (عبر الأدوات الخاصة).
وهذا ما تبدو عليه شجرة معلومات الدليل slapd-config عند طلبها بواسطة بروتوكول LDAP:
تنويه: في نسخة خادوم أوبنتو 14.10 وربما ما بعدها، قد لا يعمل الأمر الآتي بسبب علِّة.
sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=config dn dn: cn=config dn: cn=module{0},cn=config dn: cn=schema,cn=config dn: cn={0}core,cn=schema,cn=config dn: cn={1}cosine,cn=schema,cn=config dn: cn={2}nis,cn=schema,cn=config dn: cn={3}inetorgperson,cn=schema,cn=config dn: olcBackend={0}hdb,cn=config dn: olcDatabase={-1}frontend,cn=config dn: olcDatabase={0}config,cn=config dn: olcDatabase={1}hdb,cn=config
شرح القيود السابقة:
- cn=config: الإعدادات العامة.
- cn=module{0},cn=config: وحدة مُحَمَّلة ديناميكيًا.
- cn=schema,cn=config: يحتوي على مخطط مستوى النظام (hard-coded).
- cn={0}core,cn=schema,cn=config: يحتوي على مخطط الأساس (hard-coded).
- cn={1}cosine,cn=schema,cn=config: المخطط cosine.
- cn={3}inetorgperson,cn=schema,cn=config: المخطط inetorgperson.
- olcBackend={0}hdb,cn=config: نوع تخزين 'hdb'.
- olcDatabase={-1}frontend,cn=config: قاعدة بيانات الواجهة (frontend)، الضبط الافتراضي لقواعد البيانات الأخرى.
- olcDatabase={0}config,cn=config: قاعدة بيانات ضبط slapd (cn=config).
- olcDatabase={1}hdb,cn=config: نسخة قاعدة البيانات الخاصة بك (dc=example,dc=com).
وهذا ما تبدو عليه شجرة معلومات الدليل dc=example,dc=com:
ldapsearch -x -LLL -H ldap:/// -b dc=example,dc=com dn dn: dc=example,dc=com dn: cn=admin,dc=example,dc=com
شرح القيود السابقة:
- dc=example,dc=com: أساس DIT.
- cn=admin,dc=example,dc=com: المدير (rootDN) لشجرة معلومات الدليل هذه (ضُبِط أثناء تثبيت الحزمة).
تعديل وملء قاعدة البيانات
لنضع بعض المحتويات في قاعدة البيانات؛ حيث سنضيف الآتي:
- عقدة اسمها People (لتخزين المستخدمين).
- عقدة اسمها Groups (لتخزين المجموعات).
- مجموعة اسمها miners.
- مستخدم اسمه john.
أنشئ ملف LDIF وسَمِّه add_content.ldif:
dn: ou=People,dc=example,dc=com objectClass: organizationalUnit ou: People dn: ou=Groups,dc=example,dc=com objectClass: organizationalUnit ou: Groups dn: cn=miners,ou=Groups,dc=example,dc=com objectClass: posixGroup cn: miners gidNumber: 5000 dn: uid=john,ou=People,dc=example,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount uid: john sn: Doe givenName: John cn: John Doe displayName: John Doe uidNumber: 10000 gidNumber: 5000 userPassword: johnldap gecos: John Doe loginShell: /bin/bash homeDirectory: /home/john
ملاحظة: من المهم ألّا تتصادم قيم uid و gid في دليلك مع القيم المحلية؛ استخدم مجالات الأرقام الكبيرة؛ فابدأ مثلًا من 5000، وبتكبير قيم uid و gid في ldap، فإنك تسمح أيضًا بسهولة التحكم في ماذا يستطيع أن يفعله المستخدم المحلي، في مقابل ما يفعله مستخدم ldap؛ سنفصِّل هذا الموضوع لاحقًا.
أضف المحتويات:
ldapadd -x -D cn=admin,dc=example,dc=com -W -f add_content.ldif Enter LDAP Password: ******** adding new entry "ou=People,dc=example,dc=com" adding new entry "ou=Groups,dc=example,dc=com" adding new entry "cn=miners,ou=Groups,dc=example,dc=com" adding new entry "uid=john,ou=People,dc=example,dc=com"
سنتحقق من إضافة المعلومات إضافةً صحيحةً باستخدام الأداة ldapsearch:
ldapsearch -x -LLL -b dc=example,dc=com 'uid=john' cn gidNumber dn: uid=john,ou=People,dc=example,dc=com cn: John Doe gidNumber: 5000
شرح ماذا حصل:
- -x: ربط بسيط؛ لن تُستخدَم طريقة SASL الافتراضية.
- -LLL: تعطيل طباعة معلوماتٍ إضافيةً.
- uid=john: «مُرَشِّح» (filter) للعثور على المستخدم john.
- cn gidNumber: طلب خاصيات معينة لإظهارها (القيمة الافتراضية هي إظهار جميع الخاصيات).
تعديل قاعدة بيانات slapd
يمكن أن تُطلَب أو تُعدَّل شجرة دليل المعلومات الخاصة بضبط slapd (slapd-config)؛ سنذكر هنا بعض الأمثلة:
استخدم الأمر idapmodify لإضافة «فهرس» (خاصية DbIndex) إلى قاعدة بيانات {1}hdb,cn=config (التي هي dc=example,dc=com)؛ أنشِئ ملفًا اسمه uid_index.ldif فيه المحتويات الآتية:
dn: olcDatabase={1}hdb,cn=config add: olcDbIndex olcDbIndex: uid eq,pres,sub
ثم نفِّذ الأمر:
sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f uid_index.ldif modifying entry "olcDatabase={1}hdb,cn=config"
تستطيع تأكيد التغيير بهذه الطريقة:
sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b \ cn=config '(olcDatabase={1}hdb)' olcDbIndex dn: olcDatabase={1}hdb,cn=config olcDbIndex: objectClass eq olcDbIndex: uid eq,pres,sub
لنضف الآن مخططًا (schema)، يجب أولًا أن تحوَّل إلى صيغة LDIF؛ تستطيع إيجاد مخططات مُحوَّلة، وغير مُحوَّلة في مجلد /etc/ldap/schema.
ملاحظة: حذف المخططات من قاعدة بيانات slapd-config ليس أمرًا بسيطًا؛ تدرب على إضافة المخططات على نظام خاص بالتجارب.
قبل إضافة أيّة مخططات، يجب أن تتحقق من أيّة مخططات قد ثبِّتَت مسبقًا (المخرجات الآتية هي المخرجات الافتراضية [out-of-the-box]):
sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b \ cn=schema,cn=config dn dn: cn=schema,cn=config dn: cn={0}core,cn=schema,cn=config dn: cn={1}cosine,cn=schema,cn=config dn: cn={2}nis,cn=schema,cn=config dn: cn={3}inetorgperson,cn=schema,cn=config
سنضيف مخطط CORBA في المثال الآتي:
أنشِئ ملف ضبط التحويل المسمى schema_convert.conf يتضمن الأسطر الآتية:
include /etc/ldap/schema/core.schema include /etc/ldap/schema/collective.schema include /etc/ldap/schema/corba.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/duaconf.schema include /etc/ldap/schema/dyngroup.schema include /etc/ldap/schema/inetorgperson.schema include /etc/ldap/schema/java.schema include /etc/ldap/schema/misc.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/openldap.schema include /etc/ldap/schema/ppolicy.schema include /etc/ldap/schema/ldapns.schema include /etc/ldap/schema/pmi.schema
أنشِئ مجلد المخرجات ldif_output.
حدد فهرس المخطط:
slapcat -f schema_convert.conf -F ldif_output -n 0 | grep corba,cn=schema cn={1}corba,cn=schema,cn=config
ملاحظة: عندما «يحقن» (injects) slapd الكائنات التي لها نفس الاسم الفريد للأب؛ فإنه سيُنشِئ فهرسًا لهذا الكائن؛ ويحتوى الفهرس ضمن قوسين معقوفين: {X}.
استخدم slapcat للقيام بالتحويل:
slapcat -f schema_convert.conf -F ldif_output -n0 -H \ ldap:///cn={1}corba,cn=schema,cn=config -l cn=corba.ldif
المخطط المحوّل موجودٌ الآن في cn=corba.ldif.
عدِّل cn=corba.ldif حتى تصل إلى الخاصيات الآتية:
dn: cn=corba,cn=schema,cn=config ... cn: corba
أزل الآن الأسطر الآتية من النهاية:
structuralObjectClass: olcSchemaConfig entryUUID: 52109a02-66ab-1030-8be2-bbf166230478 creatorsName: cn=config createTimestamp: 20110829165435Z entryCSN: 20110829165435.935248Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20110829165435Z
قد تختلف قيم الخاصيات عندك.
في النهاية، استخدم ldapadd لإضافة مخطط جديد إلى شجرة معلومات دليل slapd-config:
sudo ldapadd -Q -Y EXTERNAL -H ldapi:/// -f cn\=corba.ldif adding new entry "cn=corba,cn=schema,cn=config"
تأكد من المخططات المُحَمَّلة:
sudo ldapsearch -Q -LLL -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config dn dn: cn=schema,cn=config dn: cn={0}core,cn=schema,cn=config dn: cn={1}cosine,cn=schema,cn=config dn: cn={2}nis,cn=schema,cn=config dn: cn={3}inetorgperson,cn=schema,cn=config dn: cn={4}corba,cn=schema,cn=config
ملاحظة: لكي يستوثق العملاء والتطبيقات الخارجية باستخدام LDAP، فإن عليك ضبط كل واحد منهم ليفعل ذلك؛ راجع توثيق تلك العملاء لمعلومات ملائمة عنهم.
التسجيل (Logging)
لا غنى عن تفعيل تسجيل slapd عند استخدام تطبيقات تعتمد على OpenLDAP، لكن عليك تفعيله يدويًا بعد تثبيت البرمجيات؛ وإذا لم تفعل ذلك، فستظهر رسائل بدائية غير مفيدة فقط في السجلات؛ ويُفعَّل التسجيل، كغيره من ضبط slapd، عبر قاعدة بيانات slapd-config.
يأتي OpenLDAP مع عدّة أنظمة فرعية للتسجيل (مستويات)، تحتوي كلٌ منها على المستوى الأدنى منها؛ مستوى جيد للتجربة هو stats؛ هنالك المزيد من المعلومات حول الأنظمة الفرعية المختلفة في صفحة دليل man slapd-config.
أنشِئ ملف logging.ldif بالمحتويات الآتية:
dn: cn=config changetype: modify add: olcLogLevel olcLogLevel: stats
طبِّق التعديل:
sudo ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f logging.ldif
وهذا ما سيُنتِج كميّةً كبيرةً من السجلات؛ وربما تحتاج للعودة وتقليل درجة الإسهاب عندما يصبح نظامك نظامًا إنتاجيًا (in production)، لكن ربما يجعل ضبط الإسهاب هذا محرك syslog في نظامك يعاني من كثرة الرسائل، وقد يتجاوز بعضها دون تسجيله:
rsyslogd-2177: imuxsock lost 228 messages from pid 2547 due to rate-limiting
قد تفكر في تغيير ضبط rsyslog؛ ضع في ملف /etc/rsyslog.conf:
# Disable rate limiting # (default is 200 messages in 5 seconds; below we make the 5 become 0) $SystemLogRateLimitInterval 0
ثم أعد تشغيل عفريت rsyslog:
sudo service rsyslog restart
ترجمة -وبتصرف- للمقال Ubuntu Server Guide: OpenLDAP Server.
تم التعديل في بواسطة وليد زيوش
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.