Stronghold — это сервер с HTTP API, который хранит данные в зашифрованном виде и выдаёт их только аутентифицированным клиентам с подходящими политиками. Архитектура Stronghold совместима с HashiCorp Vault: базовый Stronghold соответствует Vault CE.

На этой странице описаны компоненты одного сервера и путь запроса через них. Слои узла Stronghold EE (WAL Backend, Sealwrap), HA-кластер и межкластерная репликация описаны на странице «Архитектура репликации: Stronghold и Stronghold EE».

Компоненты сервера

КомпонентНазначение
HTTP API (listener)Принимает запросы клиентов, CLI и веб-интерфейса по HTTPS. Все операции Stronghold, включая управление, выполняются через API.
CoreЯдро сервера: связывает остальные компоненты, обрабатывает запрос по шагам, управляет состоянием seal и режимом HA.
Token storeХранит токены и сопоставленные с ними политики, TTL и метаданные. Проверяет токен каждого запроса. Подробнее — в разделе «Токен».
Policy engine (ACL)Сравнивает путь и операцию запроса с политиками токена и разрешает или запрещает запрос. Подробнее — в разделе «Политики».
Методы аутентификацииПроверяют учётные данные клиента (LDAP, OIDC, JWT, Kubernetes, AppRole, userpass и другие) и выдают токен. Подробнее — в разделе «Аутентификация».
Механизмы секретовХранят, генерируют или обрабатывают секреты: KV, PKI, Transit, SSH, базы данных и другие. Каждый механизм монтируется по своему пути (mount).
RouterНаправляет запрос к методу аутентификации или механизму секретов по пути запроса.
Expiration managerОтслеживает аренды (lease) токенов и динамических секретов, продлевает и отзывает их. Подробнее — в разделе «Аренда».
Аудит-устройстваЗаписывают каждый запрос и ответ в журнал (file, syslog, socket). Подробнее — в разделе «Аудит».
Криптографический барьер (Security Barrier)Шифрует всё, что записывается в хранилище, и расшифровывает прочитанное. Использует AES-256-GCM.
Бэкенд храненияДолговременно хранит зашифрованные данные. Для HA используется интегрированное хранилище Raft.
SealЗащищает root-ключ, которым зашифрована связка ключей барьера: доли Shamir, HSM (pkcs11), Yandex Cloud KMS или inner-cluster. Подробнее — в разделе «Запечатывание и распечатывание».

Путь запроса

Запрос проходит компоненты сервера в определённом порядке. Упрощённая схема для запроса на чтение секрета:

Путь запроса на чтение секрета через компоненты сервера Stronghold

  1. Клиент подключается к listener по TLS и передаёт токен в заголовке запроса.
  2. Token store находит токен и связанные с ним политики. Если токена нет, срок его действия истёк или он отозван, запрос отклоняется. Запросы на вход (auth/<METHOD>/login) выполняются без токена: метод аутентификации проверяет учётные данные и в ответе выдаёт новый токен.
  3. Policy engine проверяет, разрешена ли операция (read, create, update, delete, list и другие) на пути запроса. По умолчанию всё запрещено; явный запрет deny имеет приоритет над разрешениями.
  4. До выполнения запрос записывается в аудит-устройства. Чувствительные значения в записи хешируются HMAC-SHA256.
  5. Router выбирает механизм секретов или метод аутентификации, смонтированный по префиксу пути.
  6. Механизм секретов выполняет операцию. Если он выдаёт динамический секрет или токен, expiration manager регистрирует аренду.
  7. Все данные, которые механизм записывает или читает, проходят через барьер. Выше барьера данные открыты, ниже — только зашифрованы.
  8. Бэкенд хранения получает и возвращает только шифртекст. В HA-кластере Raft реплицирует его на остальные узлы.
  9. Перед отправкой клиенту ответ также записывается в аудит-устройства.

Запись запроса в аудит выполняется после проверки токена и политик, в том числе для отклонённых запросов.

Если запрос пришёл на standby-узел HA-кластера, он перенаправляется на активный узел через кластерный порт. В Stronghold EE performance standby-узлы обслуживают чтения локально. Подробнее — на странице «Архитектура репликации: Stronghold и Stronghold EE».

Аренды и expiration manager

Expiration manager — фоновый компонент core, который ведёт учёт аренд:

  • при выдаче динамического секрета или токена создаёт аренду с TTL;
  • продлевает аренду по запросу клиента, если это разрешено;
  • по истечении TTL отзывает аренду — механизм секретов удаляет выданные учётные данные во внешней системе (например, роль в базе данных);
  • при отзыве токена отзывает все аренды, созданные с его помощью, и дочерние токены.

Статические секреты KV не выдают аренд. Подробнее — в разделе «Аренда».

Seal и барьер

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

Цепочка ключей:

Цепочка ключей Stronghold: ключ распечатывания расшифровывает root-ключ, root-ключ расшифровывает связку ключей барьера, связка ключей шифрует данные

Барьер защищает:

  • конфиденциальность данных в хранилище, на диске и в резервных копиях (снимках Raft);
  • целостность данных: AES-GCM обнаруживает изменение шифртекста;
  • данные при передаче между узлами по Raft и в потоке репликации: они передаются уже зашифрованными барьером.

Барьер не защищает данные выше себя: в памяти распечатанного сервера, в ответах клиентам и в самих внешних системах. Подробнее об этих ограничениях — на странице «Модель угроз».

Ключи барьера можно ротировать: новые записи шифруются новым ключом, старые остаются читаемыми. Подробнее об алгоритмах — в разделе «Криптография».

В Stronghold EE для чувствительных путей доступен второй слой шифрования — seal wrap.