You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

要求所有用户启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:25:35