Product SiteDocumentation Site

11.7. دليل LDAP

OpenLDAP هي تطبيق لبروتوكول LDAP؛ أي أنها قاعدة بيانات خاصة مصممة لتخزين الأدلة. في أغلب الأحيان، يسمح استخدام مخدم LDAP بمركزة إدارة حسابات المستخدمين وصلاحياتهم. كما أن نسخ قاعدة بيانات LDAP سهل، وهذا يسمح بإعداد مجموعة مخدمات LDAP متزامنة. عندما تنمو الشبكة وقاعدة المستخدمين سريعاً، يمكن عندئذ موازنة الحمل بين عدة مخدمات.
بيانات LDAP بنيوية (structured) وهرمية (hierarchical). تتحدد بنى البيانات ”بالسكيماهات schemas“ التي تعرّف أنواع الكائنات التي تستطيع قاعدة البيانات تخزينها، بالإضافة لقائمة تشمل جميع الصفات التي قد تأخذها هذه الكائنات. تعتمد الصيغة المستخدمة لتمثيل كائن ما في قاعدة البيانات على هذه البنية، ولذلك فهي معقّدة.

11.7.1. التثبيت

تحوي الحزمة slapd مخدم OpenLDAP. وتتضمن الحزمة ldap-utils أدوات نصية للتعامل مع مخدمات LDAP.
Installing slapd usually asks only for the administrator's password and the resulting database is unlikely to suit your needs. Fortunately a simple dpkg-reconfigure slapd will let you reconfigure the LDAP database with more details:
  • تجاهل إعداد مخدم OpenLDAP؟ طبعاً لا، نحن نريد إعداد هذه الخدمة.
  • اسم مخدم DNS: ‏”falcot.com“.
  • اسم المنظمة: ”Falcot Corp“.
  • يجب كتابة كلمة سر الإدارة.
  • الطرف النهائي (backend) المستخدم لقاعدة البيانات: ”MDB“.
  • هل تريد إزالة قاعدة البيانات عند تطهير slapd؟ لا. لا فائدة من المخاطرة بخسارة قاعدة البيانات عن طريق الخطأ.
  • نقل قاعدة البيانات القديمة؟ يظهر هذا السؤال فقط إذا أجريت الإعداد مع وجود قاعدة بيانات سابقة. أجب ”بنعم“ فقط إذا كنت فعلاً تريد البدء من جديد مع قاعدة بيانات نظيفة، مثلاً إذا استدعيت dpkg-reconfigure slapd مباشرة بعد التثبيت الأولي.
أُعدَّت الآن قاعدة بيانات مصغرة، كما يوضح لنا الاستعلام التالي:
$ ldapsearch -x -b dc=falcot,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=falcot,dc=com> with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# falcot.com
dn: dc=falcot,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Falcot Corp
dc: falcot

# admin, falcot.com
dn: cn=admin,dc=falcot,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
أعاد الاستعلام كائنين: المنظّمة نفسها، والمستخدم الإداري.

11.7.2. تعبئة الدليل

بما أن قاعدة البيانات الفارغة لا تفيدنا بحد ذاتها، فسوف نحقن فيها جميع البيانات السابقة؛ بما في ذلك قواعد بيانات المستخدمين والمجموعات والخدمات والمضيفات.
توفر الحزمة migrationtools مجموعة من السكربتات المخصصة لاستخراج البيانات من أدلة يونكس التقليدية (/etc/passwd، ‏/etc/group، ‏/etc/services، ‏/etc/hosts وغيرها)، وتحويل هذه البيانات وحقنها في قاعدة بيانات LDAP.
بعد تثبيت الحزمة، يجب تحرير /etc/migrationtools/migrate_common.ph، لتفعيل الخيارين IGNORE_UID_BELOW وIGNORE_GID_BELOW (يكفي إزالة التعليق عنهما)، كما يجب تحديث قيمة DEFAULT_MAIL_DOMAIN/DEFAULT_BASE.
يجري الأمر migrate_all_online.sh عملية الهجرة الفعلية، كما يلي:
# cd /usr/share/migrationtools
# PERL5LIB="${PERL5LIB}:/etc/migrationtools" LDAPADD="/usr/bin/ldapadd -c" ETC_ALIASES=/dev/null ./migrate_all_online.sh
يطرح migrate_all_online.sh بضعة أسئلة عن قاعدة بيانات LDAP التي يجب تهجير البيانات إليها. يلخص جدول 11.1 الإجابات التي استخدمت في حالة فلكوت.

