Назад | Перейти на главную страницу

Переключение роли IAM на хосте EC2 без использования «source_profile»

У меня есть хост EC2 Ubuntu, где у меня есть одна учетная запись пользователя, отвечающая за выполнение разных задач в разное время. Каждая задача требует определенных разрешений, представленных соответствующей ролью IAM (я называю их «ролями профиля»). Идея состоит в том, чтобы предоставить этому пользователю разрешение на выполнение этих ролей, когда это необходимо.

На данный момент ~/.aws/credentials конфигурация выглядит следующим образом:

[default]
aws_access_key_id = XXX
aws_secret_access_key = YYY

[profile1]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profile1
source_profile = default

[profile2]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profile2
source_profile = default

...

[profileN]
role_arn = arn:aws:iam::XXXXXXXXXX:role/role-for-profileN
source_profile = default

Пользователь в default профиль имеет одно разрешение: принимать любую роль, которая начинается с role-for-profile. Политика JSON выглядит следующим образом:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Sid": "Stmt1494333413000",
        "Effect": "Allow",
        "Action": [
            "sts:AssumeRole"
        ],
        "Resource": [
            "arn:aws:iam::XXXXXXXXXX:role/role-for-profile*"
        ]
    }
  ]
}

Таким образом, любое приложение, которому требуется доступ к определенным сервисам AWS для выполнения определенной задачи (независимо от того, использует ли оно AWS CLI, или Boto, или модули Ansible, или что-то еще), может просто указать имя профиля и прозрачно взять на себя требуемую роль профиля. .

Теперь меня беспокоит: поскольку он работает на хосте EC2, мне вообще не нужно явно указывать какие-либо учетные данные для этого хоста. Теоретически я мог бы просто прикрепить «главную» роль IAM непосредственно к хосту EC2 вместо того, чтобы создавать пользователя, предоставлять ему разрешение на переключение ролей и явно помещать его учетные данные в default профиль.

Однако я не могу этого сделать, так как source_profile параметр является обязательным. У кого-нибудь есть идея, как я могу разрешить хосту EC2 выполнять роли, не давая ему никаких учетных данных? Другими словами, я хочу, чтобы хост аутентифицировал по принципу «что-то я» (экземпляр EC2 с заданной ролью IAM), а не «что-то, что я знаю» (явно предоставленный ключ доступа и секретный ключ пользователя IAM).

ОБНОВИТЬ. Нашел пару запросов функций - похоже, это еще не поддерживается :(

ОБНОВЛЕНИЕ 2. Похоже, мне нужно уточнить цель этой настройки. У меня разные скрипты, которые работают на одних и тех же хостах (может быть, даже параллельно). Для каждого сценария требуется определенный набор разрешений. Я хочу добиться того, чтобы у каждого сценария был только этот набор разрешений и не более того. На мой взгляд, лучший способ добиться этого заключается в следующем:

  1. На уровне хоста не предоставлять никаких разрешений, за исключением разрешения на выполнение ряда определенных ролей.
  2. Когда скрипт начинает работать, он должен взять на себя соответствующую роль, чтобы получить необходимые разрешения.
  3. В то же время, я не хочу впекать роль ARN в сценарий. Вместо этого я хотел бы определить несколько профилей в ~/.aws/credentials, каждый из которых должен взять на себя определенную роль.

С первыми двумя пунктами проблем нет. Однако для реализации третьего требуется, чтобы я создал профиль «по умолчанию», который другие профили будут использовать в качестве ссылки, и этот профиль «по умолчанию» по какой-то причине должен иметь учетные данные пользователя. Я хотел бы сослаться на роль, прикрепленную к экземпляру EC2, где все это работает.

Теперь это работает. Подробные инструкции здесь: https://docs.aws.amazon.com/cli/latest/topic/config-vars.html#using-aws-iam-roles

См. Обновление за октябрь / декабрь 2018 г .: https://github.com/aws/aws-cli/issues/1390

AWS позволяет назначить инстансу EC2 только одну роль. Эта роль должна иметь все разрешения, которые могут потребоваться экземпляру EC2. Ссылка.

Вы можете изменить роли, назначенные экземпляру, с помощью командной строки, но это не то, что вы хотите делать регулярно во время выполнения.

Я пытался решить ту же проблему. Самое близкое, что я смог найти, это суть: https://gist.github.com/gene1wood/34b02fa3091e184e1997

Он использует aws sts assume-role команда для получения временного набора учетных данных (по умолчанию истекает через 60 минут). Я предположил, что вы можете использовать этот скрипт для получения временных учетных данных для роли, назначенной экземплярам EC2, и обновления ключа доступа AWS и секретного ключа AWS для профиля «по умолчанию». Поскольку срок действия временных учетных данных истекает каждый час, вам потребуется задание cron, чтобы обновлять их на регулярной основе.

Вид уродливого хака, но пока он не будет поддержан, я думаю, у него есть хорошие шансы на работу.

Прикрепите роль «по умолчанию» в качестве основной роли для экземпляра. Это позволяет избежать необходимости вводить учетные данные в вашем профиле по умолчанию.

Создайте профили не по умолчанию с учетными данными для других ролей.