Когда мы разрабатываем приложения, особенно микросервисные, нам нужно хранить множество чувствительных данных: пароли к базам данных, API-ключи, токены и другие секреты. Если эти данные случайно попадут в лог-файлы или исходный код, их может увидеть кто угодно (да, в том числе Джуниор, который случайно запушил application.properties в публичный репозиторий).
И тут на сцену выходит HashiCorp Vault — один из самых популярных инструментов для управления секретами. Он позволяет безопасно хранить и управлять конфиденциальными данными, причем даже в распределенных системах. Vault построен с учетом строгих требований к безопасности, позволяет управлять доступом к данным и автоматически вращать (рекурсировать) ключи.
HashiCorp Vault в двух словах
HashiCorp Vault — это инструмент, который можно сравнить с гигантским сейфом для ваших секретов. Этот сейф охраняют строгие политики безопасности, требующие авторизации для доступа к его содержимому. Vault поддерживает множество технологий, таких как шифрование данных, управление ключами, аудит операций и даже автоматическое распределение секретов.
Преимущества Vault:
- Централизованное хранение секретов.
- Гибкая система управления доступами.
- Ротация ключей и автоматизация доступа.
- Логи аудитории (слежка за всеми, кто пытается вскрыть сейф).
Реализация: настройка Vault
Для начала мы настроим Vault на локальной машине. Если у вас уже установлен Vault — замечательно, сразу переходите к следующему разделу.
Установка Vault
- Скачайте Vault.
- Распакуйте архив и добавьте исполняемый файл в PATH.
- Проверьте корректность установки командой:
vault --version
Получение версии Vault подтверждает, что вы готовы двигаться дальше.
Запуск локального экземпляра Vault
После установки запустим локальный сервер Vault в dev-режиме:
vault server -dev
Вы увидите сообщение с примерно таким выводом:
==> Vault server configuration:
...
Root Token: s.aBcDeFg12345
...
Обратите внимание на строчку “Root Token” — это ваш ключ доступа к Vault. Не забудьте его скопировать, иначе встреча с Vault закончится быстрее, чем началась.
Теперь откройте новый терминал и выполните:
export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN='s.aBcDeFg12345'
Поздравляем, вы только что вошли внутрь сейфа!
Практика: подключение Spring Boot приложения к Vault
Теперь мы свяжем наш локальный Vault с приложением Spring Boot.
Добавление зависимостей
Включим в проект зависимости для работы с Vault. Откройте файл pom.xml и добавьте следующие зависимости:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
После добавления зависимости обновляем проект.
Настройка application.properties
Теперь мы настроим Spring Boot для взаимодействия с Vault. Добавьте следующую конфигурацию в application.properties:
spring.cloud.vault.uri=http://127.0.0.1:8200
spring.cloud.vault.token=s.aBcDeFg12345
spring.cloud.vault.generic.enabled=true
spring.cloud.vault.generic.backend=secret
spring.cloud.vault.generic.default-context=my-app
spring.cloud.vault.uri— URI вашего Vault.spring.cloud.vault.token— токен доступа (временно используем root-токен).spring.cloud.vault.generic.backend— указывает, какой бекенд Vault мы используем. Бекендsecretуже предустановлен.spring.cloud.vault.generic.default-context— контекст приложения, где хранятся ваши секреты.
Загрузка секретов в Vault
Создайте секреты в Vault:
vault kv put secret/my-app username=admin password=securepassword123
Эта команда сохраняет username и password в контексте secret/my-app.
Доступ к секретам в коде
Теперь мы можем получить доступ к секретам через параметры в приложении. Создайте класс, чтобы вывести секреты в лог:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SecretController {
@Value("${username}")
private String username;
@Value("${password}")
private String password;
@GetMapping("/secrets")
public String getSecrets() {
return "Username: " + username + ", Password: " + password;
}
}
Когда вы запустите приложение и обратитесь к /secrets, вы получите:
Username: admin, Password: securepassword123
🎉 Вы только что подключили Vault к вашему приложению!
Ротация секретов
Одна из фишек Vault — автоматическое обновление секретов. Например, вместо статичного хранения паролей можно настроить автоматическую ротацию с помощью динамических секретов. Это позволяет ежедневно обновлять пароли в Vault без необходимости изменения кода. Ротация секретов помогает предотвращать утечки информации.
Для настройки ротации нужно:
- Настроить соответствующий бекенд (например,
database). - Создать политики управления доступом к секретам.
Советы и лучшие практики работы с Vault
- Минимизируйте доступ. Никогда не используйте root-токен в продакшене. Настройте политики, чтобы ограничить доступ только к необходимым секретам.
- Шифруйте всё. Vault сам по себе шифрует данные, но не стоит полагаться только на это: избегайте логирования секретов, случайного вывода в консоль и хранения токенов в открытом виде.
- Используйте динамические секреты. Там, где возможно, используйте ротируемые секреты. Это снижает риски при утечке данных.
- Мониторьте использование. Настройте аудит и следите за тем, кто и когда пытался получить доступ к данным.
Надеюсь, теперь Vault перестал быть для вас пугающим монолитом, спрятанным где-то в облаках. На следующей лекции мы продолжим углубляться в то, как управлять конфигурациями и профилями в Spring, чтобы наши приложения оставались не только гибкими, но и безопасными.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