جدول 11.1. إجابات الأسئلة التي يطرحها السكربت migrate_all_online.sh

السؤالالجواب
X.500 naming contextdc=falcot,dc=com
LDAP server hostnamelocalhost
Manager DNcn=admin,dc=falcot,dc=com
Bind credentialsكلمة سر الإدارة
Create DUAConfigProfileلا
You might notice that we extend the PERL5LIB variable. This is due to Debian bug report #982666.
As you might have also noticed, we deliberately ignore migration of the /etc/aliases file, since the standard schema as provided by Debian does not include the structures that this script uses to describe email aliases. Should we want to integrate this data into the directory, the /etc/ldap/schema/misc.schema file should be added to the standard schema.
لاحظ أيضاً استخدام الخيار -c مع الأمر ldapadd؛ يطلب هذا الأمر عدم إيقاف المعالجة في حال حدوث خطأ. نحتاج استخدام هذا الخيار لأن تحويل /etc/services يولّد غالباً بضعة أخطاء يمكن تجاهلها بأمان.

11.7.3. إدارة الحسابات باستخدام LDAP

بعد أن حَوَت قاعدة بيانات LDAP الآن بعض المعلومات المفيدة. آن اوان استخدام هذه البيانات. يركز هذا القسم على طريقة إعداد نظام لينكس بحيث تَستخدِم أدلة النظام المتنوعة قاعدة بيانات LDAP بشكل شفاف.

11.7.3.1. إعداد NSS

The NSS system (Name Service Switch, see sidebar التعمق أكثر NSS وقواعد بيانات النظام) is a modular system designed to define or fetch information for system directories. Using LDAP as a source of data for NSS requires installing the libnss-ldapd package.
The /etc/nsswitch.conf file then needs to be modified, so as to configure NSS to use the freshly-installed ldap module.

مثال 11.23. الملف /etc/nsswitch.conf

# /etc/nsswitch.conf
#
# An example file that could be copied over to /etc/nsswitch.conf; it
# uses LDAP conjunction with files.
#
# "hosts:" and "services:" in this file are used only if the
# /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports.

# the following lines obviate the "+" entry in /etc/passwd and /etc/group.
passwd:         files ldap
shadow:         files ldap
group:          files ldap

# consult DNS first, we will need it to resolve the LDAP host. (If we
# can't resolve it, we're in infinite recursion, because libldap calls
# gethostbyname(). Careful!)
hosts:          dns ldap

# LDAP is nominally authoritative for the following maps.
services:   ldap [NOTFOUND=return] files
networks:   ldap [NOTFOUND=return] files
protocols:  ldap [NOTFOUND=return] files
rpc:        ldap [NOTFOUND=return] files
ethers:     ldap [NOTFOUND=return] files

# no support for netmasks, bootparams, publickey yet.
netmasks:   files
bootparams: files
publickey:  files
automount:  files

# I'm pretty sure nsswitch.conf is consulted directly by sendmail,
# here, so we can't do much here. Instead, use bbense's LDAP
# rules ofr sendmail.
aliases:    files
sendmailvars:   files

