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!