Recupera credenciales/secretos de Secret Manager con Spring Boot

1. Descripción general

Los secretos como contraseñas y claves de API son información sensible que deben almacenarse en un almacenamiento seguro y encriptado, de acceso controlado y auditable. Algunos sistemas optan por usar Vault para almacenar estos secretos. En Google Cloud, puedes usar Secret Manager, un servicio administrado, para almacenar de forma segura los Secrets y controlar el acceso a Secrets individuales con IAM.

En Spring Boot, puedes usar Spring Cloud GCP para acceder fácilmente a estos secretos si haces referencia a ellos como cualquier otra propiedad de Spring.

En este codelab, almacenarás un secreto en Secret Manager y, luego, compilarás microservicios simples de Spring Boot y lo recuperarás.

Qué aprenderás

  • Cómo crear una aplicación de Java de Spring Boot y configurar Secret Manager

Requisitos

  • Un proyecto de Google Cloud
  • Un navegador como Chrome o Firefox
  • Se recomienda estar familiarizado con editores de texto estándares de Linux, como Vim, Emacs o Nano.

¿Cómo usarás este instructivo?

Ler Leer y completar los ejercicios

¿Cómo calificarías tu experiencia con la creación de aplicaciones web HTML/CSS?

Principiante Intermedio Avanzado

¿Cómo calificarías tu experiencia en el uso de los servicios de Google Cloud?

Principiante Intermedio Avanzado .
.

2. Configuración y requisitos

Configuración del entorno de autoaprendizaje

  1. Accede a la consola de Cloud y crea un proyecto nuevo o reutiliza uno existente. (Si todavía no tienes una cuenta de Gmail o de G Suite, debes crear una).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Recuerde el ID de proyecto, un nombre único en todos los proyectos de Google Cloud (el nombre anterior ya se encuentra en uso y no lo podrá usar). Se mencionará más adelante en este codelab como PROJECT_ID.

  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar los recursos de Google Cloud recursos.

Ejecutar este codelab no debería costar mucho, tal vez nada. Asegúrate de seguir las instrucciones de la sección “Realiza una limpieza” en la que se aconseja cómo cerrar recursos para no incurrir en facturación más allá de este instructivo. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de $300.

Google Cloud Shell

Si bien los servicios de Google Cloud se pueden operar de forma remota desde tu laptop, en este codelab usaremos Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.

Activar Cloud Shell

  1. En la consola de Cloud, haz clic en Activar Cloud ShellH7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlANnQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ.

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

Si nunca ha iniciado Cloud Shell, aparecerá una pantalla intermedia (debajo de la mitad inferior de la página) que describe qué es. Si ese es el caso, haz clic en Continuar (y no volverás a verlo). Así es como se ve la pantalla única:

kEPbNAo_w5C_pi9QvhFwWwky1cX8hr_xEMGWySNIoMCdi-Djx9AQRqWn-__DmEpC7vKgUtl-feTcv-wBxJ8NwzzAp7mY65-fi2LJo4twUoewT1SUjd6Y3h81RG3rKIkqhoVlFR-G7w

El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Gran parte de tu trabajo en este codelab, si no todo, se puede hacer simplemente con un navegador o tu Chromebook.

Una vez conectado a Cloud Shell, debería ver que ya se autenticó y que el proyecto ya se configuró con tu ID del proyecto.

  1. En Cloud Shell, ejecuta el siguiente comando para confirmar que está autenticado:
gcloud auth list

Resultado del comando

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Resultado del comando

[core]
project = <PROJECT_ID>

De lo contrario, puedes configurarlo con el siguiente comando:

gcloud config set project <PROJECT_ID>

Resultado del comando

Updated property [core/project].

3. Configura un Secret

Para usar Secret Manager, primero habilita la API:

$ gcloud services enable secretmanager.googleapis.com

Luego, crea un secreto llamado greeting, con un valor de Hello:

$ echo -n "Hello" | \
 gcloud secrets create greeting \
 --data-file=-

Este comando usa STDIN para proporcionar el valor a la línea de comandos. Sin embargo, también puedes colocar el valor del secreto en un archivo y especificar el nombre de archivo para el argumento --data-file.

Puedes enumerar todos los secretos con gcloud CLI:

$ gcloud secrets list

4. Crea un servicio de REST de Spring Boot nuevo

Después de que se inicie Cloud Shell, puedes usar la línea de comandos para generar una nueva aplicación de Spring Boot con Spring Initializr:

$ curl https://start.spring.io/starter.tgz -d packaging=jar \
  -d dependencies=web,cloud-gcp \
  -d bootVersion=3.0.6 \
  -d type=maven-project \
  -d baseDir=hello-secret-manager | tar -xzvf - \
  && cd hello-secret-manager

En pom.xml, agrega la dependencia del activador de Spring Cloud GCP:

pom.xml

<project>
  ...

  <dependencies>
    ...
    <!-- Add Secret Manager Starter -->
    <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>spring-cloud-gcp-starter-secretmanager</artifactId>
    </dependency>
  </dependencies>

  ...
</project>

En el archivo src/main/resources/application.properties, agrega la siguiente configuración para habilitar la API de datos de Spring Boot Config:

