Seal и unseal: запечатывание Vault

Почему свежезапущенный Vault бесполезен, пока его не «распечатали», и что физически при этом происходит.

Seal/unseal — механизм, при котором Vault стартует в запечатанном состоянии (не может расшифровать данные) и переходит в рабочее только после восстановления мастер-ключа.

Представьте сейф с двойным замком. Внутренний замок (ключ шифрования) открывает данные, но сам он заперт во внешнем замке (мастер-ключ). Когда Vault останавливается, мастер-ключ забывается из памяти — сейф запечатан. Чтобы снова открыть, мастер-ключ нужно ввести заново.

Иерархия ключей

[ unseal-ключи / KMS ]
        |  восстанавливают
        v
[ Мастер-ключ (master key) ]
        |  расшифровывает
        v
[ Ключ шифрования (encryption key) ]
        |  шифрует/расшифровывает
        v
[ Данные в storage backend ]

Мастер-ключ никогда не пишется на диск. Он существует только в оперативной памяти запущенного и распечатанного Vault. Поэтому любая остановка процесса автоматически запечатывает Vault — это свойство безопасности, а не баг.

Что значит запечатанный Vault

В sealed-состоянии Vault принимает соединения, но почти все операции запрещены: он не знает ключ шифрования и физически не может прочитать ни один секрет. Доступны только статус и команды распечатывания.

vault status

Вывод:

Key                Value
---                -----
Seal Type          shamir
Initialized        true
Sealed             true
Total Shares       5
Threshold          3
Unseal Progress    0/3

Поле Sealed: true означает, что ключ ещё не собран. Unseal Progress 0/3 подсказывает: нужно ввести 3 части ключа.

Как работает распечатывание

Распечатывание — это пошаговый ввод unseal-ключей. Каждый ввод — отдельная команда, и каждый держатель ключа вводит свою часть. Когда набирается порог, Vault восстанавливает мастер-ключ в памяти и открывает барьер.

vault operator unseal   # вводит 1-ю часть
vault operator unseal   # вводит 2-ю часть
vault operator unseal   # вводит 3-ю часть -> Vault распечатан

После третьей части vault status покажет Sealed: false, и Vault начнёт обслуживать запросы.

Зачем вообще запечатывать

Sealed-состояние — это защита на случай кражи. Если злоумышленник украл сервер или сделал снапшот диска, он получит запечатанный Vault, бесполезный без unseal-ключей, которые хранятся отдельно и у разных людей. Это же позволяет аварийно «закрыть» Vault командой vault operator seal при подозрении на инцидент.

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

  • Хранить unseal-ключи рядом с Vault — теряется весь смысл запечатывания.
  • Удивляться, что после рестарта Vault не работает — это норма, его надо распечатать (или настроить авто-unseal).
  • Путать unseal с логином — распечатывание открывает сервер целиком, а логин даёт токен конкретному клиенту.

Итог

  • Vault стартует запечатанным и не может читать секреты, пока не восстановлен мастер-ключ.
  • Мастер-ключ живёт только в памяти и забывается при остановке — это защита от кражи диска.
  • Распечатывание — пошаговый ввод unseal-ключей до достижения порога.
Проверьте себя
1. Что происходит с Vault при остановке процесса?
AОн сохраняет мастер-ключ на диск
BОн автоматически запечатывается, забывая мастер-ключ из памяти
CОн удаляет все секреты
DНичего, остаётся распечатанным
2. Что можно делать с запечатанным (sealed) Vault?
AЧитать любые секреты
BТолько смотреть статус и выполнять распечатывание
CСоздавать политики
DЛогиниться приложениям
3. Зачем нужно запечатанное состояние?
AЧтобы ускорить запуск
BЧтобы украденный диск/снапшот был бесполезен без отдельно хранимых unseal-ключей
CЧтобы экономить память
DЧтобы отключать аудит