- 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 ฝ่าย:
- ผู้ใช้: คนที่ต้องการใช้แอปพลิเคชัน
- ผู้ให้บริการ (SP): ตัวแอปพลิเคชันเอง
- ผู้ให้บริการตัวตน (IDP): บริการศูนย์กลางที่ผู้ใช้ใช้สำหรับการยืนยันตัวตน
- IDP ของลูกค้าแต่ละรายสามารถมองได้เหมือนฐานข้อมูลที่ใช้ติดตามข้อมูลของผู้คน
- บริษัทมักใช้ผู้ให้บริการตัวตนเพื่อจัดพนักงานเข้าแผนกและมอบสิทธิ์ต่างๆ
- ทุกครั้งที่ล็อกอินผู้ใช้ผ่าน SAML จำเป็นต้องดึงข้อมูลจาก IDP ใน SSO มักเป็นการขอให้ IDP ยืนยันตัวตนของผู้ใช้
- จำเป็นต้องมีความสัมพันธ์ด้านความเชื่อถือที่ตั้งค่าไว้ล่วงหน้ากับ IDP
- ลูกค้าทุกรายที่ใช้ SAML SSO ต้องมีการตั้งค่าของตัวเองในแอปพลิเคชัน
- แต่ไม่ได้สื่อสารด้วยข้อความกับ IDP โดยตรง ใน SAML SSO ผู้ให้บริการและผู้ให้บริการตัวตนจะสื่อสารกันผ่านเบราว์เซอร์ของผู้ใช้
วิธีที่เอนทิตีใน SAML โต้ตอบกัน
- กระบวนการ SAML SSO ทั่วไป:
- ผู้ใช้พยายามเข้าถึงบางส่วนของแอปพลิเคชันผ่านเว็บเบราว์เซอร์
- ตรวจสอบว่าผู้ใช้มี security context ที่ใช้งานได้หรือไม่
- เนื่องจากผู้ใช้ไม่มี security context ที่ใช้งานได้ จึงแสดงหน้าเข้าสู่ระบบ
- เมื่อผู้ใช้ป้อนข้อมูลบางอย่าง (เช่น ที่อยู่อีเมล) ข้อมูลนั้นจะถูกใช้เพื่อตัดสินใจเลือกวิธีล็อกอินที่เหมาะสม
- รีไดเรกต์ผู้ใช้ไปยังที่อยู่เว็บของ IDP และส่งข้อความ SAML ไปยัง IDP ผ่านเบราว์เซอร์ของผู้ใช้
- IDP แสดงข้อความให้ผู้ใช้กรอกข้อมูลรับรอง และผู้ใช้ยืนยันตัวตนสำเร็จ
- IDP รีไดเรกต์ผู้ใช้กลับมายังแอปพลิเคชันพร้อมข้อความ SAML ที่ส่งข้อมูลเกี่ยวกับการยืนยันตัวตนของผู้ใช้
- ประมวลผลข้อความ SAML และตัดสินใจว่าควรตั้งค่า security context สำหรับผู้ใช้
- อนุญาตให้ผู้ใช้เข้าถึงส่วนที่ต้องการของแอปพลิเคชัน
- สามารถเริ่มกระบวนการ 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 ไว้ให้ ซึ่งจะช่วยประหยัดเวลาและความปวดหัวได้มาก
ยังไม่มีความคิดเห็น