SAML là gì?
SAML (Security Assertion Markup Language) là chuẩn mở dựa trên XML để trao đổi dữ liệu xác thực (authentication) và ủy quyền (authorization) giữa Identity Provider (IdP) và Service Provider (SP). Phiên bản hiện tại: SAML 2.0 (2005).
3 Vai trò chính trong SAML
| Vai trò | Mô tả | Ví dụ |
| Principal (User) | Người dùng cuối cần truy cập dịch vụ | Nhân viên đăng nhập |
| Identity Provider (IdP) | Xác thực người dùng, phát hành SAML Assertion | Microsoft Entra ID, Okta, Ping Identity, Keycloak, AD FS |
| Service Provider (SP) | Nhận Assertion, cho phép truy cập tài nguyên | Salesforce, Google Workspace, Box, Zoom, AWS Console, GitHub |
Luồng hoạt động SAML 2.0 (SP-Initiated SSO)
- User truy cập SP (ví dụ: salesforce.com)
- SP redirect user đến IdP với SAML AuthnRequest
- User đăng nhập tại IdP (MFA, password, certificate...)
- IdP tạo SAML Assertion (chữ ký số, encrypted) → POST về SP qua browser (HTTP POST Binding)
- SP xác thực chữ ký IdP, kiểm tra điều kiện (NotBefore/NotOnOrAfter, Audience, Recipient)
- SP tạo session cho user → Cho phép truy cập
Cấu trúc SAML Assertion (3 loại Statement)
| Loại Statement | Mục đích | Nội dung chính |
| Authentication Statement | Xác thực danh tính | AuthnInstant, AuthnContextClassRef (Password, MFA, Kerberos...), Subject |
| Attribute Statement | Truyền thuộc tính người dùng | Email, Name, Department, Roles, Groups, EmployeeID |
| Authorization Decision Statement | Quyết định ủy quyền | Permit/Deny action trên resource (ít dùng, thường dùng RBAC/ABAC riêng) |
4 Thành phần cốt lõi SAML
- Assertions: Gói tin chứa thông tin xác thực/thuộc tính (XML đã ký/mã hóa)
- Protocol: Các message request/response (AuthnRequest, Response, LogoutRequest...)
- Bindings: Cách truyền tải protocol qua transport (HTTP Redirect, HTTP POST, Artifact, SOAP)
- Profiles: Kết hợp assertions + protocols + bindings cho use case cụ thể (SSO, SLO, IdP Discovery)
SAML vs OIDC/OAuth 2.0
| Đặc điểm | SAML 2.0 | OIDC/OAuth 2.0 |
| Định dạng | XML | JSON (JWT) |
| Use case chính | Enterprise SSO, Federation | API Authorization, Mobile/SPA, Modern Apps |
| Token | SAML Assertion (XML) | ID Token (JWT) + Access Token |
| Kích thước | Lớn (XML verbose) | Nhỏ, gọn (JWT compact) |
| Mobile-friendly | Khó (XML parsing) | Rất tốt (JSON native) |
| Session Management | SAML Session Index, SLO | Refresh Token, Revocation |
Ứng dụng thực tế
- Enterprise SSO: Một lần đăng nhập (IdP) → Truy cập Salesforce, Office 365, Slack, Zoom, Workday, ServiceNow...
- Federation B2B: Partner IdP → SP của công ty bạn (Cross-domain trust)
- Government/Healthcare: Yêu cầu SAML cho compliance (FIPS, HIPAA)
- AWS Console Federation: Corporate IdP → AWS IAM Role via SAML
Lưu ý bảo mật SAML
- Luôn ký số (Sign) Assertion - IdP ký bằng private key, SP verify bằng public key (certificate)
- Mã hóa Assertion (EncryptedAssertion) cho dữ liệu nhạy cảm (Attribute Statement)
- Kiểm tra Audience Restriction (SP Entity ID) và Recipient (ACS URL)
- Validate NotBefore / NotOnOrAfter (thời gian hiệu lực)
- Bảo vệ IdP: MFA bắt buộc, Hardened OS, Monitoring
- Chống Replay Attack: SP lưu Assertion ID (InResponseTo) đã dùng