Product SiteDocumentation Site

11.7. دایرکتوی LDAP

OpenLDAP یکی از پیاده‌سازی‌های پروتکل LDAP است؛ به عبارت دیگر، یک پایگاه‌داده به خصوص برای ذخیره‌سازی دایرکتوری‌ها. در متداول‌ترین کاربرد آن، استفاده از یک سرور LDAP اجازه متمرکزسازی مدیریت حساب‌های کاربری و مجوزهای مربوط به آن‌ها را می‌دهد. علاوه بر این، یک پایگاه‌داده LDAP به سادگی قابل تکثیر است، که امکان برپایی چندین سرور LDAP به صورت متقارن را فراهم می‌آورد. زمانی که شبکه و کاربران آن به سرعت رشد می‌کنند، عملکرد می‌تواند بین چندین سرور مختلف تقسیم شود.
داده LDAP ساخت‌یافته و سلسله‌مراتبی است. ساختار آن با توجه به “schema” تعریف می‌شود که انواع گوناگون اشیا قابل ذخیره‌سازی توسط پایگاه‌داده را مشخص می‌کند، به همراه فهرستی از تمام ویژگی‌های آن‌ها. شیوه نگارش یک شی خاص در این پایگاه‌داده مبتنی بر ساختار آن است، که همین امر باعث پیچیدگی آن می‌شود.

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”.
  • یک گذرواژه مدیریتی باید وارد شود.
  • پایگاه‌داده‌ای که از آن استفاده می‌شود: “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.500dc=falcot,dc=com
نام سرور LDAPlocalhost
مدیر دامنهcn=admin,dc=falcot,dc=com
مدرک اعتبارسنجیگذرواژه مدیریتی
ایجاد DUAConfigProfileno
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

سیستم NSS (یا Name Service Switch،‌قسمت مطالعه بیشتر NSS و پایگاه‌داده‌های سیستم را مشاهده کنید) یک سیستم ماژولار به منظور تعریف یا دریافت اطلاعات برای دایرکتوری‌های سیستمی است. استفاده از LDAP به عنوان منبع داده برای NSS نیازمند نصب بسته libnss-ldap است. در زمان نصب چندین پرسش مطرح می‌شود؛ پاسخ‌ها در قسمت جدول 11.2 بیان شده‌اند.

جدول 11.2. Configuring the libnss-ldap package:

پرسشپاسخ
LDAP server URI (Uniform Resource Identifier) ldapi://ldap.falcot.com
نام متمایز پایگاه جستجوdc=falcot,dc=com
نسخه LDAP مورد استفاده3
حساب‌کاربری LDAP برای rootcn=admin,dc=falcot,dc=com
گذرواژه حساب‌کاربری root در LDAPگذرواژه مدیریتی
Allow LDAP admin account behave like local root? yes
آیا پایگاه‌داده LDAP نیازمند نام کاربری است؟no
The /etc/nsswitch.conf file then needs to be modified, so as to configure NSS to use the freshly-installed ldap module. You can use the example provided in /usr/share/doc/libnss-ldap/examples/nsswitch.ldap or edit your existing configuration.

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

#ident $Id: nsswitch.ldap,v 2.4 2003/10/02 02:36:25 lukeh Exp $
#
# 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). بدون این استثنا، یک پرس و جو مبتنی بر نام، از سرور LDAP اطلاعات خود را می‌پرسد؛ اینکار منجر به بروز خطا در سرور LDAP شده که آن را در یک حلقه بینهایت قرار می‌دهد.
اگر نیاز به پرس و جو از سرور LDAP برای اینکار باشد (و فایل‌های محلی مورد استفاده افزونه files نادیده گرفته شوند)، سرویس‌ها می‌توانند با شیوه نگارش زیر پیکربندی گردند:
service: ldap [NOTFOUND=return] files.
اگر گزینه درخواست‌شده در پایگاه‌داده LDAP موجود نباشد، یک پاسخ “not existing” باز گردانده می‌شود حتی اگر گزینه مورد نظر در یکی از فایل‌های محلی موجود باشد؛ تنها زمانی از این فایل‌ها استفاده می‌شود که سرویس LDAP متوقف شده باشد.

11.7.3.2. پیکربندی PAM

این قسمت به بررسی پیکربندی از PAM (پشت صحنه /etc/environment و /etc/default/locale را مشاهده کنید) می‌پردازد که به برنامه‌ها اجازه احرازهویت توسط پایگاه‌داده LDAP را می‌دهد.
افزونه LDAP برای PAM توسط بسته libpam-ldap فراهم می‌شود. در زمان نصب این بسته پرسش‌های بسیار مشابهی به آنچه در libpam-ldap مطرح شد پرسیده می‌شود؛ حتی برخی پارامترهای پیکربندی نیز (از جمله نشانی سرور LDAP) با بسته libpam-ldap مشترک هستند. پاسخ‌ها در قسمت جدول 11.3 توضیح داده شده‌اند.

جدول 11.3. پیکربندی libpam-ldap

پرسشپاسخ
حساب مدیر LDAP مجاز است که مانند root رفتار کند؟بله. اینکار باعث می‌شود بتواند از دستور passwd برای تغییر گذرواژه‌های ذخیره‌شده در پایگاه‌داده LDAP استفاده شود.
پایگاه‌داده LDAP نیازمند اطلاعات ورود باشد؟no
LDAP account for root:cn=admin,dc=falcot,dc=com
LDAP administrative password:گذرواژه مدیریتی پایگاه‌داده LDAP
Local encryption algorithm to use for passwords: crypt
PAM profiles to enable:LDAP Authentication is among the enabled profiles
نصب libpam-ldap به صورت خودکار با پیکربندی پیشفرض PAM که در فایل‌های /etc/pam.d/common-auth، /etc/pam.d/common-password و /etc/pam.d/common-account تعریف شده است، منطبق می‌شود. این مکانیزم از ابزار انحصاری pam-auth-update استفاده می‌کند (که توسط بسته libpam-runtime فراهم می‌شود). مدیرسیستم همچنین می‌تواند از این ابزار برای فعال‌سازی یا غیرفعال‌سازی افزونه‌های PAM استفاده کند.

11.7.3.3. ایمن‌سازی تبادل داده LDAP

پروتکل LDAP، به صورت پیشفرض، داده‌ها را در شبکه در حالت متنی جابجا می‌کند؛ این امر شامل گذرواژه‌ها (رمزنگاری‌شده) می‌شود. از آنجا که این گذرواژه‌ها می‌توانند از طریق شبکه استخراج شوند، نسبت به حملات dictionary-type آسیب‌پذیر هستند. این مشکل با فعال‌سازی یک لایه رمزنگاری اضافی برطرف می‌شود؛ فعال‌سازی این لایه موضوع بحث این قسمت است.
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. پیکربندی برنامه
در سمت برنامه، پیکربندی افزونه‌های libpam-ldap و libnss-ldap نیاز به تغییر دارند تا از نشانی ldaps:// استفاده کنند.
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 پیشفرض LDAP که توسط بسیاری ابزارهای خط-فرمان استفاده می‌شوند می‌توانند در /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