spring.config.import=sm://

Esto configurará una fuente de propiedad Spring para que puedas hacer referencia a los secretos mediante un valor de propiedad, con el prefijo sm://, por ejemplo, sm://greeting.

Consulta la documentación de Secret Manager de Spring Cloud GCP para obtener más detalles sobre el formato de la propiedad. Ten en cuenta que el requisito de application.properties es nuevo en Spring Cloud GCP 4.x. Obtén más detalles en la guía de migración.

Para crear un nuevo controlador de REST, agrega un nuevo archivo de clase:

src/main/java/com/example/demo/HelloSecretController.java

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloSecretController {
  String greeting = "Hi";

  @GetMapping("/")
  public String hello() {
    return greeting + " World!";
  }
}

Puedes iniciar la aplicación de Spring Boot normalmente con el complemento de Spring Boot.

Asegúrate de que JAVA_HOME esté configurado con la versión correcta del JDK:

$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/

Omitamos las pruebas de este lab y, luego, iniciemos la aplicación:

$ ./mvnw -DskipTests spring-boot:run

Una vez que se haya iniciado la aplicación, haz clic en el ícono de Vista previa en la Web e18df08334f0d809.png en la barra de herramientas de Cloud Shell y selecciona Vista previa en el puerto 8080.

Después de una breve espera, deberías ver el resultado:

1e9a7884ff113c14.png

5. Recupera un Secret

Puedes usar la anotación @Value para hacer referencia a la propiedad del secreto con el prefijo sm://.

En la clase HelloSecretController, inserta el valor greeting con la anotación:

src/main/java/com/example/demo/HelloSecretController.java

import org.springframework.beans.factory.annotation.Value;

...

@RestController
public class HelloSecretController {
  @Value("${sm://greeting}")
  String greeting;

  ...
}

Puedes iniciar la aplicación de Spring Boot normalmente con el complemento de Spring Boot. Omitamos las pruebas de este lab:

$ ./mvnw -DskipTests spring-boot:run

Una vez que se haya iniciado la aplicación, haga clic en el ícono de Vista previa en la Web e18df08334f0d809.png, en la barra de herramientas de Cloud Shell, y seleccione Vista previa en el puerto 8080.

Después de una breve espera, deberías ver el resultado:

Captura de pantalla de la aplicación en ejecución que muestra “Hello World!”

También puedes asignar el valor a una propiedad en application.properties:

src/main/resources/application.properties

greeting=${sm://greeting}

En HelloSecretController, puedes hacer referencia a este nombre de propiedad más genérico en lugar de a un nombre de Secret Manager:

src/main/java/com/example/demo/HelloSecretController.java

@RestController
public class HelloSecretController {
  @Value("${greeting}")
  String greeting;
  ...
}

Puedes iniciar la aplicación de Spring Boot normalmente con el complemento de Spring Boot. Omitamos las pruebas de este lab:

$ ./mvnw -DskipTests spring-boot:run

Una vez que se haya iniciado la aplicación, haz clic en el ícono de Vista previa en la Web Ícono de vista previa en la Web en la barra de herramientas de Cloud Shell y selecciona Vista previa en el puerto 8080.

Actualiza el valor del secreto

Con la sintaxis corta de sm://greeting, se usa automáticamente la versión más reciente del secreto. Cuando creas una nueva versión del secreto, puedes actualizar tu aplicación sin cambiar el código.

Actualiza el valor del secreto agregando una versión nueva:

$ echo -n "Greetings" |
 gcloud secrets versions add greeting \
 --data-file=-

Reinicia la aplicación y observa que se muestra la nueva versión del secreto.

Captura de pantalla de la aplicación en ejecución que muestra “Greeings World!”

Expande este concepto

Esta técnica es útil en especial si usas diferentes perfiles de aplicación de Spring Boot. Por ejemplo, puedes crear secretos como greeting-dev, greeting-staging, greeting-prod. Y en cada uno de los perfiles, asigna los saludos correctos.

Crea un secreto greeting-prod:

$ echo -n "Hola" | \
 gcloud secrets create greeting-prod \
 --data-file=- --replication-policy=automatic

Crea un archivo application-prod.properties:

src/main/resources/application-prod.properties

greeting=${sm://greeting-prod}

Puedes iniciar la aplicación de Spring Boot normalmente con el complemento de Spring Boot, pero con el perfil prod. Omitamos las pruebas de este lab:

$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod

Una vez que se haya iniciado la aplicación, haga clic en el ícono de Vista previa en la Web Ícono de vista previa web, en la barra de herramientas de Cloud Shell, y seleccione Vista previa en el puerto 8080.

Después de una breve espera, deberías ver el resultado:

Captura de pantalla de la app en ejecución que muestra &quot;Hello World!&quot;

6. Resumen

En este lab, creaste un servicio que se puede configurar con Secrets almacenados en Secret Manager. Para hacerlo, usaste los nombres de las propiedades de Spring con el prefijo sm:// y, también, insertaste el valor del archivo applications.properties y las anotaciones @Value.

7. ¡Felicitaciones!

Aprendiste a usar la API de Secret Manager en Java.

Más información

Licencia

Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.