# Note: there is no support for netgroups on Solaris (yet)
netgroup:   ldap [NOTFOUND=return] files
تضاف الوحدة ldap قبل الوحدات الأخرى عادة، وبالتالي تُرسَل الطلبات إليها أولاً. الاستثناء الواضح هو خدمة hosts لأن الاتصال بمخدم LDAP يحتاج استشارة DNS أولاً (لاستبيان ldap.falcot.com). إذا لم نضع هذا الاستثناء، ستحاول طلبات استبيان (resolve) أسماء المضيفات سؤال مخدم LDAP، وهذا سيحتاج لطلب استبيان اسم مخدم LDAP نفسه، وتدور الطلبات في حلقة لا نهائية.
إذا كنا سنعتبر مخدم LDAP المرجع الوحيد (ولن نأخذ الملفات المحلية التي تستخدمها الوحدة files بعين الاعتبار)، فيجب إعداد الخدمات باستخدام الصيغة التالية:
service: ldap [NOTFOUND=return] files.
إذا اكنت المدخلة المطلوبة غير موجودة في قاعدة بيانات LDAP فسوف يعطي الاستعلام رد ”غير موجود“، حتى لو كان المورد المطلوب متوفراً في أحد الملفات المحلية؛ ولن تستخدم هذه الملفات المحلية إلا عندما تتوقف خدمة LDAP عن العمل.

11.7.3.2. إعداد PAM

يشرح هذا القسم إعداد PAM (انظر وراء الكواليس /etc/environment و /etc/default/locale) بطريقة تسمح للتطبيقات بإجراء المصادقات المطلوية مع قاعدة بيانات LDAP.
The LDAP module for PAM is provided by the libpam-ldapd package. Installing this package asks a few questions very similar to those in libnss-ldapd; some configuration parameters (such as the URI for the LDAP server) are even actually shared with the libnss-ldapd package.
Installing libpam-ldapd automatically adapts the default PAM configuration defined in the /etc/pam.d/common-auth, /etc/pam.d/common-password and /etc/pam.d/common-account files. This mechanism uses the dedicated pam-auth-update tool (provided by the libpam-runtime package). This tool can also be run by the administrator should they wish to enable or disable PAM modules.

11.7.3.3. تأمين تبادلات بيانات LDAP

افتراضياً، ينقل LDAP البيانات عبر الشبكة بشكلها الصريح؛ وهذا يشمل كلمات السر (المشفرة). بما أنه يمكن استخلاص كلمات السر المشفرة من الشبكة، فقد تتعرض لهجمات القواميس (Dictionary attacks). يمكن تفادي هذا باستخدام طبقة تشفير إضافية، يتحدث هذا القسم عن تفعيل هذه الطبقة.
11.7.3.3.1. إعداد المخدم
The first step is to create a key pair (comprising a public key and a private key) for the LDAP server. The Falcot administrators reuse easy-rsa to generate it (see قسم 10.2.2, “البنية التحتية للمفاتيح العامة: easy-rsa). Running ./easyrsa build-server-full ldap.falcot.com nopass will ask you about the “common name”. The answer to that question must be the fully-qualified hostname for the LDAP server; in our case, ldap.falcot.com.
This command creates a certificate in the pki/issued/ldap.falcot.com.crt file; the corresponding private key is stored in pki/private/ldap.falcot.com.key.
يجب الآن تثبيت هذه المفاتيح في موقعها القياسي، كما يجب أن نتأكد أن مخدم LDAP الذي يعمل بهوبة المستخدم openldap يملك صلاحية قراءة الملف الخاص:
# adduser openldap ssl-cert
Adding user `openldap' to group `ssl-cert' ...
Adding user openldap to group ssl-cert
Done.
# mv pki/private/ldap.falcot.com.key /etc/ssl/private/ldap.falcot.com.key
# chown root.ssl-cert /etc/ssl/private/ldap.falcot.com.key
# chmod 0640 /etc/ssl/private/ldap.falcot.com.key
# mv pki/issued/ldap.falcot.com.crt /etc/ssl/certs/ldap.falcot.com.pem
# chown root.root /etc/ssl/certs/ldap.falcot.com.pem
# chmod 0644 /etc/ssl/certs/ldap.falcot.com.pem
كما يجب إعداد خدمة slapd أيضاً لاستخدام هذه المفاتيح للتشفير. إدارة إعدادات مخدم LDAP ديناميكية: بما أنها مخزنة في جزء خاص من الدليل نفسه، فيمكن تحديث الإعدادات باستخدام عمليات LDAP عادية تُجرَى على شجرة الكائنات cn=config، ويحدّث المخدم الملف /etc/ldap/slapd.d في الوقت الحقيقي حتى تصبح الإعدادات دائمة. الأداة ldapmodify هي الأداة الصحيحة لتحديث الإعدادات:

