Привіт! На попередній лекції ми розібралися, навіщо потрібен 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: політики доступу, аудит і автоматичну ротацію секретів.
До зустрічі на практиці! І не забудьте почистити історію терміналу — там могли лишитися секрети
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