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

Credentials & OTP

user ทุกคนใน Keycloak มีแท็บ Credentials อยู่บนหน้าโปรไฟล์ของพวกเขา นี่คือที่ที่คุณจัดการความลับสำหรับ authentication ที่ผูกกับบัญชีนั้น Keycloak รองรับ credential หลายชนิด:

  • Password — credential ที่พบบ่อยที่สุด สามารถตั้งเป็นแบบถาวรหรือชั่วคราว (temporary) ได้
  • OTP (One-Time Password) — second factor แบบอิงเวลา (TOTP) หรืออิงตัวนับ (HOTP) โดยทั่วไปใช้ร่วมกับแอป authenticator เช่น Google Authenticator หรือ Authy

ผู้ดูแลระบบสามารถตั้งหรือรีเซ็ต credential ในนามของ user ได้ และยังสามารถบังคับให้ user ตั้งค่า credential ด้วยตนเองในการล็อกอินครั้งถัดไปได้ด้วย

  1. ใน admin console คลิก Users ในแถบด้านซ้าย
  2. ค้นหาและเปิด user ที่คุณต้องการตั้งหรือรีเซ็ต password
  3. คลิกแท็บ Credentials
  4. คลิก Set password
  5. ใส่ password ใหม่ในช่อง Password และยืนยันใน Password confirmation
  6. สลับสวิตช์ Temporary ไปที่ On หากคุณต้องการบังคับให้ user เลือก password ใหม่ในครั้งถัดไปที่พวกเขาล็อกอิน ปล่อยไว้ Off เพื่อตั้ง password เป็นแบบถาวร
  7. คลิก Save password เพื่อยืนยัน

flag Temporary เป็นความแตกต่างที่สำคัญ: เมื่อตั้งเป็น On, Keycloak จะทำเครื่องหมาย credential ว่าต้องการการอัปเดต ครั้งถัดไปที่ user ล็อกอิน พวกเขาจะถูกเปลี่ยนเส้นทางไปยังหน้า “Please update your password” ก่อนที่จะได้รับอนุญาตให้เข้าแอปพลิเคชัน นี่คือรูปแบบที่ถูกต้องสำหรับการรีเซ็ต password ที่ริเริ่มโดย admin — ผู้ดูแลระบบไม่จำเป็นต้องรู้ password ถาวรของ user เลย

curl -s -X PUT -H "Authorization: Bearer ${TOKEN}" -H "Content-Type: application/json" -d '{"type":"password","value":"TempPass123!","temporary":true}' http://localhost:8080/admin/realms/my-app/users/${USER_ID}/reset-password

แทนที่ TOKEN ด้วย admin access token ที่ถูกต้อง และ USER_ID ด้วย UUID ของ user (มองเห็นได้ใน URL เมื่อคุณเปิด user ใน admin console) ตั้งค่า "temporary": false หากคุณต้องการให้ password เป็นแบบถาวร

Keycloak รองรับ authentication สองปัจจัยผ่าน OTP การตั้งค่า OTP สำหรับ realm หนึ่งจะถูกกำหนดแบบ global ใน admin console และ user แต่ละรายลงทะเบียนอุปกรณ์ authenticator ของตัวเองผ่าน Account Console

  1. คลิก Realm settings ในแถบด้านซ้าย
  2. คลิกแท็บ Authentication ในแถบนำทางด้านบน
  3. คลิกแท็บ OTP policy
  4. ตรวจสอบและปรับการตั้งค่าต่อไปนี้:
    • OTP type — เลือก Time Based (TOTP) (แนะนำ; ใช้งานได้กับ Google Authenticator, Authy, และแอป authenticator ส่วนใหญ่) หรือ Counter Based (HOTP)
    • OTP hash algorithmSHA1 เป็นค่าเริ่มต้นและรองรับโดยแอป authenticator แทบทุกตัว SHA256 และ SHA512 ให้การ hash ที่แข็งแกร่งกว่าแต่ต้องการการรองรับจากแอป
    • Number of digits6 เป็นค่ามาตรฐาน; บางแอปรองรับ 8
    • OTP token period — สำหรับ TOTP, นี่คือจำนวนวินาทีที่แต่ละ code มีผล (ค่าเริ่มต้น: 30)
    • Look-ahead window — จำนวน interval ที่ Keycloak ยอมรับสำหรับความคลาดเคลื่อนของนาฬิกา (clock drift) ระหว่าง server กับอุปกรณ์ของ user
  5. คลิก Save

user ลงทะเบียนอุปกรณ์ OTP ของตัวเองผ่าน Keycloak Account Console:

  1. ไปที่ URL ของ Account Console สำหรับ realm ของคุณ: http://localhost:8080/realms/my-app/account/
  2. ลงชื่อเข้าใช้ด้วย credential ของ user
  3. คลิก Security ในเมนูด้านซ้าย
  4. คลิก Two-factor authentication (หรือ Signing in ขึ้นอยู่กับเวอร์ชัน Keycloak)
  5. ภายใต้ Two-factor authenticators คลิก Set up authenticator application
  6. สแกน QR code ที่แสดงด้วยแอป authenticator (Google Authenticator, Authy, Microsoft Authenticator ฯลฯ)
  7. ใส่รหัส 6 หลักที่แสดงในแอปเพื่อยืนยันอุปกรณ์ แล้วคลิก Submit

