ادغام Keycloak با LDAP (User Federation)
بازارچه ابریخواندن 10 دقیقه
Keycloak بهجای اینکه فقط یک بار کاربران را از یک دایرکتوری LDAP وارد (Import) کند، آن دایرکتوری را بهعنوان یک منبع ذخیرهسازی کاربر زنده و پیوسته میشناسد؛ به این معماری، User Federation گفته میشود. در این حالت، خود فرایند احراز هویت (بررسی رمز عبور) هم میتواند مستقیماً به LDAP واگذار شود، بدون اینکه رمزها در د یتابیس Keycloak کپی شوند.
پیشنیازها
- یک سرویس فعال Keycloak و دسترسی مدیریتی به Realm موردنظر
- یک سرور LDAP یا Active Directory در دسترس از شبکه Keycloak
توضیحات کامل این قابلیت در مستند رسمی User Federation کیکلاک آمده است.
گام اول: افزودن Provider
- از منوی سمت چپ، User Federation انتخاب میشود.
- روی Add provider کلیک شده و گزینه
ldapانتخاب میشود.
گام دوم: تنظیمات اتصال
- یک نام در فیلد Console Display Name وارد میشود.
- نوع سرور در فیلد Vendor انتخاب میشود (Active Directory یا Other).
- آدرس سرور در فیلد Connection URL وارد میشود؛ برای مثال
ldaps://ldap.example.com:636. - Bind Type روی
simpleتنظیم میشود. - مشخصات حساب سرویس در فیلدهای Bind DN و Bind Credential وارد میشود.
| فیلد | مقدار نمونه |
|---|---|
| Bind type | simple |
| Bind DN | cn=keycloak-reader,dc=example,dc=org |
| Bind credentials | <LDAP_BIND_PASSWORD> |
با دکمه Test Connection، برقراری اتصال شبکهای به سرور و با Test Authentication، صحت همین Bind بررسی میشود.
گام سوم: تنظیمات جستوجوی کاربر
- مسیر ریشه کاربران در فیلد Users DN وارد میشود؛ برای مثال
ou=people,dc=example,dc=org. - attribute نامکاربری در فیلد Username LDAP attribute مشخص میشود (معمولاً
uidیاsAMAccountName). - RDN LDAP attribute و UUID LDAP attribute متناسب با ساختار دایرکتوری تنظیم میشوند.
- کلاس آبجکت کاربران در فیلد User Object Classes و محدوده جستوجو در فیلد Search Scope مشخص میشود.
| فیلد | مقدار نمونه | توضیحات |
|---|---|---|
| Edit mode | READ_ONLY | حالت تعامل Keycloak با LDAP؛ READ_ONLY یعنی هیچ تغییری از Keycloak به دایرکتوری نوشته نمیشود |
| Users DN | ou=people,dc=example,dc=org | مسیر کامل OUای که کاربران در آن قرار دارند |
| Relative user creation DN | — | فقط در حالت WRITABLE و برای ساخت کاربر در یک زیرشاخه Users DN لازم است؛ برای مثال ou=engineering |
| Username LDAP attribute | uid | attributeای که بهعنوان ن ام کاربری (username) در Keycloak استفاده میشود |
| RDN LDAP attribute | uid | بخش اول DN هر رکورد؛ مثلاً uid یعنی DN کاربر به شکل uid=alice,ou=people,... است |
| UUID LDAP attribute | entryUUID | شناسه یکتا و تغییرناپذیر هر رکورد که Keycloak برای tracking داخلی استفاده میکند؛ مقدار استاندارد OpenLDAP همین است |
| User object classes | inetOrgPerson, posixAccount, shadowAccount | Keycloak فقط رکوردهایی را کاربر میشناسد که همه این objectClassها را داشته باشند |
| Search scope | Subtree | Users DN و همه زیرشاخههای آن جستوجو میشوند؛ اگر همه کاربران مستقیماً زیر Users DN هستند، One Level هم قابل استفاده است |
در همین صفحه، دو گزینه تعیین میکنند که Keycloak چه رابطهای با دادههای LDAP داشته باشد:
Import Users مشخص میکند که آیا Keycloak پس از اولین ورود موفق یا پیدا شدن کاربر در یک جستوجو، یک نسخه محلی (Shadow Copy) از او را در دیتابیس خودش نگه میدارد یا نه. منبع هر attribute و نحوه بهروزرسانی آن به تنظیم Mapper مربوط بستگی دارد؛ برخی attributeها هنگام خواندن از LDAP دریافت میشوند و برخی در نسخه محلی نگهداری میشوند. همگامسازی دورهای برای واردکردن و بهروزرسانی گروهی کاربران استفاده میشود.
Edit Mode مشخص میکند تغییرات پروفایل یا رمز عبور از داخل Keycloak (چه توسط ادمین، چه توسط خود کاربر) چه سرنوشتی پیدا میکنند:
| Edit Mode | رفتار | کاربرد پیشنهادی |
|---|---|---|
READ_ONLY | تغییر پروفایل/رمز از Keycloak امکانپذیر نیست؛ فقط خواندن از LDAP انجام میشود | وقتی LDAP تنها منبع حقیقت است و نباید از کنسول Keycloak دستکاری شود |
WRITABLE | تغییرات از Keycloak مستقیماً روی همان رکورد در LDAP نوشته میشود | وقتی باید بتوان پروفایل یا رمز را از کنسول Keycloak هم بهروزرسانی کرد |
UNSYNCED | تغییرات فقط در دیتابیس Keycloak ذخیره میشود و به LDAP نوشته نمیشود | برای نگهداری تغییرات محلی روی LDAP فقطخواندنی یا در دوره مهاجرت |
گام چهارم: همگامسازی (Synchronization)
با فعال بودن Import Users، Keycloak یک نسخه محلی از کاربران LDAP در دیتابیس خودش نگه میدارد. برای واردکردن اولیه همه کاربران و بهروزرسانی گروهی رکوردهای محلی، همگامسازی به یکی از دو شکل زیر تنظیم میشود:
| نوع Sync | کاربرد | هزینه |
|---|---|---|
| Periodic Full Sync | تمام کاربران دایرکتوری را از ابتدا همگام میکند | بالا؛ بازه طولانیتر (مثلاً روزانه) مناسبتر است |
| Periodic Changed Users Sync | فقط کاربرانی را همگام میکند که از آخرین اجرا تغییر کردهاند | پایین؛ میتواند با بازه کوتاهتر اجرا شود |
- گزینه Import Users فعال میشود.
- بسته به نیاز، هرکدام از دو نوع Sync بالا فعال و بازه زمانیشان تنظیم میشود.
- با کلیک روی Save، تنظیمات ذخیره میشود.
- برای اجرای فوری sync، از دکمه Action در بالای همان صفحه، گزینه Synchronize all users انتخاب میشود.
جزئیات این بخش در مستند رسمی همگامسازی LDAP آمده است.
برای بررسی نتیجه، از منوی سمت چپ به بخش Users مراجعه و نام یکی از کاربران LDAP جستوجو میشود. در نسخههایی که فهرست اولیه خالی نمایش داده میشود، با واردکردن * میتوان جستوجوی صریح همه کاربران را اج را کرد. در دایرکتوریهای بزرگ، جستوجوی یک نام مشخص بهجای * از بار غیرضروری روی LDAP جلوگیری میکند.
مپینگ گروهها و نقشها
پس از همگامسازی کاربران، گروهها و نقشهای دایرکتوری از طریق تب Mappers همین Provider به Keycloak نگاشت میشوند. جزئیات کامل در مستند رسمی LDAP Mapperها آمده است.
وارد کردن گروهها از LDAP
مقادیر این بخش با ConfigMap راهنمای ساخت اپ دارکوبی LDAP هماهنگاند. در آن ساختار، کاربران زیر ou=people، گروهها زیر ou=groups و عضویت گروههای posixGroup از طریق memberUid نگهداری میشود.
- در صفحه Provider، تب Mappers انتخاب میشود.
- روی Add Mapper کلیک شده و نوع
group-ldap-mapperانتخاب میشود. - تنظیمات زیر وارد میشود:
| فیلد | مقدار | توضیحات |
|---|---|---|
| Name | ldap-groups | نام دلخواه برای این Mapper |
| LDAP Groups DN | ou=groups,dc=example,dc=org | مسیر OUای که گروهها در آن قرار دارند |
| Group Name LDAP Attribute | cn | attributeای که نام گروه از آن خوانده میشود |
| Group Object Classes | posixGroup | کلاس آبجکت گروهها در دایرکتوری |
| Preserve Group Inheritance | Off | در ساختار تخت posixGroup و عضویت مبتنی بر UID خاموش میماند |
| Membership LDAP Attribute | memberUid | attributeای که لیست اعضا در گروه با آن ذخیره شده |
| Membership Attribute Type | UID | نوع مقدار attribute عضویت؛ UID یعنی مقدار خام uid است، نه DN کامل |
| Membership User LDAP Attribute | uid | attribute متناظر در رکورد کاربر که با memberUid مقایسه میشود |
| Mode | IMPORT | گروهها را در Keycloak میسازد و در sync نگه میدارد |
| User Groups Retrieve Strategy | LOAD_GROUPS_BY_MEMBER_ATTRIBUTE | روش پیدا کردن گروههای هر کاربر؛ مناسب برای posixGroup |
| Member-Of LDAP Attribute | memberOf | مقدار پیشفرض؛ در ساختار posixGroup عملاً استفاده نمیشود |
| Drop non-existing groups during sync | Off | گروههایی که در LDAP نیستند را در Keycloak حذف نمیکند |
| Groups Path | / | مسیر ریشه برای ساخت گروهها در Keycloak |
- با کلیک روی Save ذخیره میشود.
- از دکمه Action در بالای صفحه، گزینه Sync LDAP Groups To Keycloak انتخاب میشود تا گروههای دایرکتوری (برای مثال
developersوadmins) فوری وارد Keycloak شوند.
پس از sync، گروهها از منوی Groups در کنسول ادمین قابل مشاهده هستند.
نگاشت گروههای LDAP به نقشهای Keycloak
پس از sync گروهها، میتوان به هر گروه یک یا چند Realm Role اختصاص داد. ابتدا اگر نقشهای موردنیاز هنوز ساخته نشدهاند، از منوی Realm roles (سمت چپ) ساخته میشوند.
سپس برای هر گروه:
- از منوی Groups، گروه موردنظر (برای مثال
admins) انتخاب میشود. - تب Role mapping انتخاب میشود.
- دکمه Assign role زده شده و از منوی کشویی آن، Realm roles انتخاب میشود.
- نقش موردنظر از لیست انتخاب و تأیید میشود.
برای مدیریت متمرکز دسترسیها، نقشها روی گروه تنظیم میشوند تا همه اعضای گروه آنها را به ارث ببرند. نقشهای مستقیمی که در Keycloak به یک کاربر اختصاص داده میشوند محلی هستند و همگامسازی معمول LDAP آنها را حذف نمیکند؛ بااینحال مدیریت گروهمحور از ایجاد دسترسیهای پراکنده جلوگیری میکند.
از این پس، هر کاربری که عضو آن گروه در LDAP باشد، نقش اختصاصدادهشده را در Keycloak به ارث میبرد. قرارگرفتن نقش در توکن به تنظیمات Role scope mapping و Mapperهای Client یا Client Scope نیز وابسته است.
قدم بعدی
پس از federate شدن کاربران از LDAP، برای اینکه یک اپ با همین کاربران SSO انجام دهد، باید Keycloak بهعنوان provider به آن اپ متصل شود:
راهنماییهای مرتبط
این راهنمایی کاربردی بود؟
با ثبت بازخوردتان در بهبود کیفیت مستندات مشارکت داشته باشید.