• SAML (Single Assertion Markup Language) เป็นมาตรฐานที่กำหนดกฎสำหรับการแลกเปลี่ยนข้อความด้านความปลอดภัยในรูปแบบ XML
  • โดยหลักแล้วใช้สำหรับการแลกเปลี่ยนข้อความระหว่างเอนทิตีอิสระตั้งแต่ 3 ฝ่ายขึ้นไป
    • สถานการณ์ทั่วไปคือมีระบบซอฟต์แวร์สองระบบจากคนละบริษัทและมีผู้ใช้เข้ามาเกี่ยวข้อง
    • ทั้งสองระบบจำเป็นต้องแลกเปลี่ยนข้อมูลเกี่ยวกับผู้ใช้
    • จะทำอินทิเกรชันแบบคัสตอมก็ได้ แต่ดูแลรักษายาก
  • SAML ช่วยลดความซับซ้อนของงานอินทิเกรชันโดยทำให้ระบบต่างๆ ปฏิบัติตามกฎเดียวกัน

รูปแบบข้อความของ SAML

  • ข้อความ SAML อยู่ในรูปแบบ XML
  • กำหนดไวยากรณ์ของข้อความและบอกวิธีจัดการเนื้อหาของข้อความอย่างปลอดภัย
  • เมื่อได้รับแท็ก <Response> ก็จะรู้ว่าต้องมองหาแท็ก <Assertion> เป็นต้น
  • มีแนวทางเกี่ยวกับลักษณะของลายเซ็นดิจิทัล และวิธีจัดการข้อความเพื่อหลีกเลี่ยงปัญหาด้านความปลอดภัย

ความยืดหยุ่นของ SAML

  • SAML ถูกออกแบบมาโดยเน้นความยืดหยุ่น ตามหลักการแล้วสามารถทำงานได้หลายอย่างด้วย SAML แต่ความยืดหยุ่นนั้นก็นำไปสู่ความซับซ้อน
  • ข้อกำหนดของ SAML มีข้อยกเว้นจำนวนมาก และมีเงื่อนไข if พร้อมตัวอย่างมากมาย ทำให้เกิด edge case เพิ่มขึ้น
  • เพราะ SAML มีมานานแล้ว บางคนจึงใช้ประโยชน์จากความยืดหยุ่นนี้
  • ในสภาพแวดล้อมการใช้งานจริง โดยเฉพาะระบบ legacy บางครั้ง SAML อาจทำงานผิดปกติ
  • ส่วนใหญ่แล้ว ชีวิตจะง่ายกว่ามากถ้าโฟกัสแค่กับชุดย่อยเล็กๆ ของ SAML

จุดประสงค์การใช้งานจริงของ SAML

  • SAML ใช้เป็นหลักสำหรับ Single Sign-On (SSO)
  • SAML กำหนด SSO บางรูปแบบที่ค่อนข้างแปลกไว้ด้วย แต่โดยทั่วไปจะใช้ Web Browser SSO Profile
  • ผู้ใช้ปลายทางจะยืนยันตัวตนกับระบบศูนย์กลางก่อน แล้วจึงเข้าถึงซอฟต์แวร์แอปพลิเคชันที่ต้องการ
  • ผู้ใช้จะไม่ยืนยันตัวตนกับแอปพลิเคชันโดยตรง
  • ตัวอย่างเช่น หากคุณเคยใช้ Okta เพื่อเข้าถึงอีเมล นั่นก็คือการใช้ Web Browser SSO Profile

เอนทิตีที่เกี่ยวข้องกับ SSO

  • ใน SSO มีผู้เกี่ยวข้อง 3 ฝ่าย:
    1. ผู้ใช้: คนที่ต้องการใช้แอปพลิเคชัน
    2. ผู้ให้บริการ (SP): ตัวแอปพลิเคชันเอง
    3. ผู้ให้บริการตัวตน (IDP): บริการศูนย์กลางที่ผู้ใช้ใช้สำหรับการยืนยันตัวตน
  • IDP ของลูกค้าแต่ละรายสามารถมองได้เหมือนฐานข้อมูลที่ใช้ติดตามข้อมูลของผู้คน
    • บริษัทมักใช้ผู้ให้บริการตัวตนเพื่อจัดพนักงานเข้าแผนกและมอบสิทธิ์ต่างๆ
  • ทุกครั้งที่ล็อกอินผู้ใช้ผ่าน SAML จำเป็นต้องดึงข้อมูลจาก IDP ใน SSO มักเป็นการขอให้ IDP ยืนยันตัวตนของผู้ใช้
  • จำเป็นต้องมีความสัมพันธ์ด้านความเชื่อถือที่ตั้งค่าไว้ล่วงหน้ากับ IDP
    • ลูกค้าทุกรายที่ใช้ SAML SSO ต้องมีการตั้งค่าของตัวเองในแอปพลิเคชัน
    • แต่ไม่ได้สื่อสารด้วยข้อความกับ IDP โดยตรง ใน SAML SSO ผู้ให้บริการและผู้ให้บริการตัวตนจะสื่อสารกันผ่านเบราว์เซอร์ของผู้ใช้

