Product SiteDocumentation Site

11.7. دایرکتوی LDAP

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

11.7.1. نصب

بسته slapd شامل سرور OpenLDAP است. بسته ldap-utils نیز ابزار خط-فرمان مورد نیاز برای تعامل با سرورهای LDAP را شامل می‌شود.
هنگام نصب slapd معمولا پرسش‌های کمی مطرح می‌شود که این امر باعث می‌شود پایگاه‌داده نهایی برای نیاز شما مناسب نباشد. خوشبختانه با استفاده از dpkg-reconfigure slapd می‌توانید پایگاه‌داده LDAP را با جزئیات بیشتری تنظیم کنید.
  • پیکربندی سرور OpenLDAP را نادیده گرفته‌اید؟ البته که نه، ما قصد پیکربندی آن را داریم.
  • نام دامنه DNS: “falcot.com”.
  • نام سازمانی: “Falcot Corp”.
  • یک گذرواژه مدیریتی باید وارد شود.
  • پایگاه‌داده‌ای که از آن استفاده می‌شود: “MDB”.
  • می‌خواهید در زمان حذف کامل slapd پایگاه‌داده آن نیز حذف گردد؟ نه، دلیلی برای به خطر انداختن داده‌ها در صورت بروز اشتباه وجود ندارد.
  • پایگاه‌داده قدیمی جابجا شود؟ این پرسش زمانی مطرح می‌شود که یک پایگاه‌داده دیگر موجود باشد. فقط زمانی که می‌خواهید از دوباره شروع کنید به آن پاسخ مثبت بدهید. برای نمونه، اگر پس از نصب اولیه دستور dpkg-reconfigure slapd را اجرا کنید.
  • اجازه استفاده از پروتکل LDAPv2؟ نه، دلیلی برای اینکار وجود ندارد. تمام ابزاری که قصد استفاده آن‌ها را داریم با پروتکل LDAPv3 سازگار هستند.
یک پایگاه‌داده حداقلی با استفاده از پرس و جوهای زیر تعریف شده است:
$ ldapsearch -x -b dc=falcot,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=falcot,dc=com> with scope sub
# 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: 3
# numEntries: 2
پرس و جو دو شی را باز می‌گرداند: خود سازمان و کاربر مدیریتی آن.

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
# 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
ما به صورت عمدی از مهاجرت فایل /etc/aliases امتناع کردیم، چرا که شِمای استاندارد فراهم شده توسط دبیان ساختار مورد نظر این اسکریپت برای توضیح نام‌های مستعار ایمیل را شامل نمی‌شود. به منظور درج این داده در ساختار دایرکتوری، فایل /etc/ldap/schema/misc.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. پیکربندی بسته libnss-ldap

پرسشپاسخ
شناسه منحصربفرد سرور LDAPldap://ldap.falcot.com
نام متمایز پایگاه جستجوdc=falcot,dc=com
نسخه LDAP مورد استفاده3
آیا پایگاه‌داده LDAP نیازمند نام کاربری است؟no
ویژگی‌های خاص LDAP برای rootبله
فایل پیکربندی تنها توسط خود مالک خواندنی/نوشتنی باشدno
حساب‌کاربری LDAP برای rootcn=admin,dc=falcot,dc=com
گذرواژه حساب‌کاربری root در LDAPگذرواژه مدیریتی
به منظور پیکربندی NSS برای استفاده از افزونه تازه-نصب‌شده ldap، فایل /etc/nsswitch.conf نیاز به تغییرات دارد.

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

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd: ldap compat
group: ldap compat
shadow: ldap compat

hosts: files dns ldap
networks: ldap files

protocols: ldap db files
services: ldap db files
ethers: ldap db files
rpc: ldap db files

netgroup: ldap 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 برای rootcn=admin,dc=falcot,dc=com
گذرواژه حساب‌کاربری root در LDAPگذرواژه مدیریتی پایگاه‌داده LDAP
الگوریتم رمزنگاری محلی برای استفاده گذرواژه‌هاcrypt
نصب 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. پیکربندی سرور
اولین گام ایجاد یک جفت کلید (کلیدهای عمومی و خصوصی) برای سرور LDAP است. مدیرسیستم‌های فالکوت از easy-rsa برای تولید آن استفاده می‌کنند ( قسمت 10.2.1.1, “زیرساخت کلید عمومی: easy-rsa را مشاهده کنید). با اجرای ./build-key-server ldap.falcot.com چند پرسش درباره محل، نام سازمان و از این قبیل پرسیده می‌شود. پاسخ به پرسش “نام متداول” باید مطابق با نام تمام-عیار سرور LDAP باشد؛ در این مورد، ldap.falcot.com.
این دستور یک گواهینامه در فایل keys/ldap.falcot.com.crt ایجاد می‌کند؛ کلید خصوصی متناظر آن در keys/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 keys/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 newcert.pem /etc/ssl/certs/ldap.falcot.com.pem
همچنین نیاز است که فرآیند پس‌زمینه slapd نیز از این کلیدها برای رمزنگاری استفاده کند. پیکربندی سرور LDAP به صورت خودکار مدیریت می‌شود: پیکربندی می‌تواند با عملیات ساده LDAP روی سلسله‌مراتب شی cn=config بروزرسانی شود تا سرور در زمان واقعی و به صورت پایدار، اقدام به بروزرسانی /etc/ldap/slapd.d کند. از این رو، ldapmodify ابزار مناسب بروزرسانی پیکربندی به حساب می‌آید:

مثال 11.27. پیکربندی slapd برای رمزنگاری

# cat >ssl.ldif <<END
dn: cn=config
changetype: modify
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.falcot.com.key
-
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"
آخرین گام برای فعال‌سازی رمزنگاری تغییر متغیر SLAPD_SERVICES در فایل /etc/default/slapd است. ما به صورت امنی از آن استفاده کرده و تمام تبادل داده‌های ناامن LDAP را غیرفعال کرده‌ایم.

مثال 11.28. فایل /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.conf 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 همچنین باید بتوانند سرور را احرازهویت کنند. در یک زیرساخت کلید X.509، گواهینامه‌های عمومی توسط کلید یکی از صادرکنندگان گواهینامه (CA) با easy-rsa امضا می‌شوند. مدیرسیستم‌های فالکوت CA خود را ایجاد کرده‌اند و نیاز دارند که سیستم را مبتنی بر آن پیکربندی کنند. اینکار با قرار دادن گواهینامه CA در /usr/local/share/ca-certificates و اجرای update-ca-certificates انجام می‌شود.
# cp keys/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.29. فایل /etc/ldap/ldap.conf

#
# LDAP Defaults
#

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

BASE   dc=falcot,dc=com
URI    ldaps://ldap.falcot.com

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

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