Получение учетных данных/секретов из Secret Manager с помощью Spring Boot

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. Настройка и требования

Самостоятельная настройка среды

  1. Войдите в Cloud Console и создайте новый проект или повторно используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

Запомните идентификатор проекта — уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не подойдет вам, извините!). Позже в этой лаборатории он будет называться PROJECT_ID .

  1. Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.

Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Обязательно следуйте всем инструкциям в разделе «Очистка», в которых рассказывается, как отключить ресурсы, чтобы вам не приходилось нести расходы, выходящие за рамки этого руководства. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Google Cloud Shell

Хотя сервисами Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории мы будем использовать Google Cloud Shell , среду командной строки, работающую в облаке.

Активировать Cloud Shell

  1. В Cloud Console нажмите «Активировать Cloud Shell». H7JlbhKGHITmsxhQIcLwoe5HXZMhDlYue4K-SPszMxUxDjIeWfOHBfxDHYpmLQTzUmQ7Xx8o6OJUlannQF0iBuUyfp1RzVad_4nCa0Zz5LtwBlUZFXFCWFrmrWZLqg1MkZz2LdgUDQ .

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWapJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecH rbzQ

Если вы никогда раньше не запускали Cloud Shell, вам будет представлен промежуточный экран (ниже сгиба) с описанием того, что это такое. В этом случае нажмите «Продолжить» (и вы больше никогда этого не увидите). Вот как выглядит этот одноразовый экран:

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

Подготовка и подключение к Cloud Shell займет всего несколько минут.

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbha

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью просто браузера или Chromebook.

После подключения к Cloud Shell вы увидите, что вы уже прошли аутентификацию и что для проекта уже установлен идентификатор вашего проекта.

  1. Выполните следующую команду в 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

После запуска приложения щелкните значок предварительного просмотра в Интернете. e18df08334f0d809.png на панели инструментов Cloud Shell и выберите предварительный просмотр на порту 8080 .

После небольшого ожидания вы должны увидеть результат:

1e9a7884ff113c14.png

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

После запуска приложения щелкните значок предварительного просмотра в Интернете. e18df08334f0d809.png на панели инструментов Cloud Shell и выберите предварительный просмотр на порту 8080 .

После небольшого ожидания вы должны увидеть результат:

Снимок экрана работающего приложения с надписью «Hello World!»

Вы также можете сопоставить значение со свойством в 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=-

Перезапустите приложение и увидите, что возвращается новая версия секрета.

Снимок экрана работающего приложения, на котором показано «Greeings World!»

Расширяя эту концепцию

Этот метод полезен, особенно если вы используете разные профили приложений 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 .

После небольшого ожидания вы должны увидеть результат:

Снимок экрана работающего приложения, на котором показано «Hola World!»

6. Резюме

В ходе этой лабораторной работы вы создали службу, которую можно настроить с использованием секретов, хранящихся в диспетчере секретов, используя имена свойств Spring с префиксом sm:// и вводя значение из файла applications.properties и аннотаций @Value .

7. Поздравляем!

Вы узнали, как использовать API Secret Manager на Java.

Узнать больше

Лицензия

Эта работа распространяется под лицензией Creative Commons Attribution 2.0 Generic License.