Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Administra las credenciales con AWS Secrets Manager
Creado por Durga Prasad Cheepuri () AWS
Creado por: AWS | Entorno: PoC o piloto | Tecnologías: bases de datos, seguridad, identidad, conformidad |
AWSservicios: AWS Secrets Manager |
Resumen
Este patrón le guía a través del uso de AWS Secrets Manager para obtener dinámicamente las credenciales de la base de datos para una aplicación Java Spring.
En el pasado, cuando creaba una aplicación personalizada que recuperaba información desde una base de datos, normalmente tenía que incrustar las credenciales (el secreto) para obtener acceso a la base de datos directamente en la aplicación. Cuando llegaba el momento de cambiar las credenciales, había que invertir tiempo en actualizar la aplicación para utilizar las nuevas credenciales y, a continuación, distribuir la aplicación actualizada. Si tenía varias aplicaciones que compartían credenciales y se olvidaba de actualizar una de ellas, la aplicación dejaba de funcionar. Debido a este riesgo, muchos usuarios decidían no rotar sus credenciales periódicamente, lo que finalmente sustituye un riesgo por otro.
Secrets Manager le permite reemplazar las credenciales codificadas en su código (incluidas las contraseñas) por una API llamada para recuperar el secreto mediante programación. Esto ayuda a garantizar la integridad del secreto si alguien examina el código, dado que el secreto sencillamente no está allí. Además, puede configurar Secrets Manager para rotar el secreto automáticamente de acuerdo con una programación especificada. Esto le permite reemplazar secretos a largo plazo con secretos a corto plazo, lo que contribuye a reducir significativamente el riesgo. Para obtener más información, consulte la documentación de AWS Secrets Manager.
Requisitos previos y limitaciones
Requisitos previos
Una AWS cuenta con acceso a Secrets Manager
Una aplicación de Java Spring
Arquitectura
Pila de tecnología de origen
Una aplicación Java Spring con código que acceda a una base de datos, con credenciales de base de datos administradas desde el archivo application.properties.
Pila de tecnología de destino
Una aplicación Java Spring con código que acceda a una base de datos, con credenciales de base de datos administradas en Secrets Manager. El archivo application.properties contiene los secretos de Secrets Manager.
Integración de Secrets Manager en una aplicación
Herramientas
Secrets Manager: AWSSecrets Manager es un AWS servicio que le facilita la administración de los secretos. Los secretos pueden ser credenciales de bases de datos, contraseñas, API claves de terceros e incluso texto arbitrario. Puede almacenar y controlar el acceso a estos secretos de forma centralizada mediante la consola Secrets Manager, la interfaz de línea de comandos de Secrets Manager (CLI) o Secrets Manager API y. SDKs
Epics
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Almacene las credenciales como un secreto en Secrets Manager. | Guarde las credenciales de Amazon Relational Database Service (RDSAmazon) u otras credenciales de base de datos como un secreto en Secrets Manager siguiendo los pasos que se indican en la documentación sobre cómo crear un secreto en la documentación de Secrets Manager. | Sys Admin |
Establezca permisos para que la aplicación Spring acceda a Secrets Manager. | Establezca los permisos adecuados en función de cómo la aplicación Java Spring utilice Secrets Manager. Para controlar el acceso al secreto, cree una política basada en la información proporcionada en la documentación de Secrets Manager, en las secciones Uso de políticas basadas en la identidad (IAMPolíticas) y ABAC para Secrets Manager y Uso de políticas basadas en recursos para Secrets Manager. Siga los pasos de la sección Retrieving the secret value (Recuperar el valor del secreto) de la documentación de Secrets Manager. | Sys Admin |
Tarea | Descripción | Habilidades requeridas |
---|---|---|
Añada JAR dependencias para usar Secrets Manager. | Para obtener más detalles, consulte la sección Información adicional. | Desarrollador de Java |
Agregue los detalles del secreto a la aplicación Spring. | Actualice el archivo application.properties con el nombre secreto, los puntos finales y la región. AWS Para obtener ejemplos, consulte la sección Información adicional. | Desarrollador de Java |
Actualice el código de recuperación de credenciales de base de datos en Java. | En la aplicación, actualice el código Java que obtiene las credenciales de base de datos para obtener esos detalles de Secrets Manager. Para ver un código de ejemplo, consulte la sección Información adicional. | Desarrollador de Java |
Recursos relacionados
Uso de políticas basadas en identidad (IAMPolíticas) y ABAC para Secrets Manager
Using resource-based policies for Secrets Manager (Usar políticas basadas en recursos para Secrets Manager)
Información adicional
Añadir JAR dependencias para usar 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'
Updating the application.properties file with the details of the secret (Actualizar el archivo application.properties con los detalles del secreto)
spring.aws.secretsmanager.secretName=postgres-local spring.aws.secretsmanager.endpoint=secretsmanager.us-east-1.amazonaws.com spring.aws.secretsmanager.region=us-east-1
Updating the DB credentials retrieval code in Java (Actualizar el código de recuperación de credenciales de base de datos en 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(); }