O blog da AWS

Rotacione automaticamente as credenciais de banco de dados no Amazon RDS com o AWS Secrets Manager

Por Apurv Awasthi

O AWS Secrets Manager é um serviço que facilita a rotação, o gerenciamento e a recuperação de credenciais de banco de dados, chaves de API e outros segredos ao longo de seu ciclo de vida. Você pode configurar o AWS Secrets Manager para rotacionar segredos automaticamente, o que pode ajudá-lo a atender às suas necessidades de segurança e conformidade. O AWS Secrets Manager oferece integrações para MySQL, PostgreSQL e Amazon Aurora no Amazon RDS e pode rotacionar credenciais para esses bancos de dados nativamente. Você pode controlar o acesso aos seus segredos usando políticas refinadas do AWS Identity and Access Management (IAM). Para recuperar segredos, os funcionários substituem segredos armazenados em texto claro por uma chamada para APIs do AWS Secrets Manager, eliminando a necessidade de codificar segredos no código-fonte ou atualizar arquivos de configuração e reimplantar o código quando os segredos são rotacionados.

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

  1. Abra a console do AWS Secrets Manager e selecione Store a new secret.Secrets Manager console interface
  2. 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.

  3. 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 
  4. 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.Select the RDS database interface
  5. 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.Secret Name and description interface
  6. 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.

  7. 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.
  8. 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.

  1. Conecte em sua instancia Amazon EC2 via Secure Shell (SSH).
  2. 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 config
    def 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)
  3. 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 ClientError
    def 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.
  4. É 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.

  1. Na console do AWS Secrets Manager, navegue na lista de segredos e selecione o segredo criado na primeira etapa Applications/MyApp/MySQL-RDS-Database.List of secrets in the Secrets Manager console
  2. Navegue até a tela de Rotation configuration, e clique em Edit rotation.Rotation configuration interface
  3. 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.
  4. 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.
  5. 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.
  6. 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.