Механизм seal/unseal в OpenBao

Обзор

Одной из основополагающих концепций безопасности OpenBao является механизм запечатывания/распечатывания (seal/unseal), который гарантирует криптографическую недоступность системы до тех пор, пока в процессе распечатывания не будет достаточного кворума доверенных сторон. В данной статье представлены теоретические основы этого механизма с акцентом на криптографические принципы и стратегии управления ключами, обеспечивающие безопасный распределенный контроль над ключами шифрования.

Механизм запечатывания/распечатывания в OpenBao обеспечивает конфиденциальность и целостность всех хранимых секретных данных, даже если хранилище (например, файлы или сетевое хранилище) скомпрометировано. Основные цели:

  • Данные (секреты, политики, ключи) должны оставаться зашифрованными, чтобы лица, имеющие доступ к raw-памяти, не могли прочитать конфиденциальную информацию.

  • Секреты не должны быть доступны до тех пор, пока авторизованные операторы/механизмы не предоставят ключи, даже если процесс обслуживания перезапущен или реплики вышли из строя.

Принципы работы

Схема разделения секрета Шамира

OpenBao использует схему разделения секрета Шамира (Shamir’s Secret Sharing, SSS) — криптографический алгоритм, основанный на пороговом разбиении. SSS позволяет разделить секрет на частей так, что:

  1. Из любого подмножества (порог) или более частей ( ) можно восстановить .

  2. Из любого подмножества, состоящего из менее, чем частей, нельзя извлечь никакой информации об .

Если , то все части являются необходимыми для восстановления секрета .

Секрет шифруется как свободный член случайного полинома степени :

где  — выбранные случайным образом коэффициенты. Каждая часть представляет собой точку, рассчитываемую как .

Секрет может быть восстановлен с помощью следующей формулы:

У данного подхода есть существенные преимущества:

  • Криптографическая стойкость. Алгоритм остается безопасным, даже если у недоброжелателя бесконечная вычислительная мощность.

  • Масштабируемость. Количество носителей частиц может увеличиваться вплоть до размерности поля, в котором проводятся вычисления, в то время как может оставаться неизменным.

  • Динамичность. Можно периодически менять используемый многочлен и пересчитывать частицы, сохраняя секрет (свободный член) неизменным.

  • Гибкость. В тех случаях, когда стороны не являются равными между собой, схема позволяет это учесть путем выдачи сразу нескольких частиц одной стороне. Например, при лидер некоторой команды сможет восстановить секрет самостоятельно, имея 4 частицы, а его подчиненным, имеющим по одной частице, придется объединиться для восстановления секрета.

У алгоритма также есть и слабая сторона — секрет должен существовать целиком в одном месте перед разбиением, а также во время восстановления, что предоставляет две потенциальные точки атаки.

В контексте OpenBao секрет, шифруемый SSS — это unseal-ключ, используемый для восстановления root-ключа (master-ключа).

Seal

При запечатывании кластера root-ключ удаляется из памяти. Система входит в состояние sealed, в котором она не выполняет никакие операции, связанные с дешифрованием и доступом к секретам. Активными остаются только некоторые эндпойнты, например, необходимые для распечатывания. Данная простота процесса позволяет быстро запечатать кластер в случае обнаружения внешнего вмешательства.

Для восстановления root-ключа необходимо выполнить процесс распечатывания.

Unseal

При распечатывании кластера узлы отправляют свои частицы на определенный эндпойнт. Как только поступит валидных частиц, OpenBao восстановит unseal-ключ. После этого произойдет дешифрование root-ключа и кластер переключится в состояние unsealed. Он будет оставаться в таком состоянии, пока не произойдет одно из следующих событий:

  • Запечатывание с помощью API.

  • Перезагрузка сервера.

  • Неразрешимая ошибка в хранилище OpenBao.

Распечатывание OpenBao
Распечатывание OpenBao
Распечатывание OpenBao
Распечатывание OpenBao

Auto Unseal

Распечатывание кластера с помощью SSS вовлекает много ручной работы, поэтому был разработан более комфортный в использовании механизм Auto Unseal. Его идея заключается в делегации ответственности за получение unseal-ключа не пользователям, а доверенному устройству (HSM) или сервису (KMS). При запуске OpenBao просит сервис или устройство расшифровать root-ключ, полученный из хранилища.

Механизм Auto Unseal
Механизм Auto Unseal
Механизм Auto Unseal
Механизм Auto Unseal

Помимо распечатывания, существуют и другие операции, для которых необходим кворум пользователей. При включенном механизме Auto Unseal этим операциям требуются фрагменты recovery-ключа вместо частиц unseal-ключа. В то время как процесс инициализации с помощью SSS создает частицы unseal-ключа, инициализация с помощью Auto Unseal создает фрагменты recovery-ключа.

Фрагменты recovery-ключа генерируются из внутреннего recovery-ключа, который разделяется с помощью SSS, как и unseal-ключ. В ADPS механизм Auto Unseal реализован для PKCS 11.

ВАЖНО
Recovery-ключи служат средством авторизации, поэтому они не могут расшифровать root-ключ и распечатать кластер, если механизм Auto Unseal неактивен. Если механизм распечатывания или его ключи будут безвозвратно удалены, кластер OpenBao будет невозможно восстановить даже из резервных копий.
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней