Administra las credenciales con AWS Secrets Manager - Recomendaciones de AWS

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

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

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

TareaDescripciónHabilidades 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
TareaDescripciónHabilidades 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

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(); }