Разделение ключа: схема Шамира

Почему мастер-ключ не отдают одному человеку, а делят на части так, что нужно собрать лишь несколько.

Shamir's Secret Sharing — криптографическая схема, разбивающая секрет на N частей так, что для восстановления нужно собрать любые K из них (порог), а K−1 частей не дают о секрете ничего.

Если мастер-ключ доверить одному человеку, он становится единой точкой отказа: уволится, заболеет, окажется злоумышленником. Если раздать копию всем — любой одиночка сможет распечатать Vault. Схема Шамира решает обе крайности.

Идея порога K из N

При инициализации Vault генерирует мастер-ключ и тут же разбивает его на N unseal-ключей (shares) с порогом K (threshold). Стандартная конфигурация — 5 частей и порог 3: ключи раздают пятерым хранителям, а для распечатывания должны собраться любые трое.

Мастер-ключ
   |
 (схема Шамира, N=5, K=3)
   |
   +--> share 1  (хранитель A)
   +--> share 2  (хранитель B)
   +--> share 3  (хранитель C)
   +--> share 4  (хранитель D)
   +--> share 5  (хранитель E)

Распечатать: ЛЮБЫЕ 3 из 5
Двое сговорившихся -- НЕ достаточно

Почему K−1 частей бесполезны

Гениальность схемы: имея K−1 частей, вы не приближаетесь к ключу ни на бит. Математически каждая недостающая часть оставляет ровно столько же неопределённости, сколько было в начале. Это не «угадать оставшийся кусок», а полная информационная защита до достижения порога.

Как задаётся при инициализации

Параметры N и K выбираются один раз — при vault operator init:

vault operator init \
  -key-shares=5 \
  -key-threshold=3

Vault единожды выведет 5 unseal-ключей и initial root token. Это единственный момент, когда части показываются; их нужно сразу безопасно раздать хранителям.

Unseal Key 1: 4jw...A==
Unseal Key 2: hT2...B==
Unseal Key 3: 9kx...C==
Unseal Key 4: pZ1...D==
Unseal Key 5: mQ8...E==

Initial Root Token: hvs.AbCd...

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

Схема Шамира опирается на свойство многочленов: через любые K точек проходит ровно один многочлен степени K−1. Секрет прячут в свободный член такого многочлена, а каждая «часть» — это значение многочлена в некоторой точке. Имея K точек, многочлен восстанавливают интерполяцией и читают секрет; имея меньше — кандидатов бесконечно много.

Выбор параметров на практике

N / KСмысл
5 / 3баланс по умолчанию: терпит потерю 2 ключей, требует сговора 3
3 / 2маленькая команда
1 / 1только dev/тесты — единая точка отказа

Важно: в проде схему Шамира всё чаще заменяют авто-unseal через облачный KMS, но recovery-ключи там работают по той же схеме Шамира.

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

  • K=1 в проде — любой одиночка распечатает Vault.
  • Раздать все ключи одному человеку — теряется смысл разделения.
  • Не сохранить ключи при init — второго шанса увидеть их нет, Vault придётся пересоздавать.

Итог

  • Схема Шамира делит мастер-ключ на N частей с порогом K; нужно собрать любые K.
  • Менее K частей не дают о ключе никакой информации — это полная защита, а не «почти угадал».
  • Параметры задаются один раз при operator init; ключи показываются единственный раз.
Проверьте себя
1. Что означает порог (threshold) в схеме Шамира при настройке 5/3?
AНужны все 5 ключей
BДостаточно любых 3 из 5 ключей
CДостаточно 1 ключа
DКлючей вообще не нужно
2. Что дают злоумышленнику K−1 частей ключа?
AПоловину ключа
BНичего — нет информации о секрете до достижения порога
CВозможность подобрать остаток перебором
DПолный доступ к Vault
3. Когда unseal-ключи показываются администратору?
AПри каждом запуске Vault
BОдин раз — при vault operator init
CПри каждом unseal
DОни хранятся в storage и доступны всегда