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?
¿Cómo calificarías tu experiencia con la creación de aplicaciones web HTML/CSS?
¿Cómo calificarías tu experiencia en el uso de los servicios de Google Cloud?
2. Configuración y requisitos
Configuración del entorno de autoaprendizaje
- 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).
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
.
- 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
- En la consola de Cloud, haz clic en Activar Cloud Shell.
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:
El aprovisionamiento y la conexión a Cloud Shell solo tomará unos minutos.
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.
- 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 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:
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 , 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:
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 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.
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 , 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:
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
- Proyecto Spring en GCP: http://cloud.spring.io/spring-cloud-gcp/
- Spring en el repositorio de GitHub de GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java en Google Cloud: https://cloud.google.com/java/
- Controla el acceso a los secretos en Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- Registro de auditoría en Secret Manager: https://cloud.google.com/secret-manager/docs/audit-logging
Licencia
Este trabajo cuenta con una licencia Atribución 2.0 Genérica de Creative Commons.