1. Обзор
Секретные данные, такие как пароли и ключи API, являются конфиденциальной информацией и должны храниться в безопасном, зашифрованном хранилище с контролем доступа и возможностью аудита. Некоторые системы используют Vault для хранения таких секретов. В Google Cloud вы можете использовать Secret Manager, управляемый сервис, для безопасного хранения секретов и управления доступом к отдельным секретам с помощью IAM.
В Spring Boot вы можете использовать Spring Cloud GCP для удобного доступа к этим секретам, ссылаясь на них как на любые другие свойства Spring.
В этом практическом занятии вы сохраните секрет в Secret Manager, затем создадите простые микросервисы Spring Boot и получите доступ к секрету.
Что вы узнаете
- Как создать Java-приложение Spring Boot и настроить Secret Manager.
Что вам понадобится
- Проект Google Cloud
- Браузер, например Chrome или Firefox.
- Знание стандартных текстовых редакторов Linux, таких как Vim, EMACs или Nano.
Как вы будете использовать этот учебник?
Как бы вы оценили свой опыт разработки веб-приложений на HTML/CSS?
Как бы вы оценили свой опыт использования сервисов Google Cloud?
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в Cloud Console и создайте новый проект или используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)
Запомните идентификатор проекта (Project ID) — уникальное имя для всех проектов Google Cloud (указанное выше имя уже занято и вам не подойдёт, извините!). В дальнейшем в этом практическом занятии оно будет обозначаться как PROJECT_ID .
- Далее вам потребуется включить оплату в Cloud Console, чтобы использовать ресурсы Google Cloud.
Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Обязательно следуйте инструкциям в разделе «Очистка», где указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого урока. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Google Cloud Shell
Хотя сервисами Google Cloud можно управлять удаленно с ноутбука, в этом практическом занятии мы будем использовать Google Cloud Shell — среду командной строки, работающую в облаке.
Активировать Cloud Shell
- В консоли Cloud нажмите «Активировать Cloud Shell» .
.
Если вы никогда раньше не запускали Cloud Shell, вам будет показан промежуточный экран (внизу), описывающий его назначение. В этом случае нажмите «Продолжить» (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:
Подготовка и подключение к Cloud Shell займут всего несколько минут.
Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, работа в этом практическом задании может быть выполнена с помощью обычного браузера или вашего Chromebook.
После подключения к Cloud Shell вы увидите, что ваша аутентификация пройдена и что проект уже настроен на ваш идентификатор проекта.
- Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list
вывод команды
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
вывод команды
[core] project = <PROJECT_ID>
Если это не так, вы можете установить это с помощью следующей команды:
gcloud config set project <PROJECT_ID>
вывод команды
Updated property [core/project].
3. Настройте секретный ключ.
Для использования Secret Manager сначала включите API:
$ gcloud services enable secretmanager.googleapis.com
Затем создайте секрет с именем greeting и значением Hello :
$ echo -n "Hello" | \ gcloud secrets create greeting \ --data-file=-
Эта команда использует STDIN для передачи значения в командную строку. Однако вы также можете просто сохранить секретное значение в файл, указав имя файла в аргументе --data-file .
Вы можете вывести список всех секретов, используя интерфейс командной строки gcloud:
$ gcloud secrets list
4. Создайте новый REST-сервис Spring Boot.
После запуска Cloud Shell вы можете использовать командную строку для создания нового приложения Spring Boot с помощью 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
В файл pom.xml добавьте зависимость Spring Cloud GCP starter:
pom.xml
<project>
...
<dependencies>
...
<!-- Add Secret Manager Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-secretmanager</artifactId>
</dependency>
</dependencies>
...
</project>
В файл src/main/resources/application.properties добавьте следующую конфигурацию для включения Spring Boot Config Data API :
spring.config.import=sm://
Это позволит настроить Spring Property Source, чтобы вы могли ссылаться на секреты, используя значение свойства с префиксом sm:// , например, sm://greeting .
Более подробную информацию о формате свойства см. в документации Spring Cloud GCP Secret Manager. Обратите внимание, что требование к файлу application.properties появилось в Spring Cloud GCP 4.x. Подробнее см. в руководстве по миграции .
Создайте новый REST-контроллер, добавив новый файл класса:
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!";
}
}
Вы можете запустить приложение Spring Boot обычным способом с помощью плагина Spring Boot.
Убедитесь, что переменная JAVA_HOME установлена на правильную версию JDK:
$ export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64/
Давайте пропустим тесты для этой лабораторной работы и начнём работу с приложением:
$ ./mvnw -DskipTests spring-boot:run
После запуска приложения нажмите на значок «Предварительный просмотр веб-страницы».
В панели инструментов Cloud Shell выберите «Предварительный просмотр на порту 8080» .
После непродолжительного ожидания вы должны увидеть результат:

