Как работает одновременное принятие нескольких ролей IAM?

#amazon-web-services #amazon-iam

Вопрос:

У меня есть задача ECS, использующая роль задачи для доступа к таблице DynamoDB в той же учетной записи A. Для этого также требуется доступ к таблице DynamoDB в другой учетной записи B, который предоставляется путем принятия роли IAM.

Насколько я понимаю, после вступления в роль задача теперь имеет набор временных учетных данных для каждой роли. Это позволяет задаче использовать новые учетные данные для выполнения запросов к таблице учетной записи B, сохраняя при этом исходные учетные данные для выполнения запросов к таблице учетной записи A.

Предполагая, что это правильно, как определяются учетные данные, используемые для данного запроса? Использует ли он роль перекрестной учетной записи только для запросов учетной записи B и исходные учетные данные для запросов учетной записи A?

Что делать, если также требуется доступ к ведрам S3 учетной записи B и разрешения были предоставлены учетной записи A, которые затем были предоставлены исходной роли задачи? После принятия роли перекрестной учетной записи не выполняется ли запрос S3 для перекрестной учетной записи из-за того, что предполагаемая роль не имеет разрешений S3, хотя исходная роль take имеет?

Комментарии:

1. Просто для простого принятия ролей означает переключение набора учетных данных, а не их расширение. Таким образом, принимая на себя новую роль, клиент отказывается от текущей. Новая роль должна иметь все разрешения, необходимые клиенту.

Ответ №1:

Ресурсы AWS не могут просто взять на себя определенную роль сами по себе. Им нужно сказать, чтобы они сделали это, и для этого используйте SDK по вашему выбору (или интерфейс командной строки). Как только вы поймете, как это работает, станет намного яснее, как это работает. Поскольку вы упомянули и экземпляр ec2, я буду использовать интерфейс командной строки, чтобы показать это

 AcctCredentials=($(aws sts assume-role --role-arn "$1" --role-session-name TheSessionName --query '[Credentials.AccessKeyId,Credentials.SecretAccessKey,Credentials.SessionToken]' --output text))
unset AWS_SECURITY_TOKEN
echo "Security Tokens for Cross Account Access received"
export AWS_ACCESS_KEY_ID=${AcctCredentials[0]}
echo $AWS_ACCESS_KEY_ID
export AWS_SECRET_ACCESS_KEY=${AcctCredentials[1]}
export AWS_SESSION_TOKEN=${AcctCredentials[2]}
export AWS_SECURITY_TOKEN=${AcctCredentials[2]}
 

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

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

Однако, если бы это было, например, в лямбде, вы могли бы использовать Python и Boto3 для выполнения чего-то очень похожего. Это заменило бы там жетоны.

Также вполне возможно сохранить ваши токены в виде профиля, который могут использовать команды, а затем для каждой команды указать профиль, который вы используете для этой команды.

Комментарии:

1. Вы правы, использование профилей позволит красиво поменяться ролями ben11kehoe.medium.com/…