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
Tarefa | Descrição | Habilidades 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 |
Tarefa | Descrição | Habilidades 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(); }