O blog da AWS
Rotacione automaticamente as credenciais de banco de dados no Amazon RDS com o AWS Secrets Manager
Neste post, apresento os principais recursos do AWS Secrets Manager. Em seguida, mostro como armazenar uma credencial de banco de dados para um banco de dados MySQL hospedado no Amazon RDS e como seus aplicativos podem acessar esse segredo. Finalmente, mostro como configurar o AWS Secrets Manager para rotacionar esse segredo automaticamente.
Principais recursos do AWS Secrets Manager
Esses recursos incluem a habilidade para:
- Rotacionar segredos com segurança. Você pode configurar o AWS Secrets Manager para rotacionar os segredos de forma automática sem interromper seus aplicativos. O AWS Secrets Manager oferece integrações para bancos de dados do Amazon RDS para MySQL, PostgreSQL e Amazon Aurora. Você pode estender o AWS Secrets Manager para atender aos requisitos de rotação personalizados, criando uma função do AWS Lambda para rotacionar outros tipos de segredos. Por exemplo, você pode criar uma função do AWS Lambda para rotacionar tokens OAuth usados em aplicativos móveis. Usuários e aplicações recuperam o segredo do AWS Secrets Manager, eliminando a necessidade de enviar segredos por e-mail para desenvolvedores ou atualizar e reimplantar aplicações depois que o AWS Secrets Manager rotaciona um segredo.
- Proteja e gerencie segredos de forma central Você pode armazenar, visualizar e gerenciar todos os seus segredos. Por padrão, o AWS Secrets Manager cifra esses segredos com chaves criptograficas que você possui e controla. Usando políticas refinadas do IAM, você pode controlar o acesso aos segredos. Por exemplo, você pode exigir que os desenvolvedores forneçam um segundo fator de autenticação quando tentarem recuperar uma credencial de banco de dados de produção. Você também pode criar uma tag nos segredos para ajudá-lo a descobrir, organizar e controlar o acesso aos segredos usados em toda a organização.
- Monitore e audite com facilidade. O AWS Secrets Manager se integra com os serviços de log e monitoramento da AWS para permitir com que você atenda aos seus requisitos de segurança e conformidade. Por exemplo, você pode auditar os logs do AWS CloudTrail para verificar quando o AWS Secrets Manager rotacionou um segredo ou configurar o AWS CloudWatch Events para alertá-lo quando um administrador excluir um segredo.
- Pagamento conforme o uso. Pague pelos segredos que você armazena no AWS Secrets Manager e pelo uso desses segredos; não há contratos de longo prazo ou taxas de licenciamento.
Introdução ao AWS Secrets Manager
Agora que você está familiarizado com os principais recursos, mostraremos como armazenar a credencial para um banco de dados MySQL hospedado no Amazon RDS. Para demonstrar como recuperar e usar o segredo, será utilizado um aplicativo Python em execução no Amazon EC2 que requer essa credencial de banco de dados para acessar a instância do MySQL. Por fim, mostraremos como configurar o AWS Secrets Manager para rotacionar essa credencial de banco de dados automaticamente. Vamos começar.
Etapa 1: Armazenar o segredo no AWS Secrets Manager
- Abra a console do AWS Secrets Manager e selecione Store a new secret.
- Selecione Credentials for RDS database porque iremos armazenar credenciais para um banco de dados MySQL hospedado no Amazon RDS. Para este exemplo, armazene as credenciais do super usuário do banco de dados. Comece protegendo o
superuser
, porque é a credencial de banco de dados mais poderosa e tem acesso total ao banco de dados.
Nota: Para este exemplo, você precisará de permissões para armazenar segredos no AWS Secrets Manager. Para conceder essas permissões, você pode usar a Managed Policy
SecretsManagerReadWriteAccess
. Leia a documentação do AWS Secrets Manager para obter mais informações sobre a permissão mínima de IAM para armazenar o segredo. - Em seguida, analise a configuração de criptografia e escolha usar as configurações de criptografia padrão. O AWS Secrets Manager ira cifrar esse segredo usando a chave
aws/secretsmanager
do AWS Secrets Manager nesta conta. Como alternativa, você pode optar por cifrar usando uma chave KMS armazenada no AWS KM - Em seguida, visualize a lista de instâncias do Amazon RDS na conta e selecione o banco de dados que essa credencial pertence. Para este exemplo, selecionei a instância de banco de dados
mysql-rds-database
e, em seguida, clique em Next. - Nesta etapa, especifique os valores para Secret Name e Description. Para este exemplo, utilizamos o nome
Applications/MyApp/MySQL-RDS-Database
e inserimos uma descrição deste segredo e, em seguida, clique em Next. - Para a próxima etapa, mantenha a configuração padrão com o Automatic rotation desativado, porque esse segredo é usado pelo aplicativo em execução no Amazon EC2. Ativaremos a rotação depois de atualizar o aplicativo (consulte a Etapa 3 abaixo) para usar as APIs do AWS Secrets Manager para recuperar segredos. Em seguida, clique em Next.
Nota: Se você estiver armazenando um segredo que não está usando em seu aplicativo, selecione Enable automatic rotation. Consulte nosso guia de introdução do AWS Secrets Manager sobre rotação para obter detalhes.
- Revise as informações na próxima tela e se tudo estiver correto, selecione Store. Agora nós concluímos com sucesso o armazenamento do segredo no AWS Secrets Manager.
- Em seguida, selecione o segredo criado e navegue até a configuração do Sample code. Anote o exemplo de código fornecido na aba Python3. Esse código será utilizado para atualizar a aplicação para recuperar o segredo usando as APIs do AWS Secrets Manager.
Etapa 2: Atualização da aplicação para obter o segredo pelo AWS Secrets Manager
Agora que armazenamos o segredo no AWS Secrets Manager, atualizaremos a aplicação para recuperar a credencial do banco de dados no AWS Secrets Manager, em vez de codificar essas informações em um arquivo de configuração ou código-fonte. Neste exemplo, mostro como configurar um aplicativo python para recuperar esse segredo do AWS Secrets Manager.
- Conecte em sua instancia Amazon EC2 via Secure Shell (SSH).
- Anteriormente, a aplicação foi configurada para obter o usuário e senha do banco de dados através de um arquivo de configuração. Veja abaixo o código utilizado pela aplicação.
import MySQLdb
import configdef no_secrets_manager_sample()
# Get the user name, password, and database connection information from a config file.
database = config.database
user_name = config.user_name
password = config.password
# Use the user name, password, and database connection information to connect to the database
db = MySQLdb.connect(database.endpoint, user_name, password, database.db_name, database.port) - Utilize o exemplo de código copiado na etapa 1 acima e atualize o aplicativo para recuperar o nome de usuário e a senha pelo AWS Secrets Manager. Esse código configura o cliente, recupera e descriptografa o segredo Applications/MyApp/MySQL-RDS-Database. Foi adicionado os comentários no código para facilitar a compreensão.
# Use the code snippet provided by Secrets Manager.
import boto3
from botocore.exceptions import ClientErrordef get_secret():
#Define the secret you want to retrieve
secret_name = "Applications/MyApp/MySQL-RDS-Database"
#Define the Secrets mManager end-point your code should use.
endpoint_url = "https://secretsmanager.us-east-1.amazonaws.com"
region_name = "us-east-1"
#Setup the client
session = boto3.session.Session()
client = session.client(
service_name='secretsmanager',
region_name=region_name,
endpoint_url=endpoint_url
)
#Use the client to retrieve the secret
try:
get_secret_value_response = client.get_secret_value(
SecretId=secret_name
)
#Error handling to make it easier for your code to tolerate faults
except ClientError as e:
if e.response['Error']['Code'] == 'ResourceNotFoundException':
print("The requested secret " + secret_name + " was not found")
elif e.response['Error']['Code'] == 'InvalidRequestException':
print("The request was invalid due to:", e)
elif e.response['Error']['Code'] == 'InvalidParameterException':
print("The request had invalid params:", e)
else:
# Decrypted secret using the associated KMS key
# Depending on whether the secret was a string or binary, one of these fields will be populated
if 'SecretString' in get_secret_value_response:
secret = get_secret_value_response['SecretString']
else:
binary_secret_data = get_secret_value_response['SecretBinary']
# Your code goes here.
- É necessário conceder acesso para que as aplicações utilizem o AWS Secrets Manager. O aplicativo é executado no Amazon EC2 e usa uma IAM role para obter acesso aos serviços da AWS. Vamos anexar a política listada abaixo na IAM role. Essa política usa a ação GetSecretValue para conceder permissões de leitura do segredo no AWS Secrets Manager para o aplicativo. Essa política também usa o elemento de Resource para limitar o aplicativo a ler somente o segredo do banco de dados Applications/MyApp/MySQL-RDS-Database do AWS Secrets Manager. Você pode visitar a documentação do AWS Secrets Manager para entender as permissões mínimas do IAM necessárias para recuperar um segredo.
{
"Version": "2012-10-17",
"Statement": {
"Sid": "RetrieveDbCredentialFromSecretsManager",
"Effect": "Allow",
"Action": "secretsmanager:GetSecretValue",
"Resource": "arn:aws:secretsmanager:::secret:Applications/MyApp/MySQL-RDS-Database"
}
}
Etapa 3: Ative o rotacionamento do seu segredo
Rotacionar os segredos periodicamente é uma boa prática de segurança, pois reduz o risco de uso indevido dos segredos. O AWS Secrets Manager facilita o acompanhamento dessa melhor prática de segurança e oferece integrações bulit-in para rotacionar credenciais de bancos de dados MySQL, PostgreSQL e Amazon Aurora hospedados no Amazon RDS. Quando você ativa a rotação, o AWS Secrets Manager cria uma função Lambda e atribui uma IAM role a essa função para executar rotações em uma periodicidade definida por você.
Nota: Configurar a rotação é uma ação privilegiada que requer várias permissões do IAM e você só deve conceder esse acesso a pessoas confiáveis. Para conceder essas permissões, você pode usar a política gerenciada do AWS IAMFullAccess.
Em seguida, mostraremos como configurar o AWS Secrets Manager para rotacionar o segredo Applications/MyApp/MySQL-RDS-Database
automaticamente.
- Na console do AWS Secrets Manager, navegue na lista de segredos e selecione o segredo criado na primeira etapa
Applications/MyApp/MySQL-RDS-Database
. - Navegue até a tela de Rotation configuration, e clique em Edit rotation.
- Para ativar a rotação, ative a opção Automatic rotation. Em seguida, selecione qual a frequência que o AWS Secrets Manager deve realizar a rotação do segredo. Para esse exemplo, foi configurado o intervalo de rotação para 60 dias.
- Na sequência, criaremos uma função Lambda pelo AWS Secrets Manager para rotacionar o segredo. Para isso selecione a opção Create a rotation function e forneça um nome para essa função. Nesse caso utilizamos mysql-rotation-lambda. O AWS Secrets Manager irá adicionar o nome SecretsManager no início do nome da função criada.
- Na opção, Use separate credentials to rotate this secret selecione No pois utilizaremos a mesma credencial fornecida na Etapa 1. Em seguida, clique em Save.
- O banner na próxima tela confirma que a configuração da rotação foi realizada com sucesso e que a primeira rotação está em andamento, o que permite verificar se a rotação está funcionando conforme o esperado. O AWS Secrets Manager alterará essa credencial automaticamente a cada 60 dias.
Conclusão
Nesse post apresentamos o serviço do AWS Secrets Manager, onde explicamos os principais benefícios e como o AWS Secrets Manager pode ajudar a atender aos requisitos de conformidade, configurando o rotacionamento das credenciais de banco de dados automaticamente em seu nome. O AWS Secrets Manager ajuda você a proteger o acesso aos seus aplicativos, serviços e recursos de TI sem o investimento inicial e os custos de manutenção da operação de sua própria infraestrutura de gerenciamento de segredos. Para começar, visite o console do AWS Secrets Manager. Para saber mais, acesse a documentação do AWS Secrets Manager.
Se você tiver comentários sobre esta postagem, envie-os na seção comentários abaixo. Se você tiver dúvidas sobre alguma ponto desta postagem, inicie um novo tópico no fórum do AWS Secrets Manager.
Este artigo foi traduzido do Blog da AWS em Inglês.
Sobre o autor
Apurv Awasthi
Revisores
Mauricio Hollanda é arquiteto de soluções na Amazon Web Services para o setor público e tem foco no apoio aos clientes no segmento de Educação. Trabalha há mais de 17 anos com tecnologia da informação atuando na gestão de ambientes de nuvem, infraestrutura de data center e segurança e ingressou na AWS em 2022.
Ricardo Makino atualmente é arquiteto de soluções na AWS apoiando os clientes de governo em sua jornada para a nuvem, possui mais de 20 anos de experiência em TI onde já passou pelos setores de governo, educação e pesquisa atuando como administrador de redes e sistemas, analista de segurança da informação, pesquisador de segurança da informação e especialista em nuvem, e esteve envolvido em diversos projetos de tecnologias de orquestração de infraestrutura e plataforma, otimização de aplicações, migrações, segurança de redes e aplicações e outros.