Получение учетных данных/секретов из 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 Cloud
  • Браузер, например Chrome или Firefox.
  • Знание стандартных текстовых редакторов Linux, таких как Vim, EMACs или 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

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

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

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

Google Cloud Shell

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

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

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

zlNW0HehB_AFW1qZ4AyebSQUdWm95n7TbnOr7UVm3j9dFcg6oWApJRlC0jnU1Mvb-IQp-trP1Px8xKNwt6o3pP6fyih947sEhOFI4IRF0W7WZk6hFqZDUGXQQXrw21GuMm2ecHrbzQ

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

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

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

pTv5mEKzWMWp5VBrg2eGcuRPv9dLInPToS-mohlrqDASyYGWnZ_SwE-MzOWHe76ZdCSmw0kgWogSJv27lrQE8pvA5OD6P1I47nz8vrAdK7yR1NseZKJvcxAZrPb8wRxoqyTpD-gbhA

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, работа в этом практическом задании может быть выполнена с помощью обычного браузера или вашего 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 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

После запуска приложения нажмите на значок «Предварительный просмотр веб-страницы». e18df08334f0d809.png В панели инструментов Cloud Shell выберите «Предварительный просмотр на порту 8080» .

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

1e9a7884ff113c14.png

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

После запуска приложения нажмите на значок «Предварительный просмотр веб-страницы». e18df08334f0d809.png В панели инструментов Cloud Shell выберите «Предварительный просмотр на порту 8080» .

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

Скриншот запущенного приложения, демонстрирующий сообщение «Hello World!».

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

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

Скриншот запущенного приложения, на котором отображается надпись «Hola World!».

6. Резюме

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

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

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

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

Лицензия

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