AWS – Python – Criação de usuários IAM

Objetivo

Este script faz a criação de usuários IAM em todas as contas AWS registradas no arquivo credentials.

Método

Antes da execução é preciso configurar quais os usuários deverão ser criados e a policy que o usuário deve receber.

Estas configurações deverão ser feitas nas variáveis aws_new_users e policyArn.

O script pode criar diversos usuários atribuindo diversas Policies em diversas contas AWS.

Para que o script execute corretamente, o arquivo credencials só pode ter uma entrada de perfil para cada conta AWS.

Se houver mais de uma access key/secret key no arquivo credecials a saída do script ficará duplicada.

Se não houver uma credencial associada a alguma conta AWS, a conta em questão não será analisada.

Assim, se queremos analisar 20 contas AWS precisaremos de 20 credenciais cadastradas.

O formato de cada credencial no arquivo credencials deve ser semelhante a esta.

[aplicacoes]

aws_access_key_id = AKIADF4CHAVEFAKEOPYNDW2VF4

aws_secret_access_key = i7U!!9887chavefakehKUuyh9ajQVnC6BE4bgqW

Em máquinas Windows, por padrão, o arquivo credentials fica localizado em %USERPROFILE%\.aws\

O script também considera que as 3 primeiras linhas do arquivo credencials são destinadas para o perfil default.

Código
				
					import boto3
import os.path
import random
import string
import sys

def gera_senha():
    characters = string.ascii_letters + string.digits + string.punctuation
    password = ''.join(random.choice(characters) for i in range(12))
    return password

def cria_user_session(perfil):
    session = boto3.Session(profile_name=perfil)  # abre uma sessão.
    return session

def cria_sts_client_object(session):
    client_sts = session.client('sts')  # abre um cliente do tipo sts para recuperar o account_id.
    return client_sts

def cria_iam_client_object(session):
    client_iam = session.client('iam')  # abre um cliente do tipo iam para criar os usuários.
    return client_iam

def lista_aws_accounts():
    path = "~/.aws/credentials"    # path do arquivo credencials.
    full_path = os.path.expanduser(path)    # full_path armazena o path completo do arquivo credencials.

    contasAWS = []

    with open(full_path, 'r') as f:    # abre o arquivo de credenciais.
        next(f)    # ignora a credencial "default" (3 primeiras linhas).
        next(f)
        next(f)
        lines = f.readlines()    # lê o arquivo e joga as linhas do arquivo como itens de lista lines.
        f.close()

    for line in lines:    # faz um loop em lines para verificar se é um nome de profile ou access_key ou secret_access_key.
        if line.startswith('['):    # se a linha começar com colchetes então é o nome do perfil AWS.
            perfil = line[1:-2]
            contasAWS.append(perfil)

    return contasAWS

def main():
    aws_new_users = ['thiago.silva','joao.veiga']  # lista dos usuários IAM que serão criados.
    policyArn = ['arn:aws:iam::aws:policy/AdministratorAccess']  # lista das policies que cada usuário deve receber.

    contasAWS = lista_aws_accounts()

    for perfil in contasAWS:

            session = cria_user_session(perfil)  # Cria sessão do usuário

            client_sts = cria_sts_client_object(session)  # Cria cliente STS

            account_id = client_sts.get_caller_identity().get('Account')  # Obtém o AccountID

            client_iam = cria_iam_client_object(session)  # Cria cliente IAM

            for user in aws_new_users:
                senha = gera_senha()
                try:
                    response_new_user = client_iam.create_user(UserName=user)  # cria o usuário IAM
                except Exception as e:
                    if e.response['Error']['Code'] == 'EntityAlreadyExists':
                        print('Usuário IAM já existe: {}'.format(user))
                        sys.exit(0)
                    else:
                        print('Verifique o código de erro e tente novamente.')
                        print(e)
                        sys.exit(0)

                response_login_profiles = client_iam.create_login_profile(UserName=user, Password=senha, PasswordResetRequired=True)  # configura senha
                for policy in policyArn:
                    response_attach = client_iam.attach_user_policy(UserName=user, PolicyArn=policy)  # atribui uma policy ao usuário

                print('URL de login: https://{}.signin.aws.amazon.com/console'.format(account_id))
                print('Nome de usuário: {}'.format(user))
                print('Senha: {}'.format(senha, user))
                print('...................................')

if __name__=="__main__":
    main()

				
			

It’s done!

Bruno Veiga

Bruno Veiga

Arquiteto Cloud e Arquiteto de Soluções. Me dedicando em compartilhar conhecimento e ajudar empresas a encontrar as melhores soluções tecnológicas para os problemas do negócio com agilidade, segurança, equipes alinhadas e dentro do orçamento.