LDAP مخفف Lightweight Directory Access Protocol و یک پروتکل استاندارد برای خواندن و مدیریت داده‌های دایرکتوری است. در سازمان‌ها از آن برای جست‌وجوی کاربران، گروه‌ها و ویژگی‌های حساب کاربری استفاده می‌شود. LDAP خودِ پایگاه داده، سامانه ورود یکپارچه یا محصول مایکروسافت نیست. Active Directory یکی از سرویس‌هایی است که از LDAP پشتیبانی می‌کند.

LDAP در یک سامانه شرکتی چه کاری انجام می‌دهد؟

تصور کنید یک شرکت چند سرویس مانند پنل منابع انسانی، سامانه تیکت و داشبورد گزارش دارد. به‌جای نگهداری یک فهرست مستقل کاربران در هر برنامه، این سرویس‌ها می‌توانند برای شناسایی کاربران و گروه‌های سازمانی به یک Directory متصل شوند. تصمیم نهایی درباره دسترسی به فاکتورها، نقش‌های پروژه و منابع برنامه همچنان باید در لایه مجوزدهی برنامه اجرا شود.

مفاهیم اصلی دایرکتوری

اصطلاحعبارت کامل یا تعریفنمونه
DNDistinguished Name، نام کامل و یکتای یک Entryuid=alice,ou=people,dc=example,dc=org
RDNRelative Distinguished Name، بخشی از نام نسبت به والدuid=alice
Base DNریشه جست‌وجو در درخت دایرکتوریdc=example,dc=org
OUOrganizational 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 در اکتیو دایرکتوری.

اصطلاحات مرتبط: احراز هویت، مجوزدهی، کنترل دسترسی مبتنی بر نقش، ای‌سی‌ال، اواوث، پی‌اچ‌پی.