Boto3 принимает на себя роль перекрестной учетной записи с MFA

#python-3.x #amazon-web-services #boto3 #amazon-iam #multi-factor-authentication

#python-3.x #amazon-веб-сервисы #boto3 #amazon-iam #многофакторная аутентификация

Вопрос:

Используя python3 и boto3, как я могу взять на себя роль в другой учетной записи AWS, для которой требуется включение многофакторной аутентификации (MFA) при принятии роли?

Ищу пример кода. Подобные вопросы на этом сайте касаются технологий, отличных от boto3, или не включают требование MFA.

Ответ №1:

Используя boto3, вам необходимо разрешить пользователю вводить токен MFA непосредственно перед переключением роли. Приведенный ниже код показывает пример переключения на роль для перечисления сегментов в другой учетной записи. Важным моментом является добавление параметров SerialNumber и TokenCode параметров к sts_client.assume_role() вызову.

Затем возвращенные учетные данные можно использовать с другим клиентом boto3 для выполнения некоторой реальной работы, в этом случае перечислите сегменты s3 в целевой учетной записи.

 #!/usr/bin/env python
import boto3

sts_client = boto3.client('sts')

def assume_role_with_mfa(role_arn):

    '''
        Assume cross account role with MFA and return credentials
    '''

    mfa_otp = input("Enter the MFA code: ")

    assumedRoleObject = sts_client.assume_role(
        RoleArn=role_arn,
        RoleSessionName='mysession',
        SerialNumber="arn:aws:iam::987654321098:mfa/my_userid",
        DurationSeconds=3600,
        TokenCode=mfa_otp
    )

    # From the response that contains the assumed role, get the temporary
    # credentials that can be used to make subsequent API calls
    return assumedRoleObject['Credentials']


# Get the cross-account credentials, then use them to create 
# an S3 Client and list buckets in the account

creds = assume_role_with_mfa("arn:aws:iam::123456789012:role/myrole")

s3_client = boto3.client(service_name="s3",
            aws_access_key_id=creds['AccessKeyId'],
            aws_secret_access_key=creds['SecretAccessKey'],
            aws_session_token=creds['SessionToken'])
        
buckets = s3_client.list_buckets()
for bucket in buckets['Buckets']:
    print(bucket['Name'])
 

Я надеюсь, что это полезно для будущих поисковиков.