LDAP User Federation
User federation คืออะไร?
หัวข้อที่มีชื่อว่า “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 — เพิ่ม LDAP provider
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 1 — เพิ่ม LDAP provider”- ใน admin console ตรวจสอบว่าอยู่ในรีล์มที่ถูกต้อง
- คลิก User federation ใน left sidebar
- คลิก Add provider และเลือก LDAP
- Keycloak แสดงฟอร์มตั้งค่า LDAP
ขั้นตอนที่ 2 — Connection settings
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 2 — Connection settings”กรอกรายละเอียดการเชื่อมต่อ:
| ช่อง | สิ่งที่ต้องกรอก |
|---|---|
| Vendor | เลือก Active Directory สำหรับ AD หรือ Other สำหรับ OpenLDAP ซึ่งจะกรอกค่าเริ่มต้น DN structures และ attributes ที่เหมาะสม |
| Connection URL | URI ของ 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 ได้ก่อนทำต่อ
ขั้นตอนที่ 3 — Bind settings
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 3 — Bind settings”Keycloak ต้องใช้ service account เพื่อค้นหา directory เรียกว่า bind DN
| ช่อง | สิ่งที่ต้องกรอก |
|---|---|
| Bind type | simple สำหรับ username/password bind |
| Bind DN | Distinguished 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 ทำงานได้
ขั้นตอนที่ 4 — LDAP searching และ user DN
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 4 — LDAP searching และ user DN”| ช่อง | สิ่งที่ต้องกรอก |
|---|---|
| Users DN | Base DN สำหรับค้นหาผู้ใช้ เช่น ou=users,dc=example,dc=com |
| Username LDAP attribute | LDAP 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 |
ขั้นตอนที่ 5 — Edit mode และ import
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 5 — Edit mode และ import”สองการตั้งค่านี้กำหนดวิธีที่ Keycloak sync ผู้ใช้และจะเขียนกลับไปยัง LDAP หรือไม่
Edit mode
หัวข้อที่มีชื่อว่า “Edit mode”READ_ONLY — Keycloak ไม่สามารถแก้ไข LDAP attributes ใด ๆ การเปลี่ยนรหัสผ่านถูกปฏิเสธ ใช้สำหรับ corporate AD ที่ Keycloak ไม่ควรแตะต้อง directoryWRITABLE — Keycloak สามารถอัปเดต LDAP attributes และ sync การเปลี่ยนรหัสผ่านกลับไปยัง LDAP ใช้เฉพาะเมื่อ Keycloak ได้รับอนุญาตให้เขียนใน directoryUNSYNCED — Keycloak เก็บการเปลี่ยนแปลง attributes ในเครื่อง (ใน DB ของตัวเอง) โดยไม่เขียนไปยัง LDAP# Recommended default for most deployments
Edit mode: READ_ONLYImport users
หัวข้อที่มีชื่อว่า “Import users”- On (ค่าเริ่มต้น) — Keycloak import ข้อมูลผู้ใช้เข้า local database เมื่อ login ครั้งแรกและหลัง sync แต่ละครั้ง การค้นหาเร็วเพราะ query จาก local DB
- Off — Keycloak query LDAP ทุกครั้งที่ login เก็บข้อมูลในเครื่องน้อยกว่า แต่ทุก authentication ต้องผ่าน LDAP server
ขั้นตอนที่ 6 — Sync และ Save
หัวข้อที่มีชื่อว่า “ขั้นตอนที่ 6 — Sync และ Save”- คลิก Save
- กลับไปที่หน้า User federation เปิด LDAP provider ของคุณ
- เลื่อนลงไปที่ส่วน Synchronization
- คลิก Synchronize all users เพื่อ sync ทั้งหมดทันที หรือตั้งค่า Changed users sync ให้รันตามกำหนดเวลา
หลัง sync ไปที่ Users ใน left sidebar คุณควรเห็นผู้ใช้ LDAP พร้อม badge “federated”
ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
READ_ONLY | ปลอดภัยที่สุด — Keycloak ไม่มีทางเขียนกลับไปยัง LDAP ไม่มีความเสี่ยงที่จะทำ directory ขององค์กรพัง เหมาะกับ corporate AD ที่ฝ่าย IT เป็นเจ้าของ | ผู้ใช้เปลี่ยนรหัสผ่านหรือ profile ผ่าน Keycloak ไม่ได้ ต้องไปเปลี่ยนที่ระบบต้นทาง (เช่น AD) เอง |
WRITABLE | ผู้ใช้เปลี่ยนรหัสผ่านหรือ attributes ผ่าน Keycloak ได้โดยตรง สะดวกสำหรับ self-service | Keycloak มีสิทธิ์เขียนเข้า 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 ข้อมูลไปมาระหว่างระบบหลายตัว