Gerenciar credenciais usando o AWS Secrets Manager - Recomendações da AWS

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

Gerenciar credenciais usando o AWS Secrets Manager

Criado por Durga Prasad Cheepuri (AWS)

Criado por: AWS

Ambiente: PoC ou piloto

Tecnologias: bancos de dados; segurança, identidade, conformidade

Serviços da AWS: AWS Secrets Manager

Resumo

Esse padrão orienta você a usar o AWS Secrets Manager para buscar dinamicamente as credenciais do banco de dados para um aplicativo Java Spring.

No passado, quando você criava um aplicativo personalizado para recuperação de informações de um banco de dados, normalmente era necessário incorporar as credenciais (o segredo) para acessar o banco de dados diretamente no aplicativo. Quando chegou a hora de alternar credenciais, você precisava tirar tempo para atualizar a aplicação para usar novas credenciais e depois distribuir a aplicação atualizada. Se houvesse vários aplicativos compartilhando as credenciais e um deles não fosse atualizado, ele apresentaria falha. Devido a esse risco, muitos usuários optam por não alternar regularmente suas credenciais, o que, na verdade, substitui um risco por outro.

O Secrets Manager permite substituir credenciais codificadas, incluindo senhas, por uma chamada da API para recuperar o segredo por programação. Isso ajuda a garantir que o segredo não será comprometido por alguém que esteja examinando seu código, pois o segredo simplesmente não está ali. Configure também o Secrets Manager para alterar automaticamente o segredo de acordo com a programação que você especificar. Isso permite substituir segredos de longo prazo por outros de curto prazo, ajudando a reduzir de maneira significativa o risco de comprometimento. Para obter mais informações, consulte a documentação do AWS Secrets Manager.

Pré-requisitos e limitações

Pré-requisitos

  • Uma conta da AWS com acesso ao Secrets Manager

  • Um aplicativo Java Spring

Arquitetura

Pilha de tecnologia de origem

  • Um aplicativo Java Spring com código que acessa um banco de dados, com credenciais de banco de dados gerenciadas a partir do arquivo application.properties.

Pilha de tecnologias de destino

  • Um aplicativo Java Spring com código que acessa um banco de dados, com credenciais de banco de dados gerenciadas no Secrets Manager. O arquivo application.properties contém os segredos do Secrets Manager.

Integração do Secrets Manager com um aplicativo

Ferramentas

  • Secrets Manager – O AWS Secrets Manager é um serviço da AWS que facilita o gerenciamento de segredos. Os segredos podem ser credenciais de banco de dados, senhas, chaves de API de terceiros e até mesmo texto arbitrário. Você pode armazenar e controlar o acesso a esses segredos centralmente usando o console do Secrets Manager, a interface de linha de comandos (CLI) ou os SDKs e API do Secrets Manager.

Épicos

TarefaDescriçãoHabilidades necessárias
Armazene credenciais do banco de dados em segredo no Secrets Manager.

Armazene o Amazon Relational Database Service (Amazon RDS) ou outras credenciais de banco de dados como um segredo no Secrets Manager seguindo as etapas em Criação de um segredo na documentação do Secrets Manager.

Admin do sistema
Defina permissões para o aplicativo Spring acessar o Secrets Manager.

Defina as permissões apropriadas com base em como o aplicativo Java Spring usa o Secrets Manager. Para controlar o acesso ao segredo, crie uma política com base nas informações fornecidas na documentação do Secrets Manager, nas seções Usando políticas baseadas em identidade (políticas do IAM) e ABAC para o Secrets Manager e Usando políticas baseadas em recursos para o Secrets Manager. Siga as etapas na seção Recuperando o valor secreto na documentação do Secrets Manager.

Admin do sistema
TarefaDescriçãoHabilidades necessárias
Adicione dependências JAR para usar o Secrets Manager.

Consulte a seção Informações adicionais para obter detalhes.

Desenvolvedor Java
Adicione os detalhes do segredo ao aplicativo Spring.

Atualize o arquivo application.properties com o nome secreto, os endpoints e a região da AWS. Para obter um exemplo, consulte a seção Informações adicionais.

Desenvolvedor Java
Atualize o código de recuperação de credenciais de banco de dados em Java.

No aplicativo, atualize o código Java que busca as credenciais do banco de dados para obter esses detalhes do Secrets Manager. Para exemplo de código, consulte a seção Informações adicionais.

Desenvolvedor Java

Recursos relacionados

Mais informações

Adicionando dependências JAR para usar o Secrets Manager

Maven:

<groupId>com.amazonaws</groupId>     <artifactId>aws-java-sdk-secretsmanager</artifactId>     <version>1.11. 355 </version>

Gradle:

compile group: 'com.amazonaws', name: 'aws-java-sdk-secretsmanager', version: '1.11.355'

Atualizando o arquivo application.properties com os detalhes do segredo

spring.aws.secretsmanager.secretName=postgres-local spring.aws.secretsmanager.endpoint=secretsmanager.us-east-1.amazonaws.com spring.aws.secretsmanager.region=us-east-1

Atualizando o código de recuperação de credenciais de banco de dados em Java

String  secretName  =  env.getProperty("spring.aws.secretsmanager.secretName"); String  endpoints  =  env.getProperty("spring.aws.secretsmanager.endpoint"); String  AWS Region  =  env.getProperty("spring.aws.secretsmanager.region"); AwsClientBuilder.EndpointConfiguration  config  =  new  AwsClientBuilder.EndpointConfiguration(endpoints, AWS Region); AWSSecretsManagerClientBuilder  clientBuilder  =  AWSSecretsManagerClientBuilder.standard(); clientBuilder.setEndpointConfiguration(config); AWSSecretsManager  client  =  clientBuilder.build();        ObjectMapper  objectMapper  =  new  ObjectMapper();   JsonNode  secretsJson  =  null;   ByteBuffer  binarySecretData;   GetSecretValueRequest  getSecretValueRequest  =  new  GetSecretValueRequest().withSecretId(secretName);    GetSecretValueResult  getSecretValueResponse  =  null;   try  {      getSecretValueResponse  =  client.getSecretValue(getSecretValueRequest);     }   catch  (ResourceNotFoundException  e)  {      log.error("The requested secret "  +  secretName  +  " was not found");     }      catch  (InvalidRequestException  e)  {          log.error("The request was invalid due to: "  +  e.getMessage());      }      catch  (InvalidParameterException  e)  {          log.error("The request had invalid params: "  +  e.getMessage());      } if  (getSecretValueResponse  ==  null)  {          return  null;      }  // Decrypted secret using the associated KMS key // Depending on whether the secret was a string or binary, one of these fields will be populated               String secret = getSecretValueResponse.getSecretString();     if (secret != null) {        try {                         secretsJson  =  objectMapper.readTree(secret);                }           catch  (IOException  e)  {                         log.error("Exception while retrieving secret values: "  +  e.getMessage());                } }      else  {          log.error("The Secret String returned is null");          return null;              }      String  host  =  secretsJson.get("host").textValue();      String  port  =  secretsJson.get("port").textValue();      String  dbname  =  secretsJson.get("dbname").textValue();      String  username  =  secretsJson.get("username").textValue();      String  password  =  secretsJson.get("password").textValue(); }