Механизм seal/unseal в OpenBao
Обзор
Одной из основополагающих концепций безопасности OpenBao является механизм запечатывания/распечатывания (seal/unseal), который гарантирует криптографическую недоступность системы до тех пор, пока в процессе распечатывания не будет достаточного кворума доверенных сторон. В данной статье представлены теоретические основы этого механизма с акцентом на криптографические принципы и стратегии управления ключами, обеспечивающие безопасный распределенный контроль над ключами шифрования.
Механизм запечатывания/распечатывания в OpenBao обеспечивает конфиденциальность и целостность всех хранимых секретных данных, даже если хранилище (например, файлы или сетевое хранилище) скомпрометировано. Основные цели:
-
Данные (секреты, политики, ключи) должны оставаться зашифрованными, чтобы лица, имеющие доступ к raw-памяти, не могли прочитать конфиденциальную информацию.
-
Секреты не должны быть доступны до тех пор, пока авторизованные операторы/механизмы не предоставят ключи, даже если процесс обслуживания перезапущен или реплики вышли из строя.
Принципы работы
Схема разделения секрета Шамира
OpenBao использует схему разделения секрета Шамира (Shamir’s Secret Sharing, SSS) — криптографический алгоритм, основанный на пороговом разбиении. SSS позволяет разделить секрет на частей так, что:
-
Из любого подмножества (порог) или более частей ( ) можно восстановить .
-
Из любого подмножества, состоящего из менее, чем частей, нельзя извлечь никакой информации об .
Если , то все части являются необходимыми для восстановления секрета .
Секрет шифруется как свободный член случайного полинома степени :
где — выбранные случайным образом коэффициенты. Каждая часть представляет собой точку, рассчитываемую как .
Секрет может быть восстановлен с помощью следующей формулы:
У данного подхода есть существенные преимущества:
-
Криптографическая стойкость. Алгоритм остается безопасным, даже если у недоброжелателя бесконечная вычислительная мощность.
-
Масштабируемость. Количество носителей частиц может увеличиваться вплоть до размерности поля, в котором проводятся вычисления, в то время как может оставаться неизменным.
-
Динамичность. Можно периодически менять используемый многочлен и пересчитывать частицы, сохраняя секрет (свободный член) неизменным.
-
Гибкость. В тех случаях, когда стороны не являются равными между собой, схема позволяет это учесть путем выдачи сразу нескольких частиц одной стороне. Например, при лидер некоторой команды сможет восстановить секрет самостоятельно, имея 4 частицы, а его подчиненным, имеющим по одной частице, придется объединиться для восстановления секрета.
У алгоритма также есть и слабая сторона — секрет должен существовать целиком в одном месте перед разбиением, а также во время восстановления, что предоставляет две потенциальные точки атаки.
В контексте OpenBao секрет, шифруемый SSS — это unseal-ключ, используемый для восстановления root-ключа (master-ключа).
Seal
При запечатывании кластера root-ключ удаляется из памяти. Система входит в состояние sealed, в котором она не выполняет никакие операции, связанные с дешифрованием и доступом к секретам. Активными остаются только некоторые эндпойнты, например, необходимые для распечатывания. Данная простота процесса позволяет быстро запечатать кластер в случае обнаружения внешнего вмешательства.
Для восстановления root-ключа необходимо выполнить процесс распечатывания.
Unseal
При распечатывании кластера узлы отправляют свои частицы на определенный эндпойнт. Как только поступит валидных частиц, OpenBao восстановит unseal-ключ. После этого произойдет дешифрование root-ключа и кластер переключится в состояние unsealed. Он будет оставаться в таком состоянии, пока не произойдет одно из следующих событий:
-
Запечатывание с помощью API.
-
Перезагрузка сервера.
-
Неразрешимая ошибка в хранилище OpenBao.
Auto Unseal
Распечатывание кластера с помощью SSS вовлекает много ручной работы, поэтому был разработан более комфортный в использовании механизм Auto Unseal. Его идея заключается в делегации ответственности за получение unseal-ключа не пользователям, а доверенному устройству (HSM) или сервису (KMS). При запуске OpenBao просит сервис или устройство расшифровать root-ключ, полученный из хранилища.
Помимо распечатывания, существуют и другие операции, для которых необходим кворум пользователей. При включенном механизме Auto Unseal этим операциям требуются фрагменты recovery-ключа вместо частиц unseal-ключа. В то время как процесс инициализации с помощью SSS создает частицы unseal-ключа, инициализация с помощью Auto Unseal создает фрагменты recovery-ключа.
Фрагменты recovery-ключа генерируются из внутреннего recovery-ключа, который разделяется с помощью SSS, как и unseal-ключ. В ADPS механизм Auto Unseal реализован для PKCS 11.
|
ВАЖНО
Recovery-ключи служат средством авторизации, поэтому они не могут расшифровать root-ключ и распечатать кластер, если механизм Auto Unseal неактивен. Если механизм распечатывания или его ключи будут безвозвратно удалены, кластер OpenBao будет невозможно восстановить даже из резервных копий.
|