JavaRush /Курсы /Модуль 5. Spring /Лекция 227: Практика: интеграция HashiCorp Vault с микрос...

Лекция 227: Практика: интеграция HashiCorp Vault с микросервисами

Модуль 5. Spring
23 уровень , 6 лекция
Открыта

Привет! На прошлой лекции мы узнали, зачем нужен Vault и что он умеет. Сегодня займемся делом — установим, настроим и заставим его работать с нашими Spring Boot приложениями.


Установка Vault

Самый простой способ — использовать Docker. Одна команда, и у нас будет рабочий Vault:


docker run --cap-add=IPC_LOCK \
-e 'VAULT_DEV_ROOT_TOKEN_ID=myroot' \
-p 8200:8200 \
vault

Запомните токен myroot — он нам пригодится!


Первые шаги с Vault CLI

Давайте познакомимся с командной строкой Vault. Сначала укажем адрес сервера:

export VAULT_ADDR='http://127.0.0.1:8200'

Теперь залогинимся с нашим токеном:


vault login myroot

Добавляем первые секреты

Vault хранит секреты в специальных "отделениях". Давайте создадим такое для нашего приложения:


vault secrets enable -path=secret kv-v2

Теперь добавим первый секрет:


vault kv put secret/myapp/database \
username=dbuser \
password=dbpass

Проверим, что все сохранилось:

vault kv get secret/myapp/database

Подключаем Spring Boot

Теперь самое интересное — подключим наше приложение к Vault.

1. Добавляем зависимости

В pom.xml:


<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>

2. Настраиваем приложение

В application.yml:


spring:
cloud:
vault:
host: localhost
port: 8200
scheme: http
authentication: TOKEN
token: myroot
kv:
enabled: true
backend: secret
default-context: myapp

3. Используем секреты

В коде это выглядит просто:


@Value("${database.username}")
private String username;

@Value("${database.password}")
private String password;

Проверяем работу

Создадим простой REST-контроллер:


@RestController
public class TestController {

       @Value("${database.username}")
       private String username;

       @GetMapping("/test")
       public String test() {
           return "Connected as: " + username;
       }
}

Запускаем приложение и проверяем:

curl http://localhost:8080/test

Полезные возможности

1. Обновление секретов "на лету"

Измените секрет в Vault:


vault kv put secret/myapp/database \
username=newuser \
password=newpass

И обновите конфигурацию приложения:

curl -X POST http://localhost:8080/actuator/refresh

2. Разные секреты для разных окружений

В Vault:


vault kv put secret/myapp/database/dev \
username=devuser \
password=devpass

vault kv put secret/myapp/database/prod \
username=produser \
password=prodpass

В приложении:


spring:
cloud:
vault:
kv:
default-context: myapp/database/${spring.profiles.active}

Продвинутые техники: обновление в реальном времени

Подключаем Spring Cloud Bus

В pom.xml:


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

Настраиваем RabbitMQ

В application.yml:


    spring:
      rabbitmq:
        host: localhost
        port: 5672
        username: guest
        password: guest
      cloud:
        bus:
          enabled: true

Автоматическое обновление секретов

Теперь при изменении секрета в Vault:

  1. Отправляем событие в RabbitMQ
  2. Spring Cloud Bus доставляет его всем микросервисам
  3. Каждый сервис обновляет свои секреты

Работа с разными окружениями

Структура секретов в Vault

secret/
├── dev/
│   ├── app1/
│   └── app2/
├── staging/
│   ├── app1/
│   └── app2/
└── prod/
    ├── app1/
    └── app2/

Настройка Spring профилей

В bootstrap.yml:


spring:
  cloud:
    vault:
      kv:
        application-name: ${spring.application.name}/${spring.profiles.active}

Типичные проблемы и их решения

1. Vault недоступен при старте

Добавьте в application.yml:


spring:
cloud:
vault:
fail-fast: false
config:
lifecycle:
enabled: true

2. Секреты не обновляются

Не забудьте добавить:


@RefreshScope
public class MyConfig {
// ...
}

Домашнее задание

  1. Установите Vault локально
  2. Создайте простое Spring Boot приложение
  3. Настройте хранение и получение минимум трех разных секретов
  4. Бонус: настройте работу с разными профилями (dev/prod)

На следующей лекции мы рассмотрим продвинутые техники работы с Vault: политики доступа, аудит и автоматическую ротацию секретов.

До встречи на практике! И не забудьте почистить историю терминала — там могли остаться секреты

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