寻求可生效的AWS组织根SCP:解决SSO用户MFA验证异常
AWS组织根节点SCP:强制MFA且兼容SSO场景的正确写法
问题根源
之前的SCP无法识别SSO用户的MFA状态,核心原因是mfaAuthenticationPresent仅对IAM本地用户的MFA会话生效;而SSO用户通过AssumeRoleWithSAML生成的会话,需要通过SAML断言里的认证上下文字段来判断是否完成MFA校验。
修复后的SCP策略
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyUnverifiedAccess", "Effect": "Deny", "NotAction": [ "iam:CreateVirtualMFADevice", "iam:EnableMFADevice", "iam:GetUser", "iam:ListMFADevices", "iam:ListVirtualMFADevices", "iam:ResyncMFADevice", "sts:AssumeRoleWithSAML" ], "Resource": "*", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" }, "StringNotEqualsIfExists": { "saml:authnContextClassRef": "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken" } } }, { "Sid": "AllowSSOAuthenticatedSessions", "Effect": "Allow", "Action": "*", "Resource": "*", "Condition": { "StringEquals": { "sts:ViaService": "sso.amazonaws.com" } } } ] }
策略细节说明
- NotAction白名单:保留IAM用户启用/管理MFA的必要操作,同时允许SSO用户执行
AssumeRoleWithSAML角色切换,避免用户被完全锁死 - Deny规则逻辑:
- 拒绝所有未开启MFA的IAM本地用户操作
- 拒绝SAML断言中未包含MFA认证上下文的SSO请求(
TimeSyncToken是TOTP类MFA的标准值,若使用硬件MFA可替换为urn:oasis:names:tc:SAML:2.0:ac:classes:HardwareToken)
- Allow规则:直接放行来自AWS SSO服务的会话操作,因为SSO层面已经完成了MFA校验,无需重复验证
验证要点
- 先在测试OU部署SCP,避免影响整个组织
- 检查SSO身份提供商的SAML配置,确保断言中包含正确的
authnContextClassRef字段 - 分别测试两类用户:IAM本地用户(未开MFA应被拒绝,开MFA可正常操作)、SSO用户(已开MFA可正常扮演角色)
内容的提问来源于stack exchange,提问作者Instrument-IT
相关产品推荐
相关产品推荐

