安全聲明標記語言 (SAML) 是一種開放標準,用於在多方之間交換身份驗證和授權數據,尤其是在身份提供者和服務提供者之間。SAML 是一種基於 XML 的標記語言,用於安全聲明,用於單點登錄 (SSO) 和身份聯盟。它通常用於企業環境中進行身份驗證和授權。
標準 SAML 認證流程#
- 使用者向作為服務提供者 (SP) 的客戶端應用程式請求訪問。
- SP 將 SAML SSO 身份驗證請求發送給身份提供者 (IdP) 並將使用者重定向到 IdP。
- 如果使用者尚未經過身份驗證,IdP 會提示使用者輸入憑證。
- 使用者輸入憑證,IdP 驗證使用者。
- IdP 向 SP 發送包含使用者身份驗證狀態和屬性的 SAML 响應聲明。然後 IdP 將使用者重定向回 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 POST 綁定能夠處理較大的消息大小,與 HTTP 重定向綁定相比。
SAML 聲明中的安全元素和考量#
發行者#
正如先前所述,發行者是 SAML 聲明中的一個重要屬性,用於識別發行聲明的實體。發行者通常是為用戶身份驗證並生成聲明的 IdP。通過在聲明中包含發行者屬性,SP 能夠驗證聲明的來源,確保其來自信任源。
SAML 聲明中的簽名元素包含 IdP 生成的數位簽名,用於確保聲明的完整性與真實性。此簽名使用 IdP 的私鑰創建,並與公鑰證書一起包括在聲明中,供 SP 驗證。透過驗證簽名,SP 能夠確認聲明未被篡改且來自預期的 IdP。
SAML 聲明中的條件元素定義了聲明的有效性和使用時要應用的條件和限制。它包括條件,如聲明的有效期、受眾限制以及 SP 在處理聲明時必須實施的其他上下文約束。
認證聲明#
認證聲明 (AuthnStatement) 是 SAML 聲明的一個關鍵組成部分,提供有關用戶身份驗證狀態和上下文的資訊。它包括身份驗證方法、身份驗證時間和任何相關的身份驗證上下文資訊等詳細信息,使 SP 能根據用戶的身份驗證狀態做出明智的訪問控制決策。
認證聲明屬性:
- 身份驗證上下文:描述用戶身份驗證的方法和上下文,如使用者名-密碼、多因素身份驗證或單點登入。此屬性幫助 SP 評估身份驗證過程的強度和可靠性,並確定適當的訪問控制。
- 身份驗證時間:表示用戶被 IdP 認證的時間。此時間戳對於驗證身份驗證的新鮮度、防止重播攻擊或阻止會話劫持非常重要。
- 會話過期時間:指定用戶會話的過期時間,在此時間後,用戶必須重新身份驗證以訪問服務。此屬性幫助實施會話管理政策,降低未經授權的訪問風險。
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 的一個可行替代方案。