基于SAML协议的信任委托SSO概述
华为云联邦身份认证支持使用SAML 2.0协议,这是一种外部身份提供商广泛支持的开放标准。该功能支持单点登录 (SSO),使用户无需创建IAM用户,也可以授权他人登录华为云管理控制台或直接调用API操作。
- 允许联邦主体调用华为云API访问和操作华为云资源。
在该场景中,用户可使用外部身份提供商 (IdP) 生成的SAML断言(作为身份验证响应的一部分)来获取临时安全凭证,从而调用华为云API。
该机制与IAM支持的其他联邦方式(如OIDC联邦身份认证)类似。
- 允许联邦主体登录华为云管理控制台访问和操作华为云资源。
在该场景中,用户从企业身份提供商门户发起登录请求,选择华为云作为目标应用后,会被重定向至华为云控制台,无需再次输入华为云的登录凭证。
该机制支持通过第三方身份提供商实现对华为云控制台的单点登录 (SSO)。
使用基于SAML协议的SSO对华为云进行API访问
假设您需要想给公司的员工授权访问华为云OBS的桶资源, 您可以允许员工可通过外部身份提供商(IdP)生成的SAML断言,来获取华为云的临时安全凭证,从而通过调用华为云API访问OBS的桶资源。
在此架构下,员工本身不需要拥有华为云账号或IAM用户,其所有OBS的桶资源操作均通过SAML断言获取的临时安全凭证调用华为云API完成。
- IAM侧配置 如下图所示,管理员在IAM侧完成与外部身份提供商的信任建立及权限配置。图1 在IAM侧配置身份提供商和信任委托
主要步骤包括:- 创建IAM SAML身份提供商,用于接入外部身份系统;
- 创建IAM信任委托,建立与身份提供商之间的信任关系;
- 为信任委托配置身份策略,定义可被授予的资源权限范围。
通过上述配置,云平台完成对外部身份的信任初始化,为后续基于SAML的访问控制提供基础。
- 访问流程 使用过程如下:图2 访问流程
- 组织中的用户使用客户端应用程序请求外部身份提供商进行身份验证。
- 外部身份提供商根据组织的身份存储对用户进行身份验证。
- 外部身份提供商构建一个具有用户相关信息的SAML断言,并将此断言发送到客户端应用程序。如果你为SAML外部身份提供商启用SAML加密,那么此断言将由外部身份提供商加密。
- 客户端应用程序调用STS AssumeAgencyWithSAML API,并传递SAML身份提供商的URN、Agency URN以及来自外部身份提供商的SAML断言。
- (可选)STS 使用您从外部外部身份提供商上传的私有密钥来解密SAML加密断言。
- STS AssumeAgencyWithSAML API返回临时安全凭证给客户端应用程序。
- 客户端应用程序使用临时安全凭证来调用OBS API操作桶资源。
基于SAML协议的SSO配置概述
在使用前面方案和图表中所述的基于SAML 2.0 的联邦身份认证之前,您必须先配置组织的身份提供商和您的华为云账号,使之相互信任。以下步骤概述了建立此类信任关系的一般流程, 组织需具备一个支持SAML 2.0协议的身份提供商,以实现基于标准协议的SAML联邦身份认证。
- 配置组织的身份提供商(外部身份提供商)与华为云之间的信任关系。首先,在外部身份提供商中上传华为云的SAML元数据文件,将华为云注册为服务提供商:
- SAML断言未加密场景:https://auth.huaweicloud.com/authui/v5/saml/metadata.xml
- SAML断言加密场景:https://auth.huaweicloud.com/authui/v5/saml/{provider_id}/metadata.xml
- 在您的外部身份提供商中生成SAML元数据XML文件,用于向华为云准确描述该IdP的端点地址及公钥证书。该文件必须包含:发布者名称、创建时间、过期时间以及用于验证SAML断言的签名证书(公钥)。
如SAML V2.0 Metadata Interoperability Profile Version 1.0所定义,IAM在进行SAML断言验证时,不会校验元数据文件中X.509证书的有效期(仅在上传元数据文件时校验证书是否过期)。若 X.509 证书在元数据文件上传后发生过期,IAM不会执行任何额外处理,意味着您的身份提供商仍然可以正常使用。建议您根据组织的治理与安全策略,定期监控证书到期时间,并及时完成证书轮换,以降低潜在风险。
- 启用SAML断言加密时,需在外部身份提供商使用公钥加密断言,并将对应私钥上传至IAM,由华为云STS Security Token负责解密SAML响应。
- 在IAM中创建一个或多个信任委托,并在信任委托的信任策略中将SAML身份提供商设置为受信任主体。信任委托的信任策略定义了谁可以在华为云中切换该信任委托。
在信任委托的信任策略中使用的SAML身份提供商必须与信任委托位于同一账号中。
- 在外部身份提供商中配置SAML断言,将企业中的用户或用户组映射到对应的IAM信任委托。不同用户或组可以映射到不同信任委托,具体配置方式取决于所使用的外部身份提供商。
- 如果外部身份提供商支持访问华为云控制台的单点登录(SSO),可以在外部身份提供商中配置控制台会话的最大持续时间。
- 在您的外部身份提供商调用华为云STS AssumeAgencyWithSAML API,请求中需要包含:SAML身份提供商URN、目标IAM信任委托URN,以及从外部身份提供商获取的SAML断言。IAM会校验该请求是否来自受信任的外部身份提供商。
- 如果调用成功,AssumeAgencyWithSAML API将返回临时安全凭证,应用程序可以使用该凭证访问华为云资源。有关更多信息,请参阅在IAM中创建SAML身份提供商。
用于SAML联邦身份认证访问华为云资源的信任委托概述
{
"Version": "5.0",
"Statement": [
{
"Action": [
"sts:agencies:assumeWithSAML"
],
"Effect": "Allow",
"Condition": {
"StringEquals": {
"saml:aud": [
"https://auth.huawei.com/saml/acs/{provider_id}"
]
}
},
"Principal": {
"Federated": [
"iam::{account_id}:samlProvider:{saml_provider_name}"
]
}
}
]
}
策略中的saml:aud条件键用于指定用户登录控制台时的目标登录URL,该登录URL必须与外部身份提供商在SAML断言中设置的Recipient属性值保持一致。
https://auth.huawei.com/saml
https://auth.huawei.com/saml/acs/{provider_id} 对于该信任委托中的身份策略,您可以像任何信任委托一样指定权限。例如,如果允许您企业的用户管理ECS实例,您必须在身份策略中明确允许华为云ECS操作,如ECSFullPolicy系统策略中的操作。
基于SAML协议的联邦主体唯一标识
obs-demo-bucket/app1/user1 obs-demo-bucket/app1/user2 obs-demo-bucket/app1/user3
- saml:namequalifier 条件键由Issuer(即 saml:iss 条件键的值)、华为云账号的ID以及IAM SAML提供商的名称计算得到的哈希值,作为一个SAML联邦主体的全局唯一标识。下面的伪代码展示了哈希值的计算方式:
BASE64 ( SHA256 ( "https://example.com/saml" + "8c1eef3a241945f2113d3a6b0252e783" + "/MySAMLIdPName" ) )
其中:
- + 号:表示字符串拼接。
- SHA256:表示生成 SHA256 消息摘要的函数。
- Base64:表示将哈希输出转换为 Base-64 编码。
- saml:sub 表示SAML断言中主体, 对应于断言中Subject属性中NameID的值,用于标识该用户在当前身份提供商上下文中的主体身份。
- saml:sub_type表示主体的类型,即NameID 的格式,由SAML断言中NameID元素的Format属性定义。格式的典型示例是transient(临时)或 persistent(持久):
- 如果该格式包含前缀 urn:oasis:names:tc:SAML:2.0:nameid-format,该前缀将被移除。例如,urn:oasis:names:tc:SAML:2.0:nameid-format:transient 将作为 transient 返回。
- 如果格式包含任何其他前缀,则直接返回该格式而不做任何修改。
{
"Version": "5.0",
"Statement": {
"Effect": "Allow",
"Action": [
"obs:object:GetObject",
"obs:object:PutObject",
"obs:object:DeleteObject"
],
"Resource": [
"obs:*:*:object:obs-demo-bucket-org-data/backup/${saml:namequalifier}/${saml:sub}",
"obs:*:*:object:obs-demo-bucket-org-data/backup/${saml:namequalifier}/${saml:sub}/*"
],
"Condition": {
"StringEquals": {
"saml:sub_type": "persistent"
}
}
}
}