ข้ามไปยังเนื้อหา

LDAP User Federation

User federation ช่วยให้ Keycloak อ่าน (และอาจเขียน) บัญชีผู้ใช้จาก external store แทน database ภายในของตัวเอง Store ที่พบบ่อยที่สุดคือ LDAP (Lightweight Directory Access Protocol) ที่เป็น protocol ที่ใช้โดย:

  • OpenLDAP — LDAP server แบบ open-source
  • Microsoft Active Directory (AD) — enterprise directory service ที่พบในเครือข่ายองค์กรส่วนใหญ่
  • Apache Directory Server, 389 Directory Server และอื่น ๆ

เมื่อผู้ใช้พยายาม login Keycloak จะค้นหาพวกเขาใน LDAP directory และมอบหมายการตรวจสอบรหัสผ่านให้กับ LDAP bind จากมุมมองผู้ใช้ พวกเขาแค่ login ด้วย credentials directory ที่ใช้ปกติ

  1. ใน admin console ตรวจสอบว่าอยู่ในรีล์มที่ถูกต้อง
  2. คลิก User federation ใน left sidebar
  3. คลิก Add provider และเลือก LDAP
  4. Keycloak แสดงฟอร์มตั้งค่า LDAP

กรอกรายละเอียดการเชื่อมต่อ:

ช่องสิ่งที่ต้องกรอก
Vendorเลือก Active Directory สำหรับ AD หรือ Other สำหรับ OpenLDAP ซึ่งจะกรอกค่าเริ่มต้น DN structures และ attributes ที่เหมาะสม
Connection URLURI ของ LDAP server เช่น ldap://ldap.example.com:389 หรือ ldaps://ldap.example.com:636 (LDAPS สำหรับการเข้ารหัส)
Enable StartTLSทางเลือกที่นิยมแทน LDAPS สำหรับเข้ารหัสการเชื่อมต่อบน port 389
Connection poolingเปิดใช้ใน production เพื่อนำ LDAP connections กลับมาใช้

คลิก Test connection เพื่อยืนยันว่า Keycloak เข้าถึง server ได้ก่อนทำต่อ

Keycloak ต้องใช้ service account เพื่อค้นหา directory เรียกว่า bind DN

ช่องสิ่งที่ต้องกรอก
Bind typesimple สำหรับ username/password bind
Bind DNDistinguished name ของ service account เช่น cn=keycloak-svc,ou=service-accounts,dc=example,dc=com
Bind credentialsรหัสผ่าน service account เก็บใน Keycloak vault หรือ environment variable — ห้าม hardcode

คลิก Test authentication เพื่อยืนยันว่า bind credentials ทำงานได้

ช่องสิ่งที่ต้องกรอก
Users DNBase DN สำหรับค้นหาผู้ใช้ เช่น ou=users,dc=example,dc=com
Username LDAP attributeLDAP attribute ที่ map กับ Keycloak username สำหรับ AD ใช้ sAMAccountName สำหรับ OpenLDAP ใช้ uid
RDN LDAP attributeโดยทั่วไปคือ cn หรือเหมือนกับ username attribute
UUID LDAP attributeสำหรับ AD: objectGUID สำหรับ OpenLDAP: entryUUID ใช้เป็น internal user ID ของ Keycloak
User object classesสำหรับ AD: person, organizationalPerson, user สำหรับ OpenLDAP: inetOrgPerson, organizationalPerson

สองการตั้งค่านี้กำหนดวิธีที่ Keycloak sync ผู้ใช้และจะเขียนกลับไปยัง LDAP หรือไม่

READ_ONLY — Keycloak ไม่สามารถแก้ไข LDAP attributes ใด ๆ การเปลี่ยนรหัสผ่านถูกปฏิเสธ ใช้สำหรับ corporate AD ที่ Keycloak ไม่ควรแตะต้อง directory
WRITABLE — Keycloak สามารถอัปเดต LDAP attributes และ sync การเปลี่ยนรหัสผ่านกลับไปยัง LDAP ใช้เฉพาะเมื่อ Keycloak ได้รับอนุญาตให้เขียนใน directory
UNSYNCED — Keycloak เก็บการเปลี่ยนแปลง attributes ในเครื่อง (ใน DB ของตัวเอง) โดยไม่เขียนไปยัง LDAP
# Recommended default for most deployments
Edit mode: READ_ONLY
  • On (ค่าเริ่มต้น) — Keycloak import ข้อมูลผู้ใช้เข้า local database เมื่อ login ครั้งแรกและหลัง sync แต่ละครั้ง การค้นหาเร็วเพราะ query จาก local DB
  • Off — Keycloak query LDAP ทุกครั้งที่ login เก็บข้อมูลในเครื่องน้อยกว่า แต่ทุก authentication ต้องผ่าน LDAP server
  1. คลิก Save
  2. กลับไปที่หน้า User federation เปิด LDAP provider ของคุณ
  3. เลื่อนลงไปที่ส่วน Synchronization
  4. คลิก Synchronize all users เพื่อ sync ทั้งหมดทันที หรือตั้งค่า Changed users sync ให้รันตามกำหนดเวลา

