As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Alternar as credenciais do banco de dados sem reiniciar os contêineres
Criado por Josh Joy () AWS
Resumo
Na nuvem da Amazon Web Services (AWS), você pode usar o AWS Secrets Manager para alternar, gerenciar e recuperar as credenciais do banco de dados durante todo o ciclo de vida. Usuários e aplicativos recuperam segredos com uma chamada para o Secrets ManagerAPI, eliminando a necessidade de codificar informações confidenciais em texto simples.
Se você estiver usando contêineres para cargas de trabalho de microsserviços, poderá armazenar credenciais com segurança no Secrets Manager. AWS Para separar a configuração do código, essas credenciais geralmente são injetadas no contêiner. No entanto, é importante alternar suas credenciais periodicamente e automaticamente. Também é importante oferecer suporte à capacidade de atualizar as credenciais após a revogação. Ao mesmo tempo, os aplicativos exigem a capacidade de alternar as credenciais e, ao mesmo tempo, reduzir qualquer impacto potencial na disponibilidade posterior.
Esse padrão descreve como alternar seus segredos protegidos com o AWS Secrets Manager em seus contêineres sem exigir que eles reiniciem. Além disso, esse padrão reduz o número de pesquisas de credenciais no Secrets Manager usando o componente de cache do lado do cliente do Secrets Manager. Ao usar o componente de cache do lado do cliente para atualizar as credenciais no aplicativo, o contêiner não precisa ser reiniciado para obter uma credencial alternada.
Essa abordagem funciona para o Amazon Elastic Kubernetes Service (Amazon) e o EKS Amazon Elastic Container Service (Amazon). ECS
Dois cenários são abordados. No cenário de usuário único, a credencial do banco de dados é atualizada na rotação secreta, detectando a credencial expirada. O cache de credenciais é instruído a atualizar o segredo e, em seguida, o aplicativo restabelece a conexão com o banco de dados. O componente de cache do lado do cliente armazena em cache a credencial dentro do aplicativo e ajuda a evitar o contato com o Secrets Manager para cada consulta de credencial. A credencial é alternada dentro do aplicativo sem a necessidade de forçar a atualização da credencial ao reiniciar o contêiner.
O segundo cenário alterna o segredo ao alternar entre dois usuários. Ter dois usuários ativos reduz a possibilidade de tempo de inatividade, pois as credenciais de um usuário estão sempre ativas. A rotação de credenciais de dois usuários é útil quando você tem uma grande implantação com clusters nos quais pode haver um pequeno atraso na propagação das atualizações de credenciais.
Pré-requisitos e limitações
Pré-requisitos
Uma conta da AWS ativa.
Um aplicativo executado em um contêiner na Amazon EKS ou na AmazonECS.
Credenciais armazenadas no Secrets Manager, com a alternância ativada.
Um segundo conjunto de credenciais armazenado no Secrets Manager, se estiver implantando a solução para dois usuários. Exemplos de código podem ser encontrados no GitHub repo aws-secrets-manager-rotation-lambdas
. Um banco de dados Amazon Aurora.
Limitações
Este exemplo é voltado para aplicativos em Python. Para aplicativos Java, você pode usar o componente Java de cache do lado do cliente ou a biblioteca de cache
do lado do JDBC cliente para o Secrets Manager.
Arquitetura
Arquitetura de destino
Cenário 1: alternância de uma credencial para um único usuário
No primeiro cenário, uma única credencial de banco de dados é alternada periodicamente pelo Secrets Manager. O contêiner do aplicativo é executado no Fargate. Quando a primeira conexão com o banco de dados é estabelecida, o contêiner do aplicativo busca a credencial do banco de dados para o Aurora. O componente de cache do Secrets Manager então armazena em cache a credencial para o estabelecimento futuro da conexão. Quando o período de rotação termina, a credencial expira e o banco de dados retorna um erro de autenticação. O aplicativo então busca a credencial alternada, invalida o cache e atualiza o cache de credenciais por meio do componente de cache do lado do cliente do Secrets Manager.
Nesse cenário, pode haver uma interrupção mínima enquanto a credencial está sendo alternada e as conexões obsoletas estão usando a credencial desatualizada. Essa preocupação pode ser resolvida usando o cenário de dois usuários.
Cenário 2: alternância de credenciais para dois usuários
No segundo cenário, duas credenciais de usuário do banco de dados (Alice e Bob) são alternadas periodicamente pelo Secrets Manager. O contêiner do aplicativo é executado em um cluster Fargate. Quando a primeira conexão com o banco de dados é estabelecida, o contêiner do aplicativo busca a credencial do banco de dados Aurora para o primeiro usuário (Alice). O componente de cache do Secrets Manager então armazena em cache a credencial para o estabelecimento futuro da conexão.
Embora existam dois usuários e credenciais, uma única credencial ativa é gerenciada pelo Secrets Manager. Nesse caso, o componente de cache expira periodicamente e busca a credencial mais recente. Se o período de alternância do Secrets Manager for maior que o tempo limite do cache, o componente de cache pega a credencial alternada para o segundo usuário (Bob). Por exemplo, se a expiração do cache for medida em minutos e o período de alternância for medido em dias, o componente de cache buscará a nova credencial como parte da atualização periódica do cache. Dessa forma, o tempo de inatividade é minimizado porque a credencial de cada usuário está ativa para uma alternância do Secrets Manager.
Automação e escala
Você pode usar AWS CloudFormationpara implantar esse padrão usando a infraestrutura como código. Isso compila e cria o contêiner do aplicativo, cria a tarefa do Fargate, implanta o contêiner no Fargate e configura o Secrets Manager com o Aurora. Para obter instruções de step-by-step implantação, consulte o arquivo readme
Ferramentas
Ferramentas
AWSO Secrets Manager permite a substituição de credenciais codificadas, incluindo senhas, por uma API chamada para o Secrets Manager para recuperar o segredo. Como o Secrets Manager pode alternar automaticamente o segredo de acordo com uma agenda, você pode substituir segredos de longo prazo por segredos de curto prazo, reduzindo o risco de comprometimento.
O Docker
ajuda os desenvolvedores a empacotar, enviar e executar qualquer aplicativo como um contêiner leve, portátil e autossuficiente.
Código
Código em Python de exemplo
Esse padrão usa o componente de cache do lado do cliente Python para o Secrets Manager para recuperar as credenciais de autenticação ao estabelecer a conexão com o banco de dados. O componente de cache do lado do cliente ajuda a evitar o contato com o Secrets Manager todas as vezes.
Agora, quando o período de rotação terminar, a credencial em cache expirará e a conexão com o banco de dados resultará em um erro de autenticação. Para MySQL, o código de erro de autenticação é 1045. Este exemplo usa o Amazon Aurora for MySQL, embora você possa usar outro mecanismo, como o Postgre. SQL Após o erro de autenticação, o código de tratamento da exceção de conexão do banco de dados detecta o erro. Em seguida, informa-se o componente de cache do lado do cliente do Secrets Manager para atualizar o segredo e, em seguida, reautenticar e restabelecer a conexão com o banco de dados. Se você estiver usando o Postgre SQL ou outro mecanismo, deverá procurar o código de erro de autenticação correspondente.
O aplicativo de contêiner agora pode atualizar a senha do banco de dados com a senha alternada sem reiniciar o contêiner.
Coloque o código a seguir no código do seu aplicativo que manipula as conexões do banco de dados. Este exemplo usa o Django e subclassifica
def get_new_connection(self, conn_params): try: logger.info("get connection") databasecredentials.get_conn_params_from_secrets_manager(conn_params) conn =super(DatabaseWrapper,self).get_new_connection(conn_params) return conn except MySQLdb.OperationalError as e: error_code=e.args[0] if error_code!=1045: raise e logger.info("Authentication error. Going to refresh secret and try again.") databasecredentials.refresh_now() databasecredentials.get_conn_params_from_secrets_manager(conn_params) conn=super(DatabaseWrapper,self).get_new_connection(conn_params) logger.info("Successfully refreshed secret and established new database connection.") return conn
AWS CloudFormation e código Python
Épicos
Tarefa | Descrição | Habilidades necessárias |
---|---|---|
Instale o componente de cache. | Baixe e instale o componente de cache do lado do cliente do Secrets Manager para Python. Para obter o link para download, consulte a seção Recursos relacionados. | Desenvolvedor |
Armazene em cache a credencial de trabalho. | Use o componente de cache do lado do cliente do Secrets Manager para armazenar em cache a credencial de trabalho localmente. | Desenvolvedor |
Atualize o código do aplicativo para atualizar a credencial após o erro não autorizado da conexão com o banco de dados. | Atualize o código do aplicativo para usar o Secrets Manager para buscar e atualizar as credenciais do banco de dados. Adicione a lógica para lidar com códigos de erro não autorizados e, em seguida, busque a credencial recém-alternada. Consulte a seção Código em Python de exemplo. | Desenvolvedor |
Recursos relacionados
Crie um segredo do Secrets Manager
Crie um cluster do Amazon Aurora
Crie os ECS componentes da Amazon
Baixe e instale o componente de cache do lado do cliente do Secrets Manager
Anexos
Para acessar o conteúdo adicional associado a este documento, descompacte o seguinte arquivo: attachment.zip