LDAP مخفف Lightweight Directory Access Protocol و یک پروتکل استاندارد برای خواندن و مدیریت دادههای دایرکتوری است. در سازمانها از آن برای جستوجوی کاربران، گروهها و ویژگیهای حساب کاربری استفاده میشود. LDAP خودِ پایگاه داده، سامانه ورود یکپارچه یا محصول مایکروسافت نیست. Active Directory یکی از سرویسهایی است که از LDAP پشتیبانی میکند.
LDAP در یک سامانه شرکتی چه کاری انجام میدهد؟
تصور کنید یک شرکت چند سرویس مانند پنل منابع انسانی، سامانه تیکت و داشبورد گزارش دارد. بهجای نگهداری یک فهرست مستقل کاربران در هر برنامه، این سرویسها میتوانند برای شناسایی کاربران و گروههای سازمانی به یک Directory متصل شوند. تصمیم نهایی درباره دسترسی به فاکتورها، نقشهای پروژه و منابع برنامه همچنان باید در لایه مجوزدهی برنامه اجرا شود.
مفاهیم اصلی دایرکتوری
| اصطلاح | عبارت کامل یا تعریف | نمونه |
|---|---|---|
DN | Distinguished Name، نام کامل و یکتای یک Entry | uid=alice,ou=people,dc=example,dc=org |
RDN | Relative Distinguished Name، بخشی از نام نسبت به والد | uid=alice |
Base DN | ریشه جستوجو در درخت دایرکتوری | dc=example,dc=org |
OU | Organizational Unit، واحد سازمانی | ou=people |
Bind | عملیات احراز هویت یا ایجاد زمینه امنیتی اتصال | اتصال سرویس با حساب محدود |
Search | جستوجوی Entryها با Filter | پیدا کردن کاربر با uid |
Modify | تغییر ویژگیهای یک Entry | ویرایش نام نمایشی یا عضویت گروه |
LDAP و Active Directory و SSO چه تفاوتی دارند؟
LDAP یک پروتکل برای دسترسی به اطلاعات دایرکتوری است. اکتیو دایرکتوری سرویس دایرکتوری مایکروسافت است و قابلیتهای دیگری مانند سیاستهای دامنه و استفاده از Kerberos دارد. ورود یکپارچه یا SSO تجربه احراز هویت مشترک در چند سرویس را توصیف میکند و ممکن است با پروتکلهایی مانند OpenID Connect یا SAML اجرا شود. وجود LDAP بهتنهایی به معنی پشتیبانی از SSO نیست.
مثال دستور ldapsearch
# Connect through TLS. Replace the sample domain and DN.
ldapsearch -LLL -x \
-H ldaps://directory.example.org:636 \
-D 'uid=report-reader,ou=services,dc=example,dc=org' \
-W \
-b 'ou=people,dc=example,dc=org' \
'(uid=alice)' cn mail
مثال پایتون با ldap3
python -m pip install ldap3
import os
import ssl
from ldap3 import Server, Connection, Tls
from ldap3.utils.conv import escape_filter_chars
server = Server(
'directory.example.org', port=636, use_ssl=True,
tls=Tls(validate=ssl.CERT_REQUIRED)
)
username = escape_filter_chars('alice')
with Connection(
server,
user='uid=report-reader,ou=services,dc=example,dc=org',
password=os.environ['LDAP_BIND_PASSWORD'],
auto_bind=True
) as conn:
conn.search(
'ou=people,dc=example,dc=org',
f'(uid={username})',
attributes=['cn', 'mail']
)
for entry in conn.entries:
print(entry.entry_dn)
مثال PHP با افزونه LDAP
<?php
$connection = ldap_connect('ldaps://directory.example.org:636');
ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, 3);
$bindDn = 'uid=report-reader,ou=services,dc=example,dc=org';
if (!ldap_bind($connection, $bindDn, getenv('LDAP_BIND_PASSWORD'))) {
throw new RuntimeException('LDAP bind failed');
}
$username = ldap_escape('alice', '', LDAP_ESCAPE_FILTER);
$result = ldap_search(
$connection,
'ou=people,dc=example,dc=org',
'(uid=' . $username . ')',
['cn', 'mail']
);
$entries = ldap_get_entries($connection, $result);
امنیت LDAP
از اتصال رمزنگاریشده LDAPS یا StartTLS با اعتبارسنجی گواهی استفاده کنید. رمز حساب سرویس را در سورس کد قرار ندهید و برای آن حداقل مجوز جستوجوی لازم را تعریف کنید. مقادیر واردشده در Filter را Escape کنید تا LDAP Injection رخ ندهد.
مرجع استاندارد
RFC 4511، مشخصات LDAPv3 و راهنمای امنیت ارتباط LDAP در اکتیو دایرکتوری.
اصطلاحات مرتبط: احراز هویت، مجوزدهی، کنترل دسترسی مبتنی بر نقش، ایسیال، اواوث، پیاچپی.