اذهب إلى المحتوى

الاستيثاق الشبكي – ضبط خادوم OpenLDAP على أوبنتو


عبد اللطيف ايمش

البروتوكول الخفيف للوصول للدليل (Lightweight Directory Access Protocol) أو اختصارًا LDAP، هو بروتوكول لطلبيات وتعديل خدمة دليل مبني على X.500 يعمل عبر TCP/IP؛ الإصدارة الحالية من LDAP هي LDAPv3 كما هو معرَّف في RFC45101؛ والبرمجية المستخدمة في أوبنتو لتطبيق LDAPv3 هي OpenLDAP.

ubuntu-server-openldap.thumb.png.173d535

هذه هي بعض المصطلحات والمفاهيم الأساسية:

  • دليل 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 في المثال الآتي:

  1. أنشِئ ملف ضبط التحويل المسمى 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
  1. أنشِئ مجلد المخرجات ldif_output.

  2. حدد فهرس المخطط:

slapcat -f schema_convert.conf -F ldif_output -n 0 | grep corba,cn=schema

cn={1}corba,cn=schema,cn=config

ملاحظة: عندما «يحقن» (injects) ‏slapd الكائنات‏ التي لها نفس الاسم الفريد للأب؛ فإنه سيُنشِئ فهرسًا لهذا الكائن؛ ويحتوى الفهرس ضمن قوسين معقوفين: {X}.

  1. استخدم 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.

  1. عدِّل 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

    قد تختلف قيم الخاصيات عندك.

    1. في النهاية، استخدم ldapadd لإضافة مخطط جديد إلى شجرة معلومات دليل slapd-config:

    sudo ldapadd -Q -Y EXTERNAL -H ldapi:/// -f cn\=corba.ldif
    
    adding new entry "cn=corba,cn=schema,cn=config"
    1. تأكد من المخططات المُحَمَّلة:

    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.

    تم التعديل في بواسطة وليد زيوش


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

    أفضل التعليقات

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



    انضم إلى النقاش

    يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

    زائر
    أضف تعليق

    ×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

      Only 75 emoji are allowed.

    ×   Your link has been automatically embedded.   Display as a link instead

    ×   جرى استعادة المحتوى السابق..   امسح المحرر

    ×   You cannot paste images directly. Upload or insert images from URL.


    ×
    ×
    • أضف...