5. Раскрыть секрет
Для ссылки на секретное свойство с префиксом sm:// можно использовать аннотацию @Value
В классе HelloSecretController внедрите значение greeting , используя аннотацию:
src/main/java/com/example/demo/HelloSecretController.java
import org.springframework.beans.factory.annotation.Value;
...
@RestController
public class HelloSecretController {
@Value("${sm://greeting}")
String greeting;
...
}
Приложение Spring Boot можно запустить обычным способом с помощью плагина Spring Boot. Давайте пропустим тесты в этой лабораторной работе:
$ ./mvnw -DskipTests spring-boot:run
После запуска приложения нажмите на значок «Предварительный просмотр веб-страницы».
В панели инструментов Cloud Shell выберите «Предварительный просмотр на порту 8080» .
После непродолжительного ожидания вы должны увидеть результат:

Вы также можете сопоставить значение со свойством в файле application.properties :
src/main/resources/application.properties
greeting=${sm://greeting}
В HelloSecretController вы можете ссылаться на это более общее имя свойства, а не на имя Secret Manager:
src/main/java/com/example/demo/HelloSecretController.java
@RestController
public class HelloSecretController {
@Value("${greeting}")
String greeting;
...
}
Приложение Spring Boot можно запустить обычным способом с помощью плагина Spring Boot. Давайте пропустим тесты в этой лабораторной работе:
$ ./mvnw -DskipTests spring-boot:run
После запуска приложения нажмите на значок «Предварительный просмотр веб-страницы».
В панели инструментов Cloud Shell выберите «Предварительный просмотр на порту 8080» .
Обновление секретного значения
Используя короткий синтаксис sm://greeting , вы автоматически используете последнюю версию секрета. Создав новую версию секрета, вы можете обновить свое приложение, не изменяя код.
Обновите значение секрета, добавив новую версию:
$ echo -n "Greetings" | gcloud secrets versions add greeting \ --data-file=-
Перезапустите приложение и убедитесь, что возвращается новая версия секретного ключа.

Расширение этой концепции
Этот метод особенно полезен, если вы используете разные профили приложений Spring Boot. Например, вы можете создать секреты, такие как greeting-dev , greeting-staging , greeting-prod . И в каждом из профилей сопоставить их с соответствующими приветствиями.
Создайте секретный ключ greeting-prod :
$ echo -n "Hola" | \ gcloud secrets create greeting-prod \ --data-file=- --replication-policy=automatic
Создайте файл application-prod.properties :
src/main/resources/application-prod.properties
greeting=${sm://greeting-prod}
Приложение Spring Boot можно запустить обычным способом с помощью плагина Spring Boot, но с профилем prod . Давайте пропустим тесты для этой лабораторной работы:
$ ./mvnw -DskipTests spring-boot:run -Dspring-boot.run.profiles=prod
После запуска приложения нажмите на значок «Предварительный просмотр веб-страницы».
В панели инструментов Cloud Shell выберите «Предварительный просмотр на порту 8080» .
После непродолжительного ожидания вы должны увидеть результат:

6. Резюме
В этой лабораторной работе вы создали сервис, который можно настраивать с помощью секретов, хранящихся в Secret Manager, используя имена свойств Spring с префиксом sm:// и внедряя значения из файла applications.properties с помощью аннотаций @Value .
7. Поздравляем!
Вы научились использовать API Secret Manager в Java.
Узнать больше
- Проект Spring на GCP: http://cloud.spring.io/spring-cloud-gcp/
- Репозиторий Spring на GCP на GitHub: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- Java в Google Cloud: https://cloud.google.com/java/
- Управление доступом к секретам в Secret Manager: https://cloud.google.com/secret-manager/docs/access-control
- Ведение журнала аудита в Secret Manager: https://cloud.google.com/secret-manager/docs/audit-logging
Лицензия
Данная работа распространяется под лицензией Creative Commons Attribution 2.0 Generic.