Conectando em RDS usando IAM

Francisco Edilton
3 min readDec 13, 2017

--

Se você já leu outras postagens, sabe o quanto eu sou interessado em segurança. E uma das coisas que sempre achei irritante é rotação de senha e/ou colocar credenciais em arquivos de configuração. Pois isso sempre implica em deploys, mudanças e tempo desperdiçado.

Então quando vi a notícia da AWS liberando o recurso de acesso ao banco de dados Mysql e Aurora usando credenciais IAM fiquei muito interessado. Principalmente com o fato de que as credenciais são rotacionadas a cada 15 minutos. Acho que atinge qualquer compliance de rotação de senha :)

A única desvantagem é que como é AWS que gerencia isso, e ela faz através de um serviço chamado STS (Security Token Service), sua aplicação deve suportar a chamada para requisição da sua senha. Vamos alguns exemplos para ilustrar.

Recomendo que cheque esse link para ver se houve alguma atualização.
Mas até o momento desse post, você precisava estar rodando as seguintes versões de banco no RDS:

  • Mysql 5.6: 5.6.34 ou superior
  • Mysql 5.7: 5.7.16 ou superior
  • Aurora 1.10 ou superior

IMPORTANTE: seu RDS deve ter a opção IAM DB Authentication habilitada. Caso não tenha, você precisa modificar a sua instância para ativar. E a sua conexão precisa ser com SSL sempre.

Nesse post usamos o Mysql 5.7.17 em uma instância t2.micro rodando em Ohio (us-east-2).

Primeiro passo é definir qual será o nome do usuário. No nosso caso vamos usar "usuarioiam".
Vamos então nos conectar no banco mysql e criar o usuário da seguinte maneira:

create user usuarioiam IDENTIFIED WITH AWSAuthenticationPlugin as 'RDS';

Agora precisamos criar uma policy IAM, salve-a com um nome amigável.

IMPORTANTE: reparem que esse ARN é um pouco diferente dos outros. Ele segue o seguinte padrão:

arn:aws:rds-db:region:account-id:dbuser:dbi-resource-id/database-user-name

O Resource ID você encontra nas informações do seu RDS e ele tem um padrão semelhante a este:

db-KKKABAAABBBCCCDDD222111ZZZ

Agora crie uma role IAM para EC2 (caso não conheça esse processo, eu recomendo esse artigo) e anexe a policy acima, salve-a com um nome amigável.

OBS: pode ser um usuário também, mas para mim não faz sentido. Visto que a idéia é não ter que colocar nenhum tipo de credencial na instância ou na aplicação.

Anexe a role na instância EC2 que você vai testar o funcionamento.

Conecte-se usando as informações da documentação da AWS ou seguindo um dos exemplos abaixo:

Bash

Configure o seu AWS CLI:

aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: us-east-2
Default output format [None]: json

Feito isso, gere o token:

aws rds generate-db-auth-token --hostname endpoint_rds --port 3306 --username usuarioiam

O resultado será algo semelhante a esse texto:

endpoint.us-east-2.rds.amazonaws.com:3306/?Action=connect&DBUser=usuarioiam&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900&X-Amz-Date=20170917T121427Z&X-Amz-SignedHeaders=host&X-Amz-Security-Token=FQoAYXdzEHUaDMlp%2BntuaLCNDgveTCK3Aw90z3NVoCj77hdHTdZioE22dcvamgE1PTKqjfcRXjMiJptfK809%2F8NdzZwq1K1sDzBtfTwRfhmmwHvZHbgiKy5VPeXXsSmL%2BUZ7v35oGdVHDHUQFBNE9VlcRgJ6xPN5NNIr4wfDPY4miIAicedopydmu9nfZykrepIqvkV1R8xmvqVdLc8OHDbGAPwtcNlip0I6qcWztTd9Zr7HedEUrh%2B6is1xKKu6T2HrZmeE4%2BDzxSB3YIaNRo8WlWqv2yg2ta3%2FM8BMQ2UP%2BDxVSLljGqVDOPBTfzKSwK4y5it3jKjlYHPACzBo0Abd1xH5w5zxvIKeatwzCpwCQbyhg0pgY0ZNWeEMavMTjiB6NdH4jqEihsINGO5AwRjBuiyRDyhEGEMUpKlr6fiXIG9UPRxDdGwcisAUDOhWXH5yDTZws8m%2FguB4WTqYW6GpMKn0MK7qzGp1o1bvQRHOyASybEXVoKBYLwbz%2BaE3JGpcDHINJmUXtAPzgRQGTLaFD1Er0QZUWQjohKYMIn9Ua8GSyoLGpOY%2BEj%2BQLzUK1XtE3%2B%2FVtXN21q0w9why%AAAe4F9jUESoyCGY55KuSbCko4cv5zQU%3D&X-Amz-Credential=AAAAINTO6669S111MIKA%2F20170917%2Fus-east-2%2Frds-db%2Faws4_request&X-Amz-Signature=87bcd57ffeae4b825e3ff9309bea27cf8ce06baef2d77d8b2561ebcb7fc4f186

Todo esse texto é o seu token, copie-o integralmente e substitua no comando abaixo pela senha:

mysql -h endpoint.rds.amazonaws.com -u usuarioiam --ssl --enable-cleartext-plugin --password='senha'

Pronto estamos conectados. Naturalmente o não concedemos nenhum tipo de permissão ao usuário, então ele não vai poder fazer quase nada. Mas a conexão funcionou.

Python

Faça download da chave da aws em na documentação do RDS:

Geração do token e conexão com o banco:

Java

Esse exemplo foi retirado da documentação do RDS

Geração do token:

Conexão com o banco:

Espero ter ajudado a esclarecer o assunto. Caso tenha alguma dúvida, escreve aqui em baixo. Caso esteja testando, não esqueça de remover os recursos criados.

--

--