Запуск одного python сценария для нескольких AWS учетных записей - PullRequest
0 голосов
/ 07 января 2020

Я хочу запустить python скрипт, который будет обращаться к другой AWS учетной записи (stg, qa, dev). Как я могу добиться этого, не нарушая рекомендации по безопасности?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Я согласен с Джоном в использовании ролей iam для управления доступом. Вы можете расширить это, используя только роли вместо пользователей, если вы запускаете свой сценарий из lambda.

Чтобы продолжить, вам понадобятся два типа ролей iam: целевые роли и исходная роль.

Целевая роль

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

Роль источника

Роль источника будет находиться в учетной записи, к которой вы хотите иметь доступ ко всем другим учетным записям. Эта роль должна иметь разрешение на принятие других ролей. Соответствующее действие iam: sts:AssumeRole.

Код

Ниже я привел код, который использовал в прошлом. Обычно я помещаю этот код в лямбду, которая находится в учетной записи, которая может управлять другими учетными записями, такими как SharedServices или DevOps. Возможно, вы захотите обратиться к boto3 документации для предположения роли.

import boto3

def role_arn_to_session(**args):
    client = boto3.client('sts')
    response = client.assume_role(**args)
    return boto3.Session(
        aws_access_key_id=response['Credentials']['AccessKeyId'],
        aws_secret_access_key=response['Credentials']['SecretAccessKey'],
        aws_session_token=response['Credentials']['SessionToken'])

# This decides what role to use, a name of the session you will start, and potentially an external id.
# The external id can be used as a passcode to protect your role.
def set_boto3_clients(accountId):
    return role_arn_to_session(
        RoleArn='arn:aws:iam::' + accountId + ':role/TargetRole',
        RoleSessionName='AssumeTargetRole',
        ExternalId=os.environ['ExternalId']
    )

def handler(event, context):

    for accountId in accountList:

        boto3InDifferentAccount = setup_client(accountId)

        # You can then use this boto3InDifferentAccount as if you are using boto in another account
        # For example: s3 = boto3InDifferentAccount.client('s3')
        runScriptInAccount(boto3InDifferentAccount)


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

1 голос
/ 07 января 2020

«Чистый» способ сделать это будет:

  • Создать пользователя IAM в одной учетной записи, которая будет использоваться приложением Python
  • Создайте Роль IAM в каждой целевой учетной записи (с тем же именем) с такими разрешениями, чтобы роль могла быть принята Пользователем IAM
  • Загрузить список учетных записей в вашем приложении. Пройдите l oop через каждую учетную запись, возьмите на себя роль и получите доступ к учетной записи.
...