HA, авто-unseal и продакшн

Что отличает «учебный» Vault от того, на который можно положить продакшн.

High Availability (HA) — режим, в котором несколько узлов Vault образуют кластер: один активный обслуживает запросы, остальные — горячий резерв; авто-unseal убирает ручное распечатывание через облачный KMS.

Vault становится критической зависимостью: если он недоступен, приложения не получают секреты и не стартуют. Поэтому прод требует HA и устранения ручных операций вроде unseal при каждом рестарте.

HA на Integrated Storage (Raft)

Кластер из нечётного числа узлов (обычно 3 или 5) реплицирует данные по протоколу Raft. Один узел — active, остальные — standby. Active обслуживает запросы, standby реплицируют состояние и готовы перехватить лидерство.

   клиенты
      |
  [ active ] <--Raft--> [ standby ]
      ^                    ^
      +------Raft----------+
             [ standby ]

active упал --> выборы лидера --> standby становится active

При падении active оставшиеся узлы выбирают нового лидера (нужно большинство — кворум), и сервис продолжает работу. Кворум 2 из 3 терпит отказ одного узла.

Авто-unseal через KMS

Ручной unseal тремя ключами при каждом рестарте несовместим с автоматическим масштабированием. Авто-unseal делегирует хранение мастер-ключа облачному KMS: при старте узел сам обращается к KMS, тот расшифровывает корневой ключ — и Vault распечатывается без людей.

seal "awskms" {
  region     = "eu-central-1"
  kms_key_id = "arn:aws:kms:eu-central-1:111:key/abc-123"
}

storage "raft" {
  path    = "/opt/vault/data"
  node_id = "vault-1"
}

Схема Шамира при этом превращается в recovery-ключи: они уже не нужны для повседневного распечатывания, а служат для аварийных операций (например, генерация root-токена).

Как работает под капотом

С авто-unseal иерархия ключей не исчезает — меняется только верхний уровень: вместо ввода unseal-ключей людьми корневой ключ расшифровывает внешний KMS. Это перекладывает доверие на провайдера KMS, но устраняет хрупкую ручную операцию. В Raft-кластере запись идёт только через лидера, который реплицирует журнал на фолловеров; чтение standby-узлы могут отдавать в режиме performance standby. Бэкап делается снапшотом Raft (vault operator raft snapshot save) — это полный, зашифрованный слепок состояния.

Чеклист продакшна

ТребованиеПочему
3+ узла Raftотказоустойчивость и кворум
TLS на listenerсекреты не ходят по сети открыто
авто-unseal (KMS)рестарт без ручного вмешательства
аудит (2 устройства)журнал без fail-closed-блокировки
регулярные снапшоты Raftвосстановление после катастрофы
отозванный initial root tokenнет всемогущего долгоживущего доступа

Частые ошибки

  • Чётное число узлов (например, 2 или 4) — кворум хуже, нет выигрыша в отказоустойчивости.
  • Один узел в проде — единая точка отказа, падение = простой всех приложений.
  • Нет снапшотов Raft — потеря данных невосстановима.
  • Полагаться на ручной unseal при автоскейлинге — узлы поднимутся запечатанными.

Итог

  • HA на Raft: нечётный кластер с active/standby и автоматическими выборами лидера при сбое.
  • Авто-unseal через KMS убирает ручное распечатывание; схема Шамира остаётся для recovery.
  • Прод требует TLS, аудита, снапшотов и отзыва initial root token.
Проверьте себя
1. Почему Raft-кластер Vault делают из нечётного числа узлов?
AДля экономии
BЧтобы корректно достигался кворум большинства при выборах лидера
CТак требует KMS
DЧётное число запрещено технически
2. Что делает авто-unseal через облачный KMS?
AУдаляет мастер-ключ
BПозволяет узлу распечататься без ручного ввода ключей, расшифровав корневой ключ через KMS
CОтключает шифрование
DЗаменяет аудит
3. Чем становится схема Шамира при настроенном авто-unseal?
AПолностью отключается
BПревращается в recovery-ключи для аварийных операций
CИспользуется для шифрования данных
DЗаменяет TLS