Security Assertion Markup Language (SAML) 是一種開放標準,用於在各方之間交換身份驗證和授權數據,特別是在身份提供者和服務提供者之間。SAML 是一種基於 XML 的標記語言,用於安全聲明,被用於單點登錄 (SSO) 和身份聯盟。它通常用於企業環境中的身份驗證和授權目的。
標準 SAML 認證流程#
- 用戶請求訪問充當服務提供者 (SP) 的客戶端應用程序。
- SP 向身份提供者 (IdP) 發送 SAML SSO 驗證請求並將用戶重定向到 IdP。
- 如果用戶尚未驗證,則 IdP 會提示用戶輸入憑據。
- 用戶輸入憑據,然後 IdP 驗證用戶身份。
- IdP 發送包含用戶身份驗證狀態和屬性的 SAML 回應聲明給 SP,然後將用戶重定向回 SP。
- SP 接收 SAML 回應聲明,驗證它,然後授予用戶訪問權限。
SAML 的安全因素#
SP 實體 ID#
將 SP 實體 ID 視為 SAML 認證上下文中 SP 的唯一徽章。它就像一個指紋,幫助 IdP 在交互過程中識別 SP。此 ID 是 SP 元數據的關鍵部分,與 IdP 共享以建立信任並確保安全通信。
SP 實體 ID 的用法:
- 元數據註冊:
EntityID 屬性是 SP 元數據的一部分,與 IdP 共享以建立信任關係。它作為一個唯一標識符來定位 SP 的元數據並獲取 SAML 交互所需的配置詳情。
- 驗證請求:SP 實體 ID 包含在發送給 IdP 的 SAML 驗證請求中,明確識別請求的 SP。IdP 使用此資訊驗證請求並確定適當的認證上下文。
- 聲明受眾:在用戶身份驗證成功後,SP 實體 ID 包含在 SAML 聲明中作為受眾限制。此措施確保聲明僅專為指定的 SP 創建,不能被其他 SP 濫用。
IdP 實體 ID#
相反地,IdP 實體 ID 是 IdP 的專用標籤。它有助於在 SAML 生態系統中識別 IdP,讓 SP 容易找到它。此 ID 包含在 IdP 的元數據中,並與 SP 共享,以建立信任關係和安全連接。
IdP 實體 ID 的使用:
- 元數據註冊:
EntityID 屬性也包括在 IdP 的元數據中,與 SP 共享以建立信任關係。它作為一個唯一標識符來定位 IdP 的元數據並獲取必要的配置細節,以便 SP 驗證 SAML 回應。
- 聲明發行者:當 IdP 生成 SAML 聲明時,它包括其實體 ID 作為發行者。此屬性指示發行聲明的實體,幫助 SP 驗證聲明的真實性和完整性。
中繼狀態#
中繼狀態是 SAML 認證中用於在 SP 和 IdP 之間傳遞狀態信息的參數。它在 SP 啟動和 IdP 啟動的 SSO 流中作為橋樑,用於在身份驗證過程中保留用戶的上下文和會話狀態。
中繼狀態的用法:
- 維護用戶上下文:中繼狀態允許 SP 在身份認證過程中將額外的信息傳遞給 IdP。此信息可以包括用戶的會話狀態、應用程序上下文或需要在 SAML 流中被保留的任何其他相關數據,如用戶在認證前訪問的應用程序的 URL 或會話 ID。
- 防止 CSRF 攻擊:中繼狀態在防止在 SAML 認證期間的跨站請求偽造 (CSRF) 攻擊中是至關重要的。通過在認證請求中包括一個唯一且不可預測的中繼狀態值,SP 可以驗證 SAML 回應的完整性,確保它符合原始請求。
聲明簽名#
聲明簽名是 SAML 中的一個關鍵安全功能,確保 SAML 聲明的完整性、真實性和不可否認性。它涉及使用 IdP 的私鑰對 SAML 聲明進行數字簽名,允許 SP 驗證聲明的來源並檢測任何篡改嘗試。
聲明簽名如何工作:
- 密鑰對生成:IdP 生成一對公私密鑰,其中私鑰用於簽署 SAML 聲明,而公共密鑰則與 SP 共享以供驗證。這種非對稱加密方案確保只有 IdP 可以簽署聲明,而 SP 可以驗證它。
- 共享證書:IdP 向 SP 提供其公鑰證書,該證書包含用於驗證聲明簽名的公鑰。通常,此證書將是 IdP 元數據的一部分,或者 SP 可以通過安全下載過程獲取它。
- 聲明簽名:在用戶身份驗證後,IdP 使用其私鑰對 SAML 聲明進行數字簽名。此簽名包含在聲明中,連同公鑰證書一起,使 SP 能夠驗證聲明的真實性。
- 聲明驗證:在接收到 SAML 聲明後,SP 使用 IdP 的公鑰來驗證聲明的簽名。如果簽名有效,SP 可以信任該聲明並授予用戶訪問權限。
聲明加密#
除了簽名之外,SAML 還支持聲明加密,以保護在 IdP 與 SP 之間傳輸的敏感用戶屬性和數據。通過加密聲明,IdP 確保只有預定的接收者 (SP) 可以解密並訪問聲明的內容,保障用戶的隱私和機密性。聲明加密是 SAML 中可選的安全功能,可以用於增強數據保護。
聲明加密的用法:
- 敏感屬性保護:聲明加密特別有助於保護敏感用戶屬性,如個人識別信息 (PII)、財務數據或健康記錄。通過在聲明中加密這些屬性,IdP 防止未經授權的訪問並確保數據機密性。
聲明加密的工作原理:
- 密鑰交換:IdP 和 SP 建立一個安全的密鑰交換機制來共享用於保護 SAML 聲明的加密密鑰。這可能涉及使用對稱加密密鑰或公鑰加密方案,具體取決於加密算法和密鑰管理策略。
- 屬性加密:在生成 SAML 聲明後,IdP 使用共享的加密密鑰來加密敏感用戶屬性。加密的屬性嵌入在聲明中,確保只有 SP 可以解密並訪問數據。
- 聲明解密:在接收到加密的聲明後,SP 使用共享加密密鑰解密受保護的屬性。此過程允許 SP 安全地訪問用戶的敏感數據並根據需要處理它。
綁定方法#
SAML 綁定方法定義了 SAML 消息如何通過不同的通信協議在 SP 和 IdP 之間進行傳輸。它們指定了用於交換 SAML 聲明和請求的編碼、傳輸和安全機制,確保參與方之間的安全和可靠通信。
SP 和 IdP 都將在其元數據中指定它們支持的綁定方法,允許它們協商適合 SAML 交互的方法。綁定方法的選擇取決於消息大小、安全要求和通信通道的特點等因素。
SAML 綁定方法:
- HTTP 重定向:SAML 消息被編碼為 URL 參數並通過 HTTP 重定向傳輸。此綁定適合於消息大小有限且通信通道不安全的場景。
- HTTP POST:SAML 消息編碼為表單參數並通過 HTTP POST 請求發送。當消息大小超過 URL 長度限制或需要額外的安全措施時使用此綁定。
- Artifact:SAML 消息使用短期憑證(Artifact)來傳輸,這些憑證在 SP 和 IdP 之間的安全後台通道進行交換。該綁定適用於消息機密性和完整性至關重要且通信通道安全的場景。
最常見的綁定方法:
- 驗證請求:SP 發送給 IdP 的驗證請求通常使用 HTTP 重定向,由於其簡潔和高效。SP 將 SAML 請求編碼為 URL 參數,並重定向用戶的瀏覽器到 IdP 進行身份驗證。這被稱為 SP 啟動的 SSO 流。
- 聲明回應:從 IdP 到 SP 的 SAML 回應聲明通常使用 HTTP POST 綁定方法傳輸。IdP 將 SAML 聲明編碼為表單參數,並將其回傳給 SP 進行驗證。這確保了聲明在傳輸過程中安全且不會在 URL 中暴露敏感數據。此外,與 HTTP 重定向綁定相比,HTTP POST 綁定可以處理較大的消息大小。
SAML 聲明中的安全元素和考量#
發行者#
如前所述,發行者是在 SAML 聲明中的一個關鍵屬性,用於識別發行該聲明的實體。發行者通常是驗證用戶並生成聲明的 IdP。通過在聲明中包括發行者屬性,SP 可以驗證聲明的來源並確保它來自受信任的來源。
SAML 聲明中的簽名元素包含由 IdP 生成的數字簽名,以確保聲明的完整性和真實性。簽名是使用 IdP 的私鑰創建的,並包含在聲明中,連同公鑰證書供 SP 驗證。通過驗證簽名,SP 可以確認該聲明沒有被篡改並來自預期的 IdP。
SAML 聲明中的條件元素定義了適用於聲明的有效性和使用的約束和限制。它包括條件如聲明的有效期、受眾限制以及 SP 在處理聲明時必須執行的其他上下文約束。
認證聲明#
認證聲明 (AuthnStatement) 是 SAML 聲明的一個關鍵組成部分,提供有關用戶認證狀態和上下文的信息。它包括使用的認證方法、認證時間以及任何相關的認證上下文信息,允許 SP 根據用戶的認證狀態做出明智的訪問控制決策。
認證聲明屬性:
- AuthenticationContext:描述用戶認證的方法和上下文,如用戶名-密碼、多因素認證或單點登錄。此屬性幫助 SP 評估認證過程的強度和可靠性並確定適當的訪問控制。
- AuthenticationInstant:表示 IdP 驗證用戶的時間。該時間戳對於驗證認證的新鮮度以及防止重放攻擊或會話劫持至關重要。
- SessionNotOnOrAfter:指定用戶會話的過期時間,之後用戶必須重新認證才能訪問服務。此屬性有助於執行會話管理策略並減少未經授權訪問的風險。
SAML 安全的最佳實踐#
- 使用安全的綁定方法:根據你的安全要求和通信通道特徵選擇合適的 SAML 綁定方法。使用 HTTP POST 傳輸敏感數據,使用 HTTP 重定向處理簡單請求。
- 驗證聲明簽名:驗證 SAML 聲明的數字簽名,以確保其完整性和真實性。使用 IdP 的公鑰證書驗證簽名,檢測篡改嘗試。
- 執行受眾限制:在 SAML 聲明中包括受眾限制,以將聲明的範圍限制到預定的 SP。這可防止聲明重放攻擊以及其他服務提供者的未經授權訪問。
- 保護元數據交換:保護 SP 和 IdP 元數據的交換,以防止元數據篡改和偽裝攻擊。使用安全渠道和機制安全地共享元數據。
- 實施安全的中繼狀態處理:使用唯一且不可預測的中繼狀態值來防止 SAML 認證期間的 CSRF 攻擊。驗證中繼狀態以確保其完整性和真實性。
- 執行會話管理:定義會話過期策略並執行會話超時,以減少會話劫持和未經授權訪問的風險。使用 SAML 聲明中的會話相關屬性安全地管理用戶會話。
- 加密敏感屬性:如果需要,在 SAML 聲明中加密敏感用戶屬性,以保護用戶隱私和數據機密性。使用安全的加密算法和密鑰管理實踐來保護敏感數據。
SAML 的替代方案#
儘管 SAML 仍是 SSO 和身份聯盟的廣泛採用標準,並提供了一套強大的功能和安全機制,但它的年齡在滿足現代應用程序的不斷發展的安全性和可用性需求方面可能會帶來挑戰。當與基於 OAuth 2.0 的 OpenID Connect (OIDC) 相比時,SAML 往往更複雜,並且缺乏一些 OIDC 提供的增強安全功能。例如,OIDC 的多安全性請求授權碼授權流程提供的安全性比相對簡單的 SAML 聲明交換流程更高。對於希望採用更現代和靈活身份聯盟解決方案的組織來說,OIDC 可能是 SAML 的一個可行選擇。