Stronghold разработан на основе HashiCorp Vault. Как указано в истории изменений, первая версия Stronghold (v1.0, февраль 2024) основана на Vault v1.14.x. Поэтому Stronghold сохраняет модель данных, HTTP API, формат конфигурации и CLI HashiCorp Vault и дополняет их собственными возможностями.

Stronghold основан на Vault OSS 1.14.8 — последней версии под лицензией MPL 2.0. Нумерация версий Stronghold (1.19) не совпадает с нумерацией Vault: возможности более новых версий Vault в Stronghold не переносятся автоматически.

Базовый Stronghold соответствует Vault CE. Часть возможностей, которые в HashiCorp Vault доступны только в Vault Enterprise, в Stronghold входит в редакцию Stronghold EE. Сравнение редакций приведено на странице «Редакции».

Совместимость API

HTTP API Stronghold совместим с API Vault:

  • запросы выполняются к тем же путям с префиксом /v1/ (/v1/sys/..., /v1/auth/..., /v1/<MOUNT>/...);
  • токен передаётся в заголовке X-Vault-Token;
  • форматы запросов и ответов механизмов секретов и методов аутентификации совпадают с Vault;
  • шифртекст механизма Transit имеет формат vault:v<KEY_VERSION>:..., поэтому данные, зашифрованные в Vault, остаются в привычном формате;
  • API хранилищ KV1/KV2 совместим с Vault настолько, что Stronghold может реплицировать KV-хранилища из Vault CE, Vault Enterprise или любого хранилища с совместимым Vault KV/KV2 API.

Пример запроса к API:

curl --header "X-Vault-Token: ${STRONGHOLD_TOKEN}" "${STRONGHOLD_ADDR}/v1/sys/health"

Полное описание эндпоинтов приведено в справочнике API.

CLI

CLI Stronghold повторяет команды и флаги CLI vault. Отличается только способ вызова:

ОкружениеКомандаПример
HashiCorp Vaultvault <COMMAND>vault kv get -mount=secret app
Stronghold в Deckhouse Platform (DP), через Deckhouse CLId8 stronghold <COMMAND>d8 stronghold kv get -mount=secret app
Stronghold в Linux (standalone)stronghold <COMMAND>stronghold kv get -mount=secret app

Подкоманды, флаги и их поведение описаны в разделе «d8 stronghold».

Переменные окружения

Клиентские переменные окружения в документации Stronghold используют префикс STRONGHOLD_:

StrongholdАналог в VaultНазначение
STRONGHOLD_ADDRVAULT_ADDRАдрес сервера
STRONGHOLD_TOKENVAULT_TOKENТокен клиента
STRONGHOLD_CACERTVAULT_CACERTПуть к CA-сертификату для проверки TLS-сертификата сервера

Работают оба префикса. При запуске stronghold и d8 stronghold копируют значение каждой переменной STRONGHOLD_* в переменную VAULT_* с тем же окончанием имени, например STRONGHOLD_TOKEN в VAULT_TOKEN. Если заданы обе переменные, значение STRONGHOLD_* переопределяет значение VAULT_*.

Это относится и к переменным окружения, которые переопределяют параметры конфигурации сервера, например VAULT_API_ADDR, VAULT_CLUSTER_ADDR, VAULT_RAFT_PATH, VAULT_RAFT_NODE_ID и VAULT_ENABLE_FILE_PERMISSIONS_CHECK: их тоже можно задать с префиксом STRONGHOLD_. Список этих переменных приведён в разделе «Настройка».

Конфигурация сервера и агента

Сервер и Stronghold Agent используют форматы конфигурации Vault:

  • Конфигурационный файл сервера использует формат HCL или JSON и те же секции, что и Vault: listener, storage, seal, telemetry, ui и другие. Описание секций приведено в разделе «Настройка».
  • Stronghold Agent берёт параметры подключения к серверу из секции stronghold или vault. Эти секции — синонимы и работают как со Stronghold, так и с HashiCorp Vault: задайте только одну из них. Параметры секции описаны в разделе «Основные настройки».

Инструменты экосистемы

Поскольку API совместим, большинство инструментов экосистемы Vault можно направить на Stronghold, указав его адрес. Статус совместимости:

