使用有效MFA TokenCode调用AssumeRole时遇AccessDenied错误求助
我在运行以下Python代码尝试通过MFA验证来Assume AWS IAM角色时,明明输入了有效的TOTP验证码,却一直收到AccessDenied错误,提示MFA一次性密码无效,恳请帮忙解决。
运行的代码
import boto import boto3 from boto.s3.connection import S3Connection from boto.sts import STSConnection # Prompt for MFA time-based one-time password (TOTP) mfa_TOTP = raw_input("Enter the MFA code: ") role_arn = "arn:aws:iam::123456789012:role/TestOperator" client = boto3.client('sts') response = client.assume_role( RoleArn=role_arn, SerialNumber="arn:aws:iam::760787039612:mfa/C34768", RoleSessionName="test", TokenCode=mfa_TOTP ) print response
报错信息
ClientError: An error occurred (AccessDenied) when calling the AssumeRole operation: MultiFactorAuthentication failed with invalid MFA one time pass code.
可能的原因及解决方案
我帮你梳理几个最可能导致这个错误的点,你可以逐一排查:
1. MFA设备ARN的账号与当前凭证账号不匹配
你代码里的RoleArn属于账号123456789012,但SerialNumber是账号760787039612下的MFA设备。这里要注意:SerialNumber必须是你当前用来调用AssumeRole的AWS用户的MFA设备ARN,也就是你本地AWS凭证(比如~/.aws/credentials里的密钥)所属账号的用户MFA。
举个例子:如果你是用账号760787039612下的用户凭证运行代码,那这个SerialNumber是对的,但需要确认目标角色TestOperator的信任策略是否允许该账号的用户通过MFA来AssumeRole;如果你的本地凭证属于123456789012账号,那SerialNumber应该换成该账号下你的用户的MFA设备ARN。
2. MFA验证码过期或输入错误
TOTP验证码每30秒更新一次,有时候输入的时候可能刚好过了有效期,建议你刷新验证码后立即输入,确保整个输入过程在30秒内完成,并且不要多输/少输数字。
3. 目标角色的信任策略配置问题
检查TestOperator角色的信任策略,确认它允许你的用户所在账号的访问,并且明确要求MFA验证。正确的信任策略应该类似这样:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::你的用户账号ID:user/你的用户名" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } } } ] }
如果信任策略没有要求MFA,或者没有授权你的用户,也可能触发类似的错误提示。
4. 升级boto3版本
旧版本的boto3可能存在STS服务调用的兼容性问题,建议升级到最新版试试:
pip install --upgrade boto3
5. 检查本地凭证配置
确保你本地的AWS凭证(比如~/.aws/credentials文件)里的access key和secret key是正确的,对应的用户确实拥有Assume该角色的权限,并且已经启用了MFA设备。
内容的提问来源于stack exchange,提问作者Chandra

