HashiCorp Vault поддерживает автоматическое распечатывание (auto-unseal) с помощью внешнего сервиса шифрования — механизма seal "transit". Key Management предоставляет совместимый с ним API, поэтому корневой ключ Vault можно защитить ключом Key Management. Настройка одинакова для любой инсталляции Vault: на виртуальной машине, в Docker, в Kubernetes или в Container Apps.
В режиме автоматического распечатывания корневой ключ Vault зашифровывается с помощью ключа Key Management и содержится в своем хранилище. При каждом запуске Vault отправляет зашифрованный корневой ключ в Key Management и получает его расшифрованным. Ключ Key Management не покидает сервис, а каждое обращение к нему записывается в аудит-лог.
Пример развертывания Vault с автоматическим распечатыванием приведен в практическом руководстве «Автоматическое распечатывание HashiCorp Vault в Container Apps с помощью Key Management».
Vault не сможет запуститься, если ключ Key Management деактивирован или недоступен.
Если ключ удален, корневой ключ Vault нельзя расшифровать. Данные Vault будут потеряны без возможности восстановления.
Основные способы распечатывания Vault:
Способ распечатывания | Что происходит после перезапуска | Где находится ключ распечатывания |
|---|---|---|
Ручной ввод долей ключа (Shamir) | Vault остается запечатанным, пока администраторы не введут доли ключа. Приложения, которые получают секреты из Vault, недоступны | У администраторов, вне инфраструктуры |
С помощью скрипта, который вводит доли ключа автоматически | Vault автоматически распечатывается | В открытом виде рядом с Vault: в файле, переменной окружения, CI/CD или резервной копии. Пользователь с доступом к этим ресурсам получает доступ ко всем секретам |
Auto-unseal с помощью Key Management | Vault автоматически распечатывается | В Key Management. Ключ не покидает сервис, Vault только отправляет запросы на шифрование и расшифровку |
Создайте симметричный ключ для распечатывания Vault.
Создайте сервисный аккаунт, от имени которого Vault будет обращаться к Key Management.
Выпустите API-ключ для сервисного аккаунта: в поле Сервисы выберите Key Management.
Выдайте сервисному аккаунту роль sckm.user на ключ:
В карточке ключа перейдите в раздел Права доступа.
Нажмите Назначить роли.
Выберите сервисный аккаунт.
Нажмите Продолжить.
Выберите роль sckm.user.
Нажмите Назначить.
Роль позволяет зашифровывать и расшифровывать данные ключом, но не управлять им.
Скопируйте идентификатор проекта, в котором создан ключ.
Добавьте в файл конфигурации Vault блок seal "transit":
seal "transit" {address = "https://kms.api.cloud.ru"mount_path = "<project_id>"key_name = "<key_name>"disable_renewal = "true"}
Где:
address — адрес API Key Management.
mount_path — идентификатор проекта, в котором создан ключ.
key_name — название ключа Key Management.
disable_renewal — отключение продления токена. Key Management не поддерживает продление токена, поэтому укажите true.
Передайте API-ключ сервисного аккаунта процессу Vault в переменной окружения VAULT_TOKEN.
Не указывайте API-ключ в файле конфигурации в параметре token — ключ распечатывания окажется в открытом виде рядом с Vault. Храните API-ключ в Secret Management.
Параметры mount_path и key_name также можно передать в переменных окружения. Значения переменных окружения имеют приоритет над файлом конфигурации.
Переменная окружения | Параметр в блоке seal "transit" |
|---|---|
VAULT_TRANSIT_SEAL_MOUNT_PATH | mount_path |
VAULT_TRANSIT_SEAL_KEY_NAME | key_name |
VAULT_TRANSIT_SEAL_DISABLE_RENEWAL | disable_renewal |
VAULT_TOKEN | token |
Запустите Vault с новой конфигурацией.
Инициализируйте Vault:
vault operator init -recovery-shares=5 -recovery-threshold=3
При автоматическом распечатывании Vault выдаст ключи восстановления (recovery keys) вместо ключей распечатывания. Ключи восстановления нужны для административных операций, например для выпуска нового root-токена, но не для распечатывания.
Сохраните ключи восстановления и root-токен в надежном месте.
Если Vault уже инициализирован и распечатывается вручную долями ключа, повторная инициализация не нужна. Выполните миграцию механизма распечатывания по инструкции Seal migration.
Перезапустите Vault.
Выполните команду:
vault status
Vault распечатается автоматически, если в выводе команды будут указаны значения:
Seal Type transitRecovery Seal trueInitialized trueSealed false
В сервисе Аудит-логирование найдите обращение Vault к ключу — отфильтруйте события по сервису-источнику Key Management и типу события AccessKey.
При запуске Vault в событии будет указана операция "operation": "DECRYPT", а в качестве инициатора — сервисный аккаунт, от имени которого работает Vault.