无法切换 AWS 配置文件 CLI,但可以在控制台中进行

Vie*_*iet 6 amazon-web-services amazon-iam

我正在尝试使用不同的配置文件运行 AWS CLI 命令:

.aws$ cat config 
[default]
region = us-east-1
output = json

[profile secondaccount]
role_arn = arn:aws:iam::<SECOND_ACCOUNT_ID>:role/admin
source_profile = default
Run Code Online (Sandbox Code Playgroud)
.aws$ cat credentials 
[default]
aws_access_key_id = ID
aws_secret_access_key = KEY
Run Code Online (Sandbox Code Playgroud)

SECOND_ACCOUNT有有信任关系,允许从任何用户管理员角色(访问所有资源),FIRST_ACCOUNT假设它。

"Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<FIRST_ACCOUNT>:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

我的帐户FIRST_ACCOUNT也有承担角色的政策:

"Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "*"
        }
    ]
Run Code Online (Sandbox Code Playgroud)
  • 可以使用控制台切换角色
  • 我试图将策略直接附加到我在FIRST_ACCOUNTsts:assumeRole上的用户名。
  • 我试图从附上我的用户ARNFIRST_ACCOUNT的信托关系admin中的作用SECOND_ACCOUNT
  • 我的用户名没有明确的拒绝。
  • 我已经尝试将 的admin角色添加SECOND_ACCOUNT到 my.aws/config.aws/credentials.

但是,我无法使用 CLI 切换到另一个配置文件:

"Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<FIRST_ACCOUNT>:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这里这里这里这里的建议

Vie*_*iet 10

所以我从AWS post找到了解决方案。

问题:

在 的信任关系中SECOND_ACCOUNT admin,有条件:

"Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
Run Code Online (Sandbox Code Playgroud)

这意味着它需要来自 MFA 的令牌来执行 CLI 命令。

所以我做了:

$ aws sts get-session-token --serial-number MFA_NUM --token-code CODE_FROM_MFA
{
    "Credentials": {
        "AccessKeyId": ID,
        "SecretAccessKey": KEY,
        "SessionToken": TOKEN,
        "Expiration": "2019-07-12T01:14:07Z"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我添加到.aws/credentials

[mfa]
aws_access_key_id = ID_FROM_ABOVE
aws_secret_access_key = KEY_FROM_ABOVE
aws_session_token = TOKEN_FROM_ABOVE
Run Code Online (Sandbox Code Playgroud)

然后编辑了.aws/config

[mfa]
output = json
region = us-east-1

[profile secondaccount]
role_arn = arn:aws:iam::<SECOND_ACCOUNT_ID>:role/admin
source_profile = mfa
Run Code Online (Sandbox Code Playgroud)

然后我就可以使用--profile secondaccount.

如果您选择这样做,这是 AWS 的最佳实践,AWS 建议使用脚本来自动化获取新令牌的过程。

如果您“懒惰”,请删除condition信任关系中的 。