问题:

为了账号的安全性,开启了 MFA 多重验证。但是出现一个问题,控制台输入 MFA Token 后有权限访问 AWS 资源,但是 AWS CLI 的方式使用 access key 访问资源却因为未被授权而拒绝。
image.png

解决办法:

  • 如果开启了 MFA 验证,那么通过 AWS CLI 与资源交互时,则必须创建临时会话。

    • 运行 sts get-session-token AWS CLI 命令(将变量替换为账户、资源和 MFA 设备的信息):

      • arn-of-the-mfa-device:可以从控制台获取 MFA 设备信息;(如果您使用的是 MFA 硬件设备,则 ARN 值类似于 GAHT12345678。如果您使用的是虚拟 MFA,则该值类似于 arn:aws:iam::123456789012:mfa/user
      • code-from-token:从 MFA 设备获取的 Token
        1. $ aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token
    • 会收到类似于以下内容的输出,其中包含临时凭证和到期时间(默认为 12 小时):

      • 注意:可以在 sts get-session-token 命令中使用 —duration-seconds 选项指定到期时间 (单位:秒),该值的范围在 900 秒 (15 分钟) 至 129600 秒 (36 小时) 之间。如果使用的是根用户凭证,则范围为 900 秒(15 分钟)到 3600 秒(1 小时)。
        1. {
        2. "Credentials": {
        3. "SecretAccessKey": "secret-access-key",
        4. "SessionToken": "temporary-session-token",
        5. "Expiration": "expiration-date-time",
        6. "AccessKeyId": "access-key-id"
        7. }
        8. }
  • 如何使用临时凭证

    • 通过环境变量使用临时凭证
      • 可以使用以下命令将临时凭证的值导出到环境变量,从而使用临时凭证 ```shell

        Linux:

        export AWS_ACCESS_KEY_ID=example-access-key-as-in-previous-output export AWS_SECRET_ACCESS_KEY=example-secret-access-key-as-in-previous-output export AWS_SESSION_TOKEN=example-session-token-as-in-previous-output

Windows:

set AWS_ACCESS_KEY_ID=example-access-key-as-in-previous-output set AWS_SECRET_ACCESS_KEY=example-secret-access-key-as-in-previous-output set AWS_SESSION_TOKEN=example-session-Token-as-in-previous-output

  1. - 如果已设置环境变量,请确保在使用这些命令再次进行 [get-session-token](https://docs.aws.amazon.com/cli/latest/reference/sts/get-session-token.html) 调用之前取消对它们的设置。
  2. ```shell
  3. unset AWS_ACCESS_KEY_ID
  4. unset AWS_SECRET_ACCESS_KEY
  5. unset AWS_SESSION_TOKEN
  • 通过命名配置文件使用临时凭证
    • 编辑用户主目录中的 .aws 文件夹下的 credentials 文件,然后添加新的配置文件配置 ```shell

      配置文件示例

      [mfa] aws_access_key_id = example-access-key-as-in-returned-output aws_secret_access_key = example-secret-access-key-as-in-returned-output aws_session_token = example-session-Token-as-in-returned-output

$ aws s3 ls —profile mfa ```