Не могу переключить CLI профиля AWS, но могу сделать это в консоли - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь запустить команды CLI AWS, используя другой профиль:

.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
.aws$ cat credentials 
[default]
aws_access_key_id = ID
aws_secret_access_key = KEY

SECOND_ACCOUNT имеет роль администратора (доступ ко всем ресурсам), которая имеет доверительные отношения, чтобы разрешить всем пользователям

"Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<FIRST_ACCOUNT>:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }

Моя учетная запись на FIRST_ACCOUNT также имеет политику для принятия роли:

"Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "*"
        }
    ]
  • Я могу сменить рольиспользуя консоль .
  • Я пытался прикрепить политики непосредственно к моему имени пользователя на FIRST_ACCOUNT, чтобы иметь sts: acceptRole.
  • Я пытался присоединить свой пользователь ARN изFIRST_ACCOUNT к доверительным отношениям роли admin SECOND_ACCOUNT.
  • Нет явного DENY, прикрепленного к моему имени пользователя.
  • Я пытался добавить adminроль SECOND_ACCOUNT для моих .aws/config и .aws/credentials.

Однако я не могу переключиться на другой профиль с помощью CLI:

$ aws s3 ls --profile secondaccount

An error occurred (AccessDenied) when calling the AssumeRole operation: Access denied

Iпробовал то, что предлагали здесь , здесь , здесь и здесь

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Чтобы secondaccount принял на себя роль admin, он должен использовать учетные данные из вашего профиля default. В приведенном примере в вашем профиле default не определены ключи доступа, поэтому он не может волшебным образом играть роль в secondaccount. Например

[default]
region = us-east-1
aws_access_key_id=AKIAJQZVTAZXBSTXXXX
aws_secret_access=MYSECRERACCESS
output = json

[profile secondaccount]
role_arn = arn:aws:iam::<SECOND_ACCOUNT_ID>:role/admin
source_profile = default

Это работает для вас в консоли, потому что вы используете комбинацию имени пользователя и пароля, прежде чем приступить к назначению роли, в то время как для CLI вы предполагаете предоставить ключ доступа + секретный ключ для этого

0 голосов
/ 11 июля 2019

Итак, я нашел решение из сообщения AWS .

Выпуск:

В доверительных отношениях SECOND_ACCOUNT admin есть условие:

"Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }

это означает, что для выполнения команд консоли требуется токен от MFA.

Так я и сделал:

$ 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"
    }
}

Затем я добавил к .aws/credentials:

[mfa]
aws_access_key_id = ID_FROM_ABOVE
aws_secret_access_key = KEY_FROM_ABOVE
aws_session_token = TOKEN_FROM_ABOVE

Затем отредактировал .aws/config:

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

[profile secondaccount]
role_arn = arn:aws:iam::<SECOND_ACCOUNT_ID>:role/admin
source_profile = mfa

Затем я смог запустить команды CLI с --profile secondaccount.

Если вы решите сделать это, что является наилучшей практикой AWS, AWS рекомендует использовать сценарий для автоматизации процесса получения нового токена.

Если вы «ленивый», удалите condition в доверительных отношениях.

...