Administrar credenciales mediante 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.

Administrar credenciales mediante AWS Secrets Manager

Documento creado por Durga Prasad Cheepuri (AWS)

Creado por: AWS

Entorno: PoC o piloto

Tecnologías: bases de datos, seguridad, identidad, cumplimiento

Servicios de AWS: AWS Secrets Manager

Resumen

Este patrón le guía en el uso de AWS Secrets Manager para obtener de forma dinámica las credenciales de bases de datos de 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 el código (incluidas contraseñas), con una llamada a la API 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 cuenta de AWS 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: AWS Secrets Manager es un servicio de AWS que facilita la administración de los secretos. Los secretos pueden ser credenciales de base de datos, contraseñas, claves de API de terceros e incluso texto arbitrario. Puede almacenar y controlar el acceso a estos secretos de forma centralizada a través de la consola de Secrets Manager, la interfaz de la línea de comandos (CLI) de Secrets Manager y la API y los SDK de Secrets Manager.

Epics

TareaDescripciónHabilidades requeridas
Almacene las credenciales como un secreto en Secrets Manager.

Almacene las credenciales de Amazon Relational Database Service (Amazon RDS) u otras credenciales de base de datos como un secreto en Secrets Manager; para ello, siga los pasos que se indican en Creating a secret (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 Using identity-based policies (IAM Policies) and ABAC for Secrets Manager (Usar políticas basadas en identidad [políticas de IAM] y ABAC para Secrets Manager) y Using resource-based policies for Secrets Manager (Usar 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
Agregue dependencias JAR 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 del secreto, los puntos de conexión y la región de 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

Adding JAR dependencies for using Secrets Manager (Agregar dependencias JAR 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(); }