หลัง sync ไปที่ Users ใน left sidebar คุณควรเห็นผู้ใช้ LDAP พร้อม badge “federated”

ตัวเลือกBenefitCost
READ_ONLYปลอดภัยที่สุด — Keycloak ไม่มีทางเขียนกลับไปยัง LDAP ไม่มีความเสี่ยงที่จะทำ directory ขององค์กรพัง เหมาะกับ corporate AD ที่ฝ่าย IT เป็นเจ้าของผู้ใช้เปลี่ยนรหัสผ่านหรือ profile ผ่าน Keycloak ไม่ได้ ต้องไปเปลี่ยนที่ระบบต้นทาง (เช่น AD) เอง
WRITABLEผู้ใช้เปลี่ยนรหัสผ่านหรือ attributes ผ่าน Keycloak ได้โดยตรง สะดวกสำหรับ self-serviceKeycloak มีสิทธิ์เขียนเข้า production directory — ถ้า config ผิดพลาดหรือ service account ถูกโจมตี อาจกระทบข้อมูลจริงใน LDAP/AD ทั้งองค์กร
UNSYNCEDเก็บการเปลี่ยนแปลง attributes ไว้ในเครื่อง (local DB) โดยไม่แตะ LDAP เลย — ยืดหยุ่นสำหรับ attribute เสริมที่ LDAP ไม่มีข้อมูลใน Keycloak กับ LDAP อาจไม่ตรงกัน (diverge) เมื่อเวลาผ่านไป เพราะ local override ไม่ sync กลับไปยัง source of truth
  • Import ผู้ใช้ทั้งหมดแบบ unpaged จาก directory ขนาดใหญ่ — ถ้า directory มีผู้ใช้หลักหมื่นหลักแสน การ sync แบบไม่แบ่งหน้า (paging) อาจทำให้ LDAP server หรือ Keycloak เองล่มจาก memory/timeout ควรตั้งค่า batch size และใช้ paged search ที่ LDAP server รองรับ
  • ตั้ง edit mode เป็น WRITABLE โดยไม่ได้รับอนุมัติจากฝ่ายที่ดูแล directory — Keycloak จะกลายเป็น client ที่เขียนเข้า production AD/LDAP ได้ทันที ซึ่งเสี่ยงต่อการทำข้อมูลพนักงานเสียหายถ้า mapping ผิด ควรเริ่มจาก READ_ONLY เสมอแล้วค่อยขยับถ้าจำเป็นจริง ๆ
  • ไม่ตั้งค่า Connection pooling หรือ scheduled sync ใน production — การ query LDAP ตรงทุกครั้งที่ login (import off) โดยไม่มี connection pooling ทำให้ LDAP server รับ load สูงเกินจำเป็นเมื่อผู้ใช้เยอะพร้อมกัน

💡 ตัวอย่างจากของจริง

องค์กรที่ bridge Keycloak เข้ากับ Active Directory เดิม — พนักงานยังคง login ด้วยรหัสผ่าน AD เดิมที่ใช้อยู่แล้วสำหรับ Windows login และอีเมล โดยไม่ต้องจำรหัสผ่านใหม่หรือสร้างบัญชี Keycloak แยกต่างหาก IT ทีมยังคงควบคุม password policy ผ่าน AD เหมือนเดิม

บริษัทที่มี OpenLDAP เป็นแหล่งข้อมูลพนักงานกลาง — ใช้ LDAP federation แบบ READ_ONLY เพื่อให้ระบบ internal tools ทั้งหมดที่ผ่าน Keycloak เห็นผู้ใช้ชุดเดียวกัน โดยไม่ต้อง sync ข้อมูลไปมาระหว่างระบบหลายตัว

ควรใช้ LDAP attribute อะไรเป็น username สำหรับ Active Directory?
LDAP edit mode READ_ONLY หมายความว่าอะไร?
จุดประสงค์ของ bind DN ใน LDAP federation คืออะไร?
เมื่อปิด "Import users" จะเกิดอะไรขึ้นทุกครั้งที่ login?