ตอนนี้อุปกรณ์ได้รับการลงทะเบียนแล้ว ตั้งแต่การล็อกอินครั้งถัดไปเป็นต้นไป Keycloak จะถามรหัส OTP หลังจากขั้นตอน password เมื่อ OTP ถูกกำหนดให้จำเป็นใน authentication flow

Keycloak ให้คุณบังคับใช้กฎ password ในระดับ realm ผ่าน Password policy กฎเหล่านี้จะมีผลทุกครั้งที่ user ตั้งหรือเปลี่ยน password ของตน

วิธีตั้งค่า password policy:

  1. คลิก Realm settings ในแถบด้านซ้าย
  2. คลิกแท็บ Authentication
  3. คลิกแท็บ Password policy
  4. คลิก Add policy และเลือกจากประเภท policy ที่มี:
Policyสิ่งที่บังคับใช้
Minimum lengthpassword ต้องมีความยาวอย่างน้อย N ตัวอักษร
Special characterspassword ต้องมีอักขระพิเศษอย่างน้อย N ตัว
Uppercase characterspassword ต้องมีตัวอักษรพิมพ์ใหญ่อย่างน้อย N ตัว
Lowercase characterspassword ต้องมีตัวอักษรพิมพ์เล็กอย่างน้อย N ตัว
Digitspassword ต้องมีตัวเลขอย่างน้อย N ตัว
Not recently usedpassword ต้องไม่ตรงกับ N password ล่าสุดของ user
Expire passwordpassword หมดอายุหลังจาก N วัน; user จะถูกบังคับให้เปลี่ยน
Password blacklistpassword ต้องไม่ปรากฏในไฟล์ blacklist ที่ตั้งค่าไว้
  1. ตั้งค่าให้กับแต่ละ policy ที่คุณเพิ่ม
  2. คลิก Save

policy จะถูกบังคับใช้ทันทีสำหรับการเปลี่ยน password ใหม่ทั้งหมด password ที่มีอยู่ก่อนหน้า policy จะไม่ถูกทำให้ใช้ไม่ได้ย้อนหลัง — มีเพียงการตั้งหรือรีเซ็ตใหม่เท่านั้นที่จะถูกตรวจสอบ

ตัวเลือกBenefitCost
ตั้ง password เป็น Temporary เมื่อ admin รีเซ็ตให้ userบังคับให้ user เปลี่ยน password ทันทีในการล็อกอินครั้งถัดไป admin ไม่ต้องรู้ password ถาวรของ user เลยuser ต้องผ่านขั้นตอนเปลี่ยน password เพิ่มก่อนเข้าแอปได้ ถ้าลืมจะล็อกอินไม่สำเร็จ
ตั้ง password เป็นแบบถาวรโดย admin (Temporary = Off)สะดวกสำหรับ flow ที่ user ไม่สามารถเปลี่ยน password เองได้ทันที (เช่น service account)admin รู้ password จริงของบัญชี เป็นความเสี่ยงด้านความปลอดภัย ควรใช้เท่าที่จำเป็นเท่านั้น
บังคับ OTP (2FA) เพิ่มจาก passwordเพิ่มชั้นความปลอดภัย แม้ password รั่วผู้โจมตีก็ยังต้องมี OTP deviceเพิ่มขั้นตอนให้ user ทุกครั้งที่ล็อกอิน และต้องมี fallback รองรับกรณี user ทำอุปกรณ์ authenticator หาย
  • ไม่ตั้ง password policy เลย — ปล่อยให้ user ตั้ง password อ่อนแอ เช่น สั้นเกินไปหรือไม่มีอักขระพิเศษ ควรบังคับอย่างน้อย Minimum length และ Not recently used
  • รีเซ็ต password ให้ user แล้วไม่ติ๊ก Temporary — ทำให้ password ที่ admin ตั้งกลายเป็นความลับถาวรที่ admin รู้ ควรเปิด Temporary ทุกครั้งที่ตั้ง password แทน user
  • เปิด OTP บังคับแต่ไม่มี fallback ที่ปลอดภัย — ถ้า user ทำอุปกรณ์ authenticator หายแล้วไม่มีกระบวนการ recovery ที่รัดกุม (เช่น ให้ admin ลบ OTP credential ผ่าน authentication อีกทาง) จะกลายเป็นช่องโหว่หรือทำให้ user ล็อกอินไม่ได้ถาวร

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

ธนาคารออนไลน์ — บังคับ OTP policy แบบ TOTP กับทุกบัญชี พร้อมตั้ง password policy ที่เข้มงวด (Minimum length, Special characters, Expire password ทุก 90 วัน) เพื่อให้เป็นไปตามมาตรฐานความปลอดภัยของอุตสาหกรรมการเงิน

ทีม IT support ขององค์กร — เวลาพนักงานลืม password จะรีเซ็ตผ่าน Admin REST API พร้อมตั้ง "temporary": true เสมอ เพื่อบังคับให้พนักงานตั้ง password ใหม่ของตัวเองทันทีที่ล็อกอิน โดยที่ทีม support ไม่มีทางรู้ password จริงของใครเลย

การเปิด flag "Temporary" เมื่อตั้ง password ทำอะไร?
ใน admin console คุณตั้งค่า OTP type, algorithm, และ token period สำหรับ realm ได้ที่ไหน?
user ลงทะเบียนอุปกรณ์ OTP authenticator ของตัวเองใน Keycloak อย่างไร?
password policy ใดที่ป้องกันไม่ให้ user นำ password ล่าสุดมาใช้ซ้ำ?