1. Visão geral
Secrets como senhas e chaves de API são informações sensíveis que precisam ser guardadas em um armazenamento seguro e criptografado, com acesso controlado e auditáveis. Alguns sistemas optam por usar o Vault para armazenar essas chaves secretas. No Google Cloud, é possível usar o Secret Manager, um serviço gerenciado, para armazenar secrets com segurança e controlar o acesso a secrets individuais usando o IAM.
No Spring Boot, você pode usar o Spring Cloud GCP para acessar facilmente esses segredos, referindo-se a eles como qualquer outra propriedade do Spring.
Neste codelab, você vai armazenar um secret no Secret Manager, criar microsserviços simples do Spring Boot e recuperá-lo.
O que você vai aprender
- Como criar um aplicativo Java do Spring Boot e configurar o Secret Manager.
O que é necessário
- Um projeto do Google Cloud
- Um navegador, como o Chrome ou o Firefox
- Conhecer os editores de texto padrão do Linux, como vim, emacs ou nano
Como você vai usar este tutorial?
Como você classificaria sua experiência com a criação de apps da Web HTML/CSS?
Como você classificaria sua experiência de uso dos serviços do Google Cloud?
2. Configuração e requisitos
Configuração de ambiente autoguiada
- Faça login no Console do Cloud e crie um novo projeto ou reutilize um existente. Crie uma se você ainda não tiver uma conta do Gmail ou do G Suite.
Lembre-se do código do projeto, um nome exclusivo em todos os projetos do Google Cloud. O nome acima já foi escolhido e não servirá para você. Faremos referência a ele mais adiante neste codelab como PROJECT_ID
.
- Em seguida, será necessário ativar o faturamento no Console do Cloud para usar os recursos do Google Cloud.
A execução deste codelab não será muito cara, se for o caso. Siga todas as instruções na seção "Limpeza", que orienta você sobre como encerrar recursos para não incorrer em cobranças além deste tutorial. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.
Google Cloud Shell
Embora os serviços do Google Cloud possam ser operados remotamente do seu laptop, neste codelab vamos usar o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.
Ativar o Cloud Shell
- No Console do Cloud, clique em Ativar o Cloud Shell.
Se você nunca tiver iniciado o Cloud Shell, verá uma tela intermediária (abaixo da dobra) com a descrição do que ele é. Se esse for o caso, clique em Continuar e você não o verá novamente. Esta é uma tela única:
Leva apenas alguns instantes para provisionar e se conectar ao Cloud Shell.
Essa máquina virtual contém todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Praticamente todo o seu trabalho neste codelab pode ser feito em um navegador ou no seu Chromebook.
Depois de se conectar ao Cloud Shell, você já estará autenticado e o projeto já estará configurado com seu ID do projeto.
- Execute o seguinte comando no Cloud Shell para confirmar que você está autenticado:
gcloud auth list
Resposta ao 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
Resposta ao comando
[core] project = <PROJECT_ID>
Se o projeto não estiver configurado, configure-o usando este comando:
gcloud config set project <PROJECT_ID>
Resposta ao comando
Updated property [core/project].
3. Configurar um secret
Para usar o Secret Manager, primeiro ative a API:
$ gcloud services enable secretmanager.googleapis.com
Em seguida, crie um secret chamado greeting
, com o valor Hello
:
$ echo -n "Hello" | \ gcloud secrets create greeting \ --data-file=-
Esse comando usa STDIN
para fornecer o valor à linha de comando. No entanto, também é possível simplesmente colocar o valor do secret em um arquivo e especificar o nome do arquivo para o argumento --data-file
.
É possível listar todos os secrets usando a CLI gcloud:
$ gcloud secrets list
4. Criar um novo serviço REST do Spring Boot
Depois que o Cloud Shell for iniciado, você poderá usar a linha de comando para gerar um novo aplicativo Spring Boot com o 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
No pom.xml
, adicione a dependência inicial do 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>
No arquivo src/main/resources/application.properties
, adicione a seguinte configuração para ativar a API Spring Boot Config Data:
spring.config.import=sm://
Isso vai configurar uma origem da propriedade do Spring, para que você possa fazer referência aos secrets usando um valor de propriedade, com o prefixo sm://
, por exemplo, sm://greeting
.
Consulte a documentação do Secret Manager do GCP do Spring Cloud para mais detalhes sobre o formato da propriedade. O requisito application.properties
é novo no Spring Cloud GCP 4.x. Leia mais detalhes no guia de migração.
Crie um novo controlador REST adicionando um novo arquivo de classe:
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!";
}
}
É possível iniciar o aplicativo Spring Boot normalmente com o plug-in Spring Boot.
Verifique se JAVA_HOME está definido como a versão correta do JDK:
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Vamos pular os testes deste laboratório e iniciar o aplicativo:
$ ./mvnw -DskipTests spring-boot:run
Depois que o aplicativo for iniciado, clique no ícone de Visualização da Web na barra de ferramentas do Cloud Shell e selecione Visualizar na porta 8080.
Após uma breve espera, você verá o resultado:
5. Recuperar um secret
É possível usar a anotação @Value
para se referir à propriedade do secret usando o prefixo sm://
.
Na classe HelloSecretController, injete o valor greeting
usando a anotação:
src/main/java/com/example/demo/HelloSecretController.java
import org.springframework.beans.factory.annotation.Value;
...
@RestController
public class HelloSecretController {
@Value("${sm://greeting}")
String greeting;
...
}
É possível iniciar o aplicativo Spring Boot normalmente com o plug-in Spring Boot. Vamos pular os testes deste laboratório:
$ ./mvnw -DskipTests spring-boot:run
Assim que o aplicativo for iniciado, clique no ícone "Visualização da Web" na barra de ferramentas do Cloud Shell e selecione Visualizar na porta 8080.
Após uma breve espera, você verá o resultado:
Também é possível mapear o valor para uma propriedade em application.properties
:
src/main/resources/application.properties
greeting=${sm://greeting}
No HelloSecretController, é possível fazer referência a este nome de propriedade mais genérico em vez de um nome do Secret Manager:
src/main/java/com/example/demo/HelloSecretController.java
@RestController
public class HelloSecretController {
@Value("${greeting}")
String greeting;
...
}
É possível iniciar o aplicativo Spring Boot normalmente com o plug-in Spring Boot. Vamos pular os testes deste laboratório:
$ ./mvnw -DskipTests spring-boot:run
Depois que o aplicativo for iniciado, clique no ícone de Visualização da Web na barra de ferramentas do Cloud Shell e selecione Visualizar na porta 8080.
Como atualizar o valor do secret
Com a sintaxe curta sm://greeting
, você usa automaticamente a versão mais recente do secret. Ao criar uma nova versão do secret, você pode atualizar seu aplicativo sem alterar seu código.
Atualize o valor do secret adicionando uma nova versão:
$ echo -n "Greetings" | gcloud secrets versions add greeting \ --data-file=-
Reinicie o aplicativo e verifique se a nova versão do secret está sendo retornada.
Expansão desse conceito
Essa técnica é útil especialmente se você usar diferentes perfis de aplicativo do Spring Boot. Por exemplo, é possível criar secrets como greeting-dev
, greeting-staging
e greeting-prod
. Em cada perfil, faça o mapeamento para as saudações certas.
Crie um secret greeting-prod
:
$ echo -n "Hola" | \ gcloud secrets create greeting-prod \ --data-file=- --replication-policy=automatic
Crie um arquivo application-prod.properties
:
src/main/resources/application-prod.properties
greeting=${sm://greeting-prod}
É possível iniciar o aplicativo Spring Boot normalmente com o plug-in Spring Boot, mas com o perfil prod
. Vamos pular os testes deste laboratório:
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod
Assim que o aplicativo for iniciado, clique no ícone "Visualização da Web" na barra de ferramentas do Cloud Shell e selecione Visualizar na porta 8080.
Após uma breve espera, você verá o resultado:
6. Resumo
Neste laboratório, você criou um serviço que pode ser configurado com secrets armazenados no Secret Manager com os nomes de propriedades do Spring com o prefixo sm://
e injetando o valor do arquivo applications.properties
e das anotações @Value
.
7. Parabéns!
Você aprendeu a usar a API Secret Manager no Java.
Saiba mais
- Projeto do Spring no GCP: http://cloud.spring.io/spring-cloud-gcp/
- Repositório do GitHub do Spring no GCP: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java no Google Cloud: https://cloud.google.com/java/
- Como controlar o acesso a secrets no Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- Registro de auditoria no Secret Manager: https://cloud.google.com/secret-manager/docs/audit-logging
Licença
Este conteúdo está sob a licença Atribuição 2.0 Genérica da Creative Commons.