Привет! На прошлой лекции мы узнали, зачем нужен 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:
- Отправляем событие в RabbitMQ
- Spring Cloud Bus доставляет его всем микросервисам
- Каждый сервис обновляет свои секреты
Работа с разными окружениями
Структура секретов в 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 {
// ...
}
Домашнее задание
- Установите Vault локально
- Создайте простое Spring Boot приложение
- Настройте хранение и получение минимум трех разных секретов
- Бонус: настройте работу с разными профилями (dev/prod)
На следующей лекции мы рассмотрим продвинутые техники работы с Vault: политики доступа, аудит и автоматическую ротацию секретов.
До встречи на практике! И не забудьте почистить историю терминала — там могли остаться секреты
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