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

Gerencie 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

AWSserviços: 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 que você substitua as credenciais codificadas em seu código (incluindo senhas) por uma API chamada para recuperar o segredo programaticamente. 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 AWS conta 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

Diagram showing AWS Secrets Manager interaction with admin, custom app, and personnel database.

Ferramentas

  • AWSSecrets Manager — Secrets Manager é um AWS serviço que facilita o gerenciamento de segredos. Os segredos podem ser credenciais de banco de dados, senhas, API chaves 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 comando do Secrets Manager (CLI) ou o Secrets Manager e. API SDKs

Épicos

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

Armazene o Amazon Relational Database Service (RDSAmazon) 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) e ABAC para o Secrets Manager e Usando IAM 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 JAR dependências 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. 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 JAR dependências 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(); }