Security Assertion Markup Language (SAML) 是一个开放标准,用于在各方之间,特别是在身份提供者和服务提供者之间交换身份验证和授权数据。SAML 是一种基于 XML 的安全声明标记语言,用于单点登录 (SSO) 和身份联合。在企业环境中常用于身份验证和授权目的。
标准的 SAML 身份验证流程#
- 用户请求访问作为服务提供者 (SP) 的客户端应用程序。
- SP 向身份提供者 (IdP) 发送 SAML SSO 身份验证请求并重定向用户到 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 消息使用称为工件的短生命周期令牌传输,这些令牌在 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 的一个可行替代方案。