Maio 17, 2020

Vault - Gerenciando Acesso a AWS com Dynamic Secrets

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)

Vault Sealed: False

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

$ vault secrets enable -path=aws aws

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 o access_key e o secret_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
$ 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.

AWS IAM Users

Podemos também revogar a credencial gerada através do comando vault lease revoke

$ vault lease revoke aws/creds/ec2-full-access/nHBDTgMmFylGhec6KgISzkvB
$ 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!