ИнструментСпособ подключенияСтатус
Модуль DP secrets-store-integration (CSI-драйвер, env-injector)Нативная интеграцияПоддерживается
Stronghold AgentНативная интеграцияПоддерживается
Ansible, TerraformПровайдеры и модули для VaultПоддерживается, подробнее — на странице «Редакции»
External Secrets OperatorПровайдер vaultНе подтверждено тестами
cert-managerIssuer типа vaultНе подтверждено тестами
Jenkins (HashiCorp Vault Plugin), GitLab CI, GitHub ActionsПлагины и действия для Vault, JWT-аутентификацияОписаны в разделе «Примеры использования»
Клиентские SDK (Go github.com/hashicorp/vault/api, Python hvac и другие)Клиентские библиотеки VaultНе подтверждено тестами

Способы доставки секретов в Kubernetes сравниваются на странице «Доставка секретов в поды Kubernetes».

Возможности, которых нет в HashiCorp Vault

ВозможностьРедакцияОписание
Репликация KV1/KV2Stronghold EEPull-репликация отдельных KV-хранилищ по API, в том числе из Vault CE и Vault Enterprise
Механизм секретов GitOpsStronghold EEУправление конфигурацией Stronghold через кворум подписей Git-коммитов
Встроенный плагин trdlStronghold EEУправление сборкой и подписью артефактов через кворум подписей Git-коммитов
Seal inner-clusterStronghold EE, Stronghold CSEВстроенное автоматическое распечатывание: распечатанные узлы кластера распечатывают другие узлы без внешнего KMS
Seal yandexcloudkmsStronghold EEАвтоматическое распечатывание и защита root-ключа с помощью Yandex Cloud KMS (только standalone)
ГОСТ-криптографияStronghold EETLS 1.3 с ГОСТ-шифрованием Магма и Кузнечик, сертификаты ГОСТ 34.10 в PKI, ГОСТ-алгоритмы в Transit
CryptoPro seal wrapperStronghold EESeal wrapper для сценариев с российской криптографией. Доступен в сборке для Linux с поддержкой HSM
Managed Keys с Yandex KMSStronghold EEРабота с ключевым материалом в Yandex KMS и PKCS #11-устройствах из Transit, PKI и SSH
Блокировка пространств имён через веб-интерфейсStronghold EEБлокировка и разблокировка Namespace API
Команды stronghold bootstrapStronghold EEГенерация скрипта установки сервиса Linux, Helm-чарта и Docker-образа
Веб-интерфейс на русском языке, управление ролями и политиками в веб-интерфейсеИнтерфейс на русском языке — все; управление ролями и политиками — Stronghold EEЛокализованный веб-интерфейс с расширенными возможностями администрирования
Развёртывание модулем DPВсеАвтоматическая инициализация, распечатывание и интеграция с Dex. Подробнее — в разделе «Настройка Stronghold»

Возможности Vault Enterprise, которые доступны в Stronghold EE: пространства имён, performance-репликация (PR) и репликация для аварийного восстановления (DR), performance standby, автоматические снимки, seal wrap, HSM (PKCS #11), Managed Keys и аутентификация SAML. При миграции с Vault Enterprise конфигурация автоматических снимков сохраняется.

Отличия и ограничения

Stronghold отличается от HashiCorp Vault следующим:

  • Из внешних облачных KMS для seal поддерживается только Yandex Cloud KMS. Конфигурации awskms, gcpckms, azurekeyvault, ocikms и alicloudkms не поддерживаются; transit seal поддерживается.
  • Работа с HSM (seal "pkcs11") и seal "yandexcloudkms" поддерживается только при standalone-установке.
  • В DP модуль stronghold поддерживает режимы Automatic (по умолчанию) и Manual и инлеты Ingress (по умолчанию), GatewayAPI, LoadBalancer, NodePort и None. В режиме Automatic инициализацию и распечатывание выполняет модуль. Параметры модуля описаны в разделе «Настройка Stronghold».
  • В Stronghold seal wrap можно отключить для всех данных, кроме root-ключа, параметром disable_sealwrap = true.
  • Sentinel (политики RGP/EGP), KMIP, механизм секретов Transform и механизм секретов Key Management в Stronghold не реализованы: соответствующие эндпоинты закрыты лицензией даже в Stronghold EE. Control Groups реализованы в Stronghold EE. Подсистема Login MFA (identity/mfa/*: методы TOTP, Okta, Duo, PingID и Multifactor, login enforcement) входит во все редакции; устаревший Enterprise MFA (sys/mfa) доступен в Stronghold EE.

Миграция с HashiCorp Vault

Порядок переноса данных и конфигурации из HashiCorp Vault в Stronghold описан в руководстве «Миграция с HashiCorp Vault».

Дополнительные ресурсы