1. Обзор
Секреты, такие как пароли и ключи API, являются конфиденциальной информацией и должны храниться в безопасном, зашифрованном хранилище с контролем доступа и возможностью проверки. Некоторые системы предпочитают использовать Vault для хранения этих секретов. В Google Cloud вы можете использовать управляемую службу Secret Manager для безопасного хранения секретов и управления доступом к отдельным секретам с помощью IAM.
В Spring Boot вы можете использовать Spring Cloud GCP, чтобы легко получить доступ к этим секретам, ссылаясь на них как на любые другие свойства Spring.
В этой лаборатории кода вы сохраните секрет в Secret Manager, затем создадите простые микросервисы Spring Boot и получите секрет.
Что вы узнаете
- Как создать Java-приложение Spring Boot и настроить Secret Manager.
Что вам понадобится
- Облачный проект Google
- Браузер, например Chrome или Firefox.
- Знакомство со стандартными текстовыми редакторами Linux, такими как Vim, EMAC или Nano.
Как вы будете использовать это руководство?
Как бы вы оценили свой опыт создания веб-приложений HTML/CSS?
Как бы вы оценили свой опыт использования сервисов Google Cloud?
2. Настройка и требования
Самостоятельная настройка среды
- Войдите в Cloud Console и создайте новый проект или повторно используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)
Запомните идентификатор проекта — уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не подойдет вам, извините!). Позже в этой лаборатории он будет называться PROJECT_ID
.
- Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.
Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Обязательно следуйте всем инструкциям в разделе «Очистка», в которых рассказывается, как отключить ресурсы, чтобы вам не приходилось нести расходы, выходящие за рамки этого руководства. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .
Google Cloud Shell
Хотя сервисами Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории мы будем использовать Google Cloud Shell , среду командной строки, работающую в облаке.
Активировать Cloud Shell
- В Cloud Console нажмите «Активировать Cloud Shell». .
Если вы никогда раньше не запускали Cloud Shell, вам будет представлен промежуточный экран (ниже сгиба) с описанием того, что это такое. В этом случае нажмите «Продолжить» (и вы больше никогда этого не увидите). Вот как выглядит этот одноразовый экран:
Подготовка и подключение к Cloud Shell займет всего несколько минут.
Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью просто браузера или 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:
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
добавьте следующую конфигурацию, чтобы включить API данных конфигурации Spring Boot. :
spring.config.import=sm://
Это позволит настроить источник свойств Spring, чтобы вы могли ссылаться на секреты, используя значение свойства с префиксом 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. Получить секрет
Вы можете использовать аннотацию @Value
для ссылки на секретное свойство с помощью префикса sm://
.
В классе 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 вы можете ссылаться на это более общее имя свойства, а не на имя диспетчера секретов:
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. Резюме
В ходе этой лабораторной работы вы создали службу, которую можно настроить с использованием секретов, хранящихся в диспетчере секретов, используя имена свойств 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.
- Ведение журнала аудита в диспетчере секретов: https://cloud.google.com/secret-manager/docs/audit-logging .
Лицензия
Эта работа распространяется под лицензией Creative Commons Attribution 2.0 Generic License.