مثال 11.24. إعداد slapd لاستخدام التشفير

# cat >ssl.ldif <<END
dn: cn=config
changetype: modify
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.falcot.com.key
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
END
# ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
# systemctl restart slapd.service
# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config -s base | grep TLS
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
olcTLSCertificateKeyFile: /etc/ssl/certs/ldap.falcot.com.key
تشمل آخر خطوة في تفعيل التشفير تعديل المتغير SLAPD_SERVICES في الملف /etc/default/slapd . حتى نتفادى أي مخاطرات، سوف نعطّل LDAP غير المؤمن كله.

مثال 11.25. الملف /etc/default/slapd

# Default location of the slapd.conf file or slapd.d cn=config directory. If
# empty, use the compiled-in default (/etc/ldap/slapd.d with a fallback to
# /etc/ldap/slapd.conf).
SLAPD_CONF=

# System account to run the slapd server under. If empty the server
# will run as root.
SLAPD_USER="openldap"

# System group to run the slapd server under. If empty the server will
# run in the primary group of its user.
SLAPD_GROUP="openldap"

# Path to the pid file of the slapd server. If not set the init.d script
# will try to figure it out from $SLAPD_CONF (/etc/ldap/slapd.d by
# default)
SLAPD_PIDFILE=

# slapd normally serves ldap only on all TCP-ports 389. slapd can also
# service requests on TCP-port 636 (ldaps) and requests via unix
# sockets.
# Example usage:
# SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
SLAPD_SERVICES="ldaps:/// ldapi:///"

# If SLAPD_NO_START is set, the init script will not start or restart
# slapd (but stop will still work).  Uncomment this if you are
# starting slapd via some other means or if you don't want slapd normally
# started at boot.
#SLAPD_NO_START=1

# If SLAPD_SENTINEL_FILE is set to path to a file and that file exists,
# the init script will not start or restart slapd (but stop will still
# work).  Use this for temporarily disabling startup of slapd (when doing
# maintenance, for example, or through a configuration management system)
# when you don't want to edit a configuration file.
SLAPD_SENTINEL_FILE=/etc/ldap/noslapd

# For Kerberos authentication (via SASL), slapd by default uses the system
# keytab file (/etc/krb5.keytab).  To use a different keytab file,
# uncomment this line and change the path.
#export KRB5_KTNAME=/etc/krb5.keytab

# Additional options to pass to slapd
SLAPD_OPTIONS=""
11.7.3.3.2. إعداد العميل
On the client side, the configuration for the libpam-ldapd and libnss-ldapd modules needs to be modified to use an ldaps:// URI.
LDAP clients also need to be able to authenticate the server. In an X.509 public key infrastructure, public certificates are signed by the key of a certificate authority (CA). With easy-rsa, the Falcot administrators have created their own CA and they now need to configure the system to trust the signatures of Falcot's CA. This can be done by putting the CA certificate in /usr/local/share/ca-certificates and running update-ca-certificates.
# cp pki/ca.crt /usr/local/share/ca-certificates/falcot.crt
# update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

Adding debian:falcot.pem
done.
done.
أخيراً وليس آخراً، يمكن تعديل عنوان URI الافتراضي وDN الأساسي التي تستخدمها العديد من أدوات سطر الأوامر افتراضياً في الملف /etc/ldap/ldap.conf. هذا سيوفر طباعة هذه المتغيرات كلما استدعينا أحد هذه الأوامر.

مثال 11.26. الملف /etc/ldap/ldap.conf

#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-provider.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

# TLS certificates (needed for GnuTLS)
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt