要求所有用户启用AWS MFA的策略未按预期生效
IAM组MFA策略导致CLI/Boto3无法访问的问题解决
问题背景
按照AWS官方文档示例,给IAM组配置了强制启用MFA的策略(如下):
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowListActions", "Effect": "Allow", "Action": ["iam:ListUsers", "iam:ListVirtualMFADevices"], "Resource": "*" }, { "Sid": "AllowUserToCreateVirtualMFADevice", "Effect": "Allow", "Action": ["iam:CreateVirtualMFADevice"], "Resource": "arn:aws:iam::*:mfa/*" }, { "Sid": "AllowUserToManageTheirOwnMFA", "Effect": "Allow", "Action": [ "iam:EnableMFADevice", "iam:ListMFADevices", "iam:ResyncMFADevice" ], "Resource": "arn:aws:iam::*:user/${aws:username}" }, { "Sid": "AllowUserToDeactivateTheirOwnMFAOnlyWhenUsingMFA", "Effect": "Allow", "Action": ["iam:DeactivateMFADevice"], "Resource": ["arn:aws:iam::*:user/${aws:username}"], "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } } }, { "Sid": "BlockMostAccessUnlessSignedInWithMFA", "Effect": "Deny", "NotAction": [ "iam:CreateVirtualMFADevice", "iam:EnableMFADevice", "iam:ListMFADevices", "iam:ListUsers", "iam:ListVirtualMFADevices", "iam:ResyncMFADevice" ], "Resource": "*", "Condition": { "BoolIfExists": { "aws:MultiFactorAuthPresent": "false" } } } ] }
配置后组内用户可正常使用AWS控制台,但无法通过boto3或CLI执行任何操作,策略模拟器显示所有请求都被最后一段BlockMostAccessUnlessSignedInWithMFA规则拒绝。
问题原因
- AWS控制台登录时,用户完成MFA验证后,会话会自动携带
aws:MultiFactorAuthPresent=true的上下文变量,因此不会触发Deny规则。 - CLI或boto3默认使用**长期访问密钥(Access Key ID/Secret Access Key)**进行身份验证,这类凭证本身不会触发MFA验证流程,请求中不会携带
aws:MultiFactorAuthPresent变量,或者该变量值为false,正好命中Deny规则的BoolIfExists: aws:MultiFactorAuthPresent=false条件,导致所有非MFA管理类操作被拦截。
解决方案
要让CLI/boto3正常访问,必须使用带MFA验证的临时凭证,操作步骤如下:
- 第一步:获取MFA设备的ARN
登录AWS控制台进入IAM用户详情页,在“安全凭证”标签下找到已启用的虚拟MFA设备,复制其ARN(格式示例:arn:aws:iam::123456789012:mfa/username)。 - 第二步:调用STS服务生成临时凭证
使用AWS CLI执行以下命令,替换<MFA设备ARN>和<MFA动态验证码>:aws sts get-session-token --serial-number <MFA设备ARN> --token-code <MFA动态验证码> - 第三步:配置临时凭证到CLI/boto3
- 环境变量方式:
export AWS_ACCESS_KEY_ID=<临时Access Key> export AWS_SECRET_ACCESS_KEY=<临时Secret Key> export AWS_SESSION_TOKEN=<临时Session Token> - AWS配置文件方式(
~/.aws/credentials):
使用时指定配置文件:[mfa-profile] aws_access_key_id = <临时Access Key> aws_secret_access_key = <临时Secret Key> aws_session_token = <临时Session Token>aws s3 ls --profile mfa-profile - boto3直接调用方式:
import boto3 client = boto3.client( 's3', aws_access_key_id='<临时Access Key>', aws_secret_access_key='<临时Secret Key>', aws_session_token='<临时Session Token>' )
- 环境变量方式:
补充说明
- 临时凭证默认有效期为12小时,到期后需重新执行上述步骤获取新凭证。
- 若需要长期简化流程,可以编写脚本自动获取并配置临时凭证。
内容的提问来源于stack exchange,提问作者doublethink13
相关产品推荐
相关产品推荐

