Vault - Gerenciando Acesso a AWS com Dynamic Secrets

O Vault tem diversas funcionalidades e dizer que ele é apenas um "cofre de senhas" não é correto, uma vez que ele tem todo um motor e diversas integrações
Hoje iremos integrar nosso Vault server criado no post Vault 101 com a AWS utilizada no post Terraform 101 para que possamos gerenciar o acesso a AWS de forma segura utilizando Dynamic Secrets.
Caso você tenha chegado agora no blog, verifique todos os posts na TAG: IAC , com certeza você encontrará vários conteúdos interessantes por lá.
Primeiros Passos
Primeiramente iremos ligar e acessar nossa máquina Vault, bem como Destravar o cofre de segredos.
Caso não tenha a máquina ainda, a recomendação é que siga o post do vault-101.
Abra um novo terminal e ligue a máquina vault
$ cd ~/vault-101
$ vagrant up
$ vagrant ssh
Destravando o Cofre
Agora vamos destravar o cofre com 3 das 5 keys que foram geradas anteriormente através do comando vault operator unseal
Note que as keys são diferentes para cada instalação do vault, no meu caso utilizarei as mesmas do tutorial.
$ vault operator unseal -address=http://10.10.10.10:8200
Execute o comando acima 3 vezes e informe três chaves diferentes, no meu caso o comando ficou
$ vault operator unseal -address=http://10.10.10.10:8200
> F9Yo6vPumyQfuhTlTqcgkJhG3s02oeKJ6hNmkDKzItDE
$ vault operator unseal -address=http://10.10.10.10:8200
> tuRLZjNOIv2DPO+TD3P3h9Gv1QQSL8rsFhjAe5q4CheH
$ vault operator unseal -address=http://10.10.10.10:8200
> qA1TZ5J9iE2V3R6y/5DJh0i29MPTnGLsF/hvia2sOVAS
Ao final do processo deve ser exibida a mensagem informando que o cofre não está mais no estado sealed
(lacrado)

Habilitando a Engine de Secrets da AWS
Agora que temos nossa máquina disponível, podemos então sair da máquina server e executar os comandos diretamente em nossa máquina hospedeira através do vault.
Na sua máquina, efetue o login no vault através do script criado no post Vault-101 e verifique se a conexão esta ok.
$ cd ~/vault/
$ source configurevault.sh
$ vault status
Agora que estamos conectados ao servidor do Vault, podemos habilitar a engine de secrets da AWS através do comando
$ vault secrets enable -path=aws aws
Uma mensagem informará que a engine foi habilitada com sucesso

Configurando a Engine de Secrets da AWS
Com a engine habilitada, precisamos configura-la, para isto utilizaremos a chave de acesso com Full Access
criada anteriormente
Caso você queira criar uma nova chave de acesso, basta seguir os passos no post Terraform 101
$ vault write aws/config/root \
access_key=AKIARR2QTEG7UHP3KLKE \
secret_key=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 \
region=us-east-1
Altere oaccess_key
e osecret_key
pelos valores da sua conta, por questões de segurança este usuário não existe mais em minha conta.
Com os dados de acesso a AWS, precisamos configurar uma role. O Vault sabe como criar os usuários no IAM através da API da AWS, mas não sabe quais permissões, grupos e políticas anexar a este usuário. Iremos criar uma politica para dar acesso full a EC2 para os usuários criados.
Para mais informações sobre politicas da AWS verifique a Documentação Oficial.
vault write aws/roles/ec2-full-access \
credential_type=iam_user \
policy_document=-<<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1426528957000",
"Effect": "Allow",
"Action": [
"ec2:*"
],
"Resource": [
"*"
]
}
]
}
EOF

Gerando a credencial temporária para acesso a AWS
Com a engine de secrets da AWS configurada no Vault com uma role, podemos solicitar que o Vault faça a geração de uma access_key
e secret_key
temporária para esta role ao ler o caminho aws/creds/<nome>
onde <nome>
corresponde ao nome da role existente, no nosso caso ec2-full-access
$ vault read aws/creds/ec2-full-access

Podemos então utilizar a access_key
e secret_key
para acessar a AWS. Podemos também verificar diretamente no painel do IAM na AWS o user criado.

Podemos também revogar a credencial gerada através do comando vault lease revoke
$ vault lease revoke aws/creds/ec2-full-access/nHBDTgMmFylGhec6KgISzkvB

Bônus: Criando uma politica aws-read-only e aws-full-acccess
Agora que temos nossa política ec2-full-access criada, seria interessante ter uma política ec2-read-only para limitarmos o usuário a apenas visualizar os dados da EC2 e uma para dar acesso total a todos os recursos da AWS.
Vamos criar nossa politica ec2-read-only
$ vault write aws/roles/ec2-read-only \
credential_type=iam_user \
policy_document=-<<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1426528957000",
"Effect": "Allow",
"Action": [
"ec2:Get*",
"ec2:List*",
"ec2:Generate*"
],
"Resource": [
"*"
]
}
]
}
EOF
Utilize o comando $ vault read aws/creds/ec2-read-only
para gerar as credenciais
Vamos criar agora a política aws-full-access
$ vault write aws/roles/aws-full-access \
credential_type=iam_user \
policy_document=-<<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1426528957000",
"Effect": "Allow",
"Action": [
"*"
],
"Resource": [
"*"
]
}
]
}
EOF
Utilize o comando $ vault read aws/creds/aws-full-access
para gerar as credenciais.
Este post é o terceiro da série de posts onde utilizaremos o Vault.
Nos próximos posts iremos integrar o Vault com o Terraform para gerar de forma segura os recursos na AWS.
Ficamos por aqui com esse post e nos vemos em uma próxima!