วิธีที่เอนทิตีใน SAML โต้ตอบกัน

  • กระบวนการ SAML SSO ทั่วไป:
    1. ผู้ใช้พยายามเข้าถึงบางส่วนของแอปพลิเคชันผ่านเว็บเบราว์เซอร์
    2. ตรวจสอบว่าผู้ใช้มี security context ที่ใช้งานได้หรือไม่
    3. เนื่องจากผู้ใช้ไม่มี security context ที่ใช้งานได้ จึงแสดงหน้าเข้าสู่ระบบ
    4. เมื่อผู้ใช้ป้อนข้อมูลบางอย่าง (เช่น ที่อยู่อีเมล) ข้อมูลนั้นจะถูกใช้เพื่อตัดสินใจเลือกวิธีล็อกอินที่เหมาะสม
    5. รีไดเรกต์ผู้ใช้ไปยังที่อยู่เว็บของ IDP และส่งข้อความ SAML ไปยัง IDP ผ่านเบราว์เซอร์ของผู้ใช้
    6. IDP แสดงข้อความให้ผู้ใช้กรอกข้อมูลรับรอง และผู้ใช้ยืนยันตัวตนสำเร็จ
    7. IDP รีไดเรกต์ผู้ใช้กลับมายังแอปพลิเคชันพร้อมข้อความ SAML ที่ส่งข้อมูลเกี่ยวกับการยืนยันตัวตนของผู้ใช้
    8. ประมวลผลข้อความ SAML และตัดสินใจว่าควรตั้งค่า security context สำหรับผู้ใช้
    9. อนุญาตให้ผู้ใช้เข้าถึงส่วนที่ต้องการของแอปพลิเคชัน
  • สามารถเริ่มกระบวนการ SAML SSO จากฝั่งผู้ให้บริการตัวตนได้เช่นกัน
  • ในกรณีนี้จะได้รับการตอบกลับการยืนยันตัวตนโดยไม่ต้องส่งคำขอยืนยันตัวตน
  • เมื่อนำการรองรับ SAML SSO ไปใช้งาน ควรเตรียมพร้อมรองรับ SSO ที่เริ่มต้นจาก IDP

ข้อความที่มีการแลกเปลี่ยนใน SAML

  • ใน SAML SSO มีข้อความหลักอยู่ 2 ประเภทที่ควรสนใจ
    • ข้อความที่ส่งจากผู้ให้บริการไปยัง IDP เรียกว่า SAML request
    • ข้อความที่ส่งกลับจาก IDP ไปยังผู้ให้บริการเรียกว่า SAML response
  • SAML request จริงๆ แล้วไม่ซับซ้อนมาก แค่ส่ง XML ผ่าน HTTP redirect ก็เพียงพอ
  • ใส่ ID ลงในแท็ก <AuthnRequest> เพื่อให้ IDP สามารถส่ง <Response> ที่เชื่อมโยงกับคำขอเดิมกลับมาได้
  • ข้อมูลที่ครอบด้วยแท็ก <Issuer> ก็จะถูกส่งไปยัง IDP ด้วยเพื่อบอกว่าคือใคร
  • SAML response ยุ่งยากกว่า โดยทั่วไปจะส่งผ่าน POST
  • <Response> ในเชิงแนวคิดจะครอบแท็ก <Assertion> อยู่หลายรายการ
  • <Assertion> จะครอบ claims เกี่ยวกับผู้ใช้ (เป็นใคร ยืนยันตัวตนกับ IDP อย่างไร เป็นต้น)
  • ประมวลผล Assertion เพื่อตัดสินใจว่าจะล็อกอินผู้ใช้หรือไม่

ข้อควรระวัง

  • ที่นี่ได้ละรายละเอียดไว้มาก โดยเฉพาะส่วนที่สำคัญต่อความปลอดภัย
  • ถ้าคุณไม่ได้สนใจ SAML เป็นการส่วนตัว หรือไม่มีเหตุผลทางอาชีพที่ต้องศึกษามันอย่างลึกซึ้ง ก็ไม่แนะนำให้ลงมือทำระบบล็อกอินที่อิง SAML เอง เพราะเสียเวลา
  • หากต้องการตั้งค่า SAML ให้เร็วที่สุด เรามีโอเพนซอร์ส SSOReady ที่ช่วย abstract SAML ไว้ให้ ซึ่งจะช่วยประหยัดเวลาและความปวดหัวได้มาก

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น