Обзор конфигурации

Серверы Stronghold настраиваются с помощью конфигурационного файла в формате HCL или JSON.

Для повышения безопасности можно включить проверку прав доступа к файлам, установив переменную окружения VAULT_ENABLE_FILE_PERMISSIONS_CHECK.
Если проверка активна, Stronghold проверяет:

  • что директория конфигурации и файлы принадлежат пользователю, под которым запущен Stronghold;
  • что группа и другие пользователи не имеют прав на запись или выполнение этих файлов.

При необходимости администратор может задать пользователя и права доступа для директории плагинов и исполняемых файлов.
Для этого в конфигурации используются параметры plugin_file_uid и plugin_file_permissions.
По умолчанию проверка прав в Stronghold отключена.

Пример конфигурации:

ui            = true
cluster_addr  = "https://127.0.0.1:8201"
api_addr      = "https://127.0.0.1:8200"
disable_mlock = true

storage "raft" {
  path = "/path/to/raft/data"
  node_id = "raft_node_id"
}

listener "tcp" {
  address       = "127.0.0.1:8200"
  tls_cert_file = "/path/to/full-chain.pem"
  tls_key_file  = "/path/to/private-key.pem"
}

telemetry {
  statsite_address = "127.0.0.1:8125"
  disable_hostname = true
}

Для применения новых параметров после изменения файла конфигурации нужно перезапустите сервис Stronghold:

systemctl restart stronghold

Обзор параметров

  • storage — обязательный блок. Определяет бэкенд хранилища, где Stronghold сохраняет данные.
    Для работы Stronghold в режиме высокой доступности (HA) необходимо использовать хранилище, поддерживающее механизмы координации.
    Если выбранный бэкенд поддерживает HA, соответствующие параметры можно указать прямо внутри блока storage.
    В противном случае следует задать отдельный блок ha_storage с бэкендом, который обеспечивает HA, и его параметрами.
    Подробнее см. раздел Секция storage.

  • ha_storage — необязательный блок. Определяет бэкенд хранилища, который используется для координации Stronghold в режиме HA.
    Указанный бэкенд должен поддерживать HA.
    Если параметр не указан, Stronghold попытается использовать HA на бэкенде, определённом в storage.
    Если этот бэкенд уже поддерживает HA и его параметры заданы в storage, дополнительный блок ha_storage не требуется.

  • listener — обязательный блок. Определяет настройки прослушивания API Stronghold.
    Подробнее см. раздел Секция listener.

  • user_lockout — необязательный блок. Определяет правила блокировки пользователя при неудачных попытках входа.
    Подробнее см. раздел Секция user_lockout.

  • cluster_name — необязательный строковый параметр. Идентификатор кластера Stronghold.
    Если не указан, Stronghold сгенерирует его автоматически.

  • cache_size — необязательный параметр (строка). Размер кэша чтения, используемого физической подсистемой хранения.
    Указывается в числе записей, поэтому итоговый объём кэша зависит от их размера.
    Значение по умолчанию — 131072.

  • disable_cache — необязательный логический параметр. Полностью отключает кэширование в Stronghold, включая кэш чтения.
    Может существенно снизить производительность.
    По умолчанию — false.

  • disable_mlock — необязательный логический параметр. Отключает использование системного вызова mlock, который предотвращает выгрузку памяти на диск.

    Рекомендации по использованию:

    • Не рекомендуется отключать mlock, если используется внешний бэкенд хранилища.
    • Допускается отключить mlock, если в системе отсутствует swap или он зашифрован.
    • Поддержка mlock доступна только в UNIX-подобных ОС (Linux, FreeBSD). В Windows, NaCL и Android данная функция автоматически отключена.
    • Настоятельно рекомендуется отключить mlock, если используется встроенное хранилище (BoltDB через Raft).
      Использование mlock в этом случае может вызвать нехватку памяти, так как все данные будут загружены в ОЗУ.
      Несмотря на то что данные BoltDB остаются зашифрованными “на диске”, swap должен быть отключён, чтобы исключить выгрузку других чувствительных данных в файл подкачки.

    В Linux можно разрешить Stronghold использовать mlock без запуска от root, выполнив:

    sudo setcap cap_ipc_lock=+ep $(readlink -f $(which stronghold))
    

    Каждый плагин запускается как отдельный процесс, поэтому нужно применить аналогичные настройки для каждого плагина в директории plugins. Если вы используете дистрибутив Linux с актуальной версией systemd, то можете добавить следующую директиву в секцию [Service] конфигурационного файла:

    LimitMEMLOCK=infinity
    
  • plugin_directory — необязательный строковый параметр. Указывает каталог, из которого Stronghold может загружать плагины.
    Для корректной работы Stronghold должен иметь права на чтение файлов в этой директории.
    Значение не может быть символической ссылкой. По умолчанию параметр не задан и имеет значение "".

  • plugin_tmpdir — необязательный строковый параметр. Каталог, где Stronghold создаёт временные файлы для взаимодействия с контейнеризированными плагинами через Unix-сокеты.
    Если параметр не указан, используется системный каталог для временных файлов.
    Как правило, настройка не требуется, за исключением случаев, когда Stronghold работает с контейнеризированными плагинами и разделяет временный каталог с другими процессами (например, при использовании параметра PrivateTmp в systemd).

  • plugin_file_uid — необязательный числовой параметр. UID пользователя директорий и исполняемых файлов плагинов, если они принадлежат пользователю, отличному от того, кто запускает Stronghold.

  • plugin_file_permissions — необязательный строковый параметр. Строка в восьмеричном формате, определяющая права доступа к директориям и исполняемым файлам плагинов, если для группы или других пользователей заданы права на запись или выполнение.

  • telemetry — необязательный блок. Определяет систему телеметрии для сбора и передачи статистики.

  • default_lease_ttl — необязательный строковый параметр. Время жизни токенов и секретов по умолчанию.
    Задаётся с суффиксом времени (например, "40s" или "1h") и не может превышать max_lease_ttl.
    Значение по умолчанию — 768h.

  • max_lease_ttl — необязательный строковый параметр. Максимальное время жизни токенов и секретов.
    Может быть переопределено для отдельных точек монтирования через флаг max-lease-ttl в командах auth или secret.
    Значение по умолчанию — 768h.

  • default_max_request_duration — необязательный строковый параметр. Максимальное стандартное время выполнения запроса, после которого Stronghold его отменяет.
    Задаётся с суффиксом времени (например, "40s" или "1h").
    Может быть переопределено для каждого listener через параметр max_request_duration.
    Значение по умолчанию — 90s.

  • detect_deadlocks — необязательный строковый параметр. Список значений через запятую, определяющий блокировки, которые Stronghold отслеживает для выявления возможных взаимоблокировок.
    Поддерживаются значения: statelock, quotas, expiration.
    При срабатывании будет записано "POTENTIAL DEADLOCK:" в лог.
    Включение опции может негативно повлиять на производительность.
    По умолчанию параметр не задан ("").

  • raw_storage_endpoint — необязательный логический параметр. Включает эндпоинт sys/raw с высоким уровнем привилегий, позволяющий выполнять шифрование и дешифрование данных напрямую.
    По умолчанию — false.

  • introspection_endpoint — необязательный логический параметр. Включает эндпоинт sys/internal/inspect, который позволяет проводить инспекцию подсистем Stronghold пользователям с root-токеном или правами sudo.
    По умолчанию — false.

  • ui — необязательный логический параметр. Активирует встроенный веб-интерфейс Stronghold, доступный на всех слушателях (адрес + порт) по пути /ui.
    При обращении к стандартному API Stronghold браузер будет перенаправлен на интерфейс.
    По умолчанию — false. Подробнее см. раздел Секция ui.

  • pid_file — необязательный строковый параметр. Путь к файлу, в котором Stronghold сохраняет идентификатор процесса (PID).

  • enable_response_header_hostname — необязательный логический параметр. Добавляет HTTP-заголовок X-Vault-Hostname во все ответы Stronghold.
    В нём указывается имя узла, обработавшего запрос.
    Заголовок добавляется, если имя хоста удалось определить.
    По умолчанию — false.

  • enable_response_header_raft_node_id — необязательный логический параметр. Добавляет HTTP-заголовок X-Vault-Raft-Node-ID во все ответы Stronghold.
    При использовании встроенного хранилища (кластер Raft) заголовок содержит идентификатор узла Raft.
    Если узел не участвует в кластере, заголовок не добавляется.
    По умолчанию — false.

  • log_level — необязательный строковый параметр. Определяет уровень логирования.
    Доступные значения: trace, debug, info, warn, error.
    Можно задать через переменную окружения VAULT_LOG_LEVEL.
    По умолчанию — info.

    При получении сигнала SIGHUP (sudo kill -s HUP <pid Stronghold>) уровень логирования обновляется, игнорируя флаги CLI и переменные окружения.
    Однако не все подсистемы (например, плагины secrets/auth) поддерживают динамическое обновление уровня.

  • log_format — необязательный строковый параметр. Формат вывода логов.
    Поддерживаются значения: standard и json.
    По умолчанию — standard.

  • log_file — необязательный строковый параметр. Абсолютный путь для записи логов Stronghold.
    Если путь заканчивается разделителем, используется имя файла по умолчанию — vault.log.
    Если путь без расширения, используется .log.
    При перезаписи файла Stronghold добавляет временную метку к имени.

  • log_rotate_duration — необязательный строковый параметр. Максимальная продолжительность записи в файл лога перед его ротацией.
    Значение задаётся с суффиксом времени (например, 40s).
    По умолчанию — 24h.

  • log_rotate_bytes — необязательный числовой параметр. Лимит размера лога (в байтах), после которого выполняется ротация.
    Если параметр не задан, ограничений нет.

  • log_rotate_max_files — необязательный числовой параметр. Количество сохраняемых старых файлов логов.
    Значение по умолчанию — 0 (файлы не удаляются).
    Значение -1 — удалять старые файлы при создании новых.

  • imprecise_lease_role_tracking — необязательный логический параметр.
    Позволяет отключить точный подсчёт аренды по ролям, если квоты на основе ролей не используются.
    Уменьшает задержки, но при включении квот на основе ролей подсчёт начнётся с нуля.
    По умолчанию — false.

  • experiments — необязательный массив строк. Список экспериментальных функций, активируемых для узла.
    Не используйте экспериментальные функции в production!
    API таких функций может меняться без обратной совместимости.
    Также их можно указать через переменную окружения VAULT_EXPERIMENTS (список через запятую).

Параметры высокой доступности

Для бэкендов, поддерживающих режим высокой доступности (HA), доступны следующие параметры:

  • api_addr — необязательный строковый параметр.
    Определяет адрес, который будет анонсироваться другим серверам Stronghold в кластере для перенаправления клиентов.
    Также используется бэкендами плагинов.
    Может быть задан через переменную окружения VAULT_API_ADDR.
    Обычно указывается полный URL, соответствующий адресу слушателя (listener).
    Адрес может быть динамически определён с помощью шаблона go-sockaddr, который разрешается во время выполнения.

  • cluster_addr — необязательный строковый параметр.
    Определяет адрес, который Stronghold будет анонсировать другим серверам в кластере для перенаправления запросов.
    Может быть задан через переменную окружения VAULT_CLUSTER_ADDR.
    Как и api_addr, указывается полный URL, однако Stronghold игнорирует схему (TLS всегда используется всеми участниками кластера).
    Адрес может быть динамически определён с помощью шаблона go-sockaddr, который разрешается во время выполнения.

  • disable_clustering — необязательный логический параметр.
    Управляет включением функций кластеризации (например, переадресации запросов).
    Если указано true, функции кластеризации будут отключены для активного узла.
    Для хранилища типа raft этот параметр не может быть установлен в true.
    По умолчанию — false.

Секция listener

Секция listener определяет адреса и порты, на которых Stronghold принимает запросы.
Поддерживаются два типа слушателей:

  1. TCP.
  2. Unix Domain Socket.

TCP

TCP-слушатель настраивает Stronghold на приём соединений по указанному TCP-адресу и порту.

listener "tcp" {
  address = "127.0.0.1:8200"
}

Секцию listener можно задать несколько раз, чтобы Stronghold одновременно прослушивал несколько интерфейсов. При использовании нескольких слушателей обязательно указывайте параметры api_addr и cluster_addr, чтобы Stronghold анонсировал другим узлам корректный адрес.

Сокрытие конфиденциальных данных для неаутентифицированных эндпоинтов

Неаутентифицированные API-эндпоинты могут раскрывать конфиденциальную информацию:

  1. Версию Stronghold.
  2. Дату сборки бинарного файла.
  3. Имя кластера Stronghold.
  4. IP-адреса узлов кластера.

Stronghold позволяет настроить каждую секцию tcp listener так, чтобы при необходимости исключить эти данные из ответов API.
Удаление чувствительной информации на основе конфигурации listener поддерживают следующие API-эндпоинты:

  1. /sys/health
  2. /sys/leader
  3. /sys/seal-status

Удалённые значения Stronghold заменяет пустой строкой ("").
Некоторые API Stronghold опускают ключи в ответе, если их значения равны "".

Удаление значений влияет на ответы для всех клиентов API.
Это означает, что изменения затронут как вывод в CLI и веб-интерфейсе Stronghold, так и прямые вызовы API.

Пользовательские заголовки ответов

Stronghold поддерживает настройку пользовательских HTTP-заголовков ответов для корневого пути (/) и эндпоинтов API (/v1/).
Заголовки задаются в зависимости от возвращаемого кода состояния.
Например, можно определить один набор заголовков для ответа с кодом 200 и другой — для ответа с кодом 307.

Для пользовательского интерфейса предусмотрен отдельный эндпоинт /sys/config/ui, через который можно задать UI-специфичные заголовки.
Однако если заголовок уже определён в конфигурационном файле, изменить его через API нельзя.
Чтобы удалить или изменить такой заголовок, необходимо обновить конфигурационный файл Stronghold и отправить сигнал SIGHUP процессу Stronghold.

Если в конфигурации задан пользовательский заголовок, совпадающий с заголовком, который используется внутренними процессами Stronghold, такой заголовок игнорируется.
Например, нельзя задать заголовки с префиксом X-Vault-. В этом случае при запуске Stronghold зафиксирует соответствующее сообщение в журнале.

Порядок приоритетов

Если один и тот же заголовок указан как в конфигурационном файле, так и через эндпоинт API /sys/config/ui, приоритет отдаётся заголовку из конфигурационного файла. Например, заголовок Content-Security-Policy по умолчанию определён в эндпоинте API /sys/config/ui. Однако если этот же заголовок прописан в конфигурационном файле, Stronghold использует именно его, подставляя в ответ вместо значения по умолчанию в /sys/config/ui.

Параметры слушателя TCP

  • address — строковый параметр в формате ip:порт. Определяет адрес и порт, на которых Stronghold принимает входящие подключения.
    Может быть задан динамически с помощью шаблона go-sockaddr.

  • cluster_address — строковый параметр в формате ip:порт. Указывает адрес и порт для сервер-серверного взаимодействия в кластере.
    По умолчанию используется порт, на единицу больше значения address.
    Обычно параметр не требуется, но может быть полезен, если узлы Stronghold должны взаимодействовать через балансировщик нагрузки или по другой схеме связи.
    Может быть задан через шаблон go-sockaddr.

  • http_idle_timeout — строковый параметр. Максимальное время ожидания следующего запроса при keep-alive.
    Если значение равно 0, используется http_read_timeout. Если и он равен 0, применяется http_read_header_timeout.

  • http_read_header_timeout — строковый параметр. Время, выделенное на чтение заголовков запроса.

  • http_read_timeout — строковый параметр. Максимальная продолжительность чтения запроса целиком (заголовки + тело).

  • http_write_timeout — строковый параметр. Максимальная продолжительность записи ответа.
    Сбрасывается при чтении заголовка нового запроса.
    Значение по умолчанию — 0 (без ограничения).

  • max_request_size — целочисленный параметр. Максимальный размер запроса в байтах.
    По умолчанию — 32 МБ. Значение <0 отключает ограничение.

  • max_request_duration — строковый параметр. Максимальное время обработки запроса для данного слушателя.
    Переопределяет глобальное значение default_max_request_duration.

  • proxy_protocol_behavior — строковый параметр. Включает поддержку PROXY protocol v1. Возможные значения:
    • use_always — всегда использовать IP клиента.
    • allow_authorized — использовать IP клиента, если исходный IP в списке.
    • proxy_protocol_authorized_addrs — использовать IP клиента, если он не в списке.
    • deny_unauthorized — отклонять соединения с IP, не входящими в proxy_protocol_authorized_addrs.
  • proxy_protocol_authorized_addrs — строковый параметр или массив строк. Список разрешённых IP-адресов источников для PROXY.
    Не требуется, если proxy_protocol_behavior=use_always. Значение не может быть пустым.

  • redact_addresses — логический параметр. При true скрывает значения leader_address и cluster_leader_address в ответах API.

  • redact_cluster_name — логический параметр. При true скрывает значение cluster_name в ответах API.

  • redact_version — логический параметр. При true скрывает version и build_date в ответах API.

  • tls_disable — логический параметр. Отключает TLS.
    По умолчанию TLS включён. Отключение может повлиять на работу интерфейса и безопасность.

  • tls_cert_file — строковый параметр. Путь к TLS-сертификату в формате PEM.
    Для использования ЦС необходимо объединить основной сертификат и сертификат ЦС (основной должен быть первым).
    Изменение пути во время работы Stronghold не применяется.

  • tls_key_file — строковый параметр. Путь к приватному ключу (PEM).
    Если ключ зашифрован, при запуске потребуется парольная фраза.
    При перезагрузке через SIGHUP пароль должен совпадать.

  • tls_min_version — строковый параметр. Минимальная версия TLS ("tls10", "tls11", "tls12", "tls13").
    TLS 1.1 и ниже считаются небезопасными и не рекомендуются.

  • tls_max_version — строковый параметр. Максимальная версия TLS ("tls10", "tls11", "tls12", "tls13").
    TLS 1.1 и ниже считаются небезопасными.

  • tls_cipher_suites — строковый параметр. Список поддерживаемых шифров (через запятую).
    Применяется только для TLSv1.2 и ниже.
    Подробнее см. Go TLS cipher suites.

  • tls_require_and_verify_client_cert — логический параметр. Включает обязательную проверку клиентских сертификатов.

  • tls_client_ca_file — строковый параметр. Путь к сертификату ЦС (PEM) для проверки клиентских сертификатов.

  • tls_disable_client_certs — логический параметр. Отключает проверку клиентских сертификатов.
    По умолчанию — false.

    Внимание. Взаимоисключает параметр tls_require_and_verify_client_cert.

  • x_forwarded_for_authorized_addrs — строка или массив строк. Список доверенных CIDR-адресов источников для заголовка X-Forwarded-For.
    Включает поддержку X-Forwarded-For.

  • x_forwarded_for_hop_skips — строковый параметр. Количество адресов, которые следует пропустить с конца заголовка X-Forwarded-For.

  • x_forwarded_for_reject_not_authorized — логический параметр. При false игнорирует заголовок X-Forwarded-For от неавторизованных адресов вместо отклонения соединения.

  • x_forwarded_for_reject_not_present — логический параметр. При false разрешает соединение без заголовка X-Forwarded-For.

  • disable_replication_status_endpoints — логический параметр. При true отключает эндпоинты статуса репликации.

Параметры telemetry:

  • unauthenticated_metrics_access — логический параметр. При установке значения true разрешает неаутентифицированный доступ к эндпоинту /v1/sys/metrics.

Параметры profiling:

  • unauthenticated_pprof_access — логический параметр. При установке значения true разрешает неаутентифицированный доступ к эндпоинту /v1/sys/pprof.

Параметры inflight_requests_logging:

  • unauthenticated_in_flight_requests_access — логический параметр. При установке значения true разрешает неаутентифицированный доступ к эндпоинту /v1/sys/in-flight-req.

Параметры custom_response_headers default:

Список сопоставлений типа:

{
  "ключ1" = ["значение1", "значение 2", ...],
  "ключ2" = ["значение1", "значение 2", ...],
}

позволяет сопоставить имена заголовков по умолчанию с массивом значений. Заголовки по умолчанию устанавливаются на всех эндпоинтах независимо от значения кода состояния.

Список сопоставлений типа:

{
  "ключ1" = ["значение1", "значение 2", ...],
  "ключ2" = ["значение1", "значение 2", ...],
}

позволяет сопоставить имена заголовков с массивом значений. Заголовки, указанные в этой секции устанавливаются для указанных кодов состояния.

Список сопоставлений типа:

{
  "ключ1" = ["значение1", "значение 2", ...],
  "ключ2" = ["значение1", "значение 2", ...],
}

позволяет сопоставить имена заголовков с массивом значений. Заголовки, указанные в этой секции устанавливаются для кодов состояния, попадающих в указанные группы кодов состояния.

Примеры конфигурации секции listener tcp

Пример 1. Указание необходимых параметров для TLS.

Указание сертификата и ключа для TLS:

listener "tcp" {
  tls_cert_file = "/etc/certs/tls.crt"
  tls_key_file  = "/etc/certs/tls.key"
}

Пример 2. Прослушивание на нескольких интерфейсах.

Прослушивание Stronghold на частном интерфейсе, а также localhost:

listener "tcp" {
  address = "127.0.0.1:8200"
}

listener "tcp" {
  address = "10.0.0.5:8200"
}

# Advertise the non-loopback interface
api_addr = "https://10.0.0.5:8200"
cluster_addr = "https://10.0.0.5:8201"

Пример 3. Разрешение неаутентифицированного доступа к метрикам:

listener "tcp" {
  telemetry {
    unauthenticated_metrics_access = true
  }
}

Пример 4. Разрешение неаутентифицированного доступа к профилированию:

listener "tcp" {
  profiling {
    unauthenticated_pprof_access = true
    unauthenticated_in_flight_request_access = true
  }
}

Пример 5. Настройка пользовательских HTTP-заголовков ответов.

Операторы могут настроить подсекцию custom_response_headers в секции listener для добавления пользовательских HTTP-заголовков, соответствующих их приложениям:

listener "tcp" {
  custom_response_headers {
    "default" = {
      "Strict-Transport-Security" = ["max-age=31536000","includeSubDomains"],
      "Content-Security-Policy" = ["connect-src https://clusterA.vault.external/"],
      "X-Custom-Header" = ["Custom Header Default Value"],
    },
    "2xx" = {
      "Content-Security-Policy" = ["connect-src https://clusterB.vault.external/"],
      "X-Custom-Header" = ["Custom Header Value 1", "Custom Header Value 2"],
    },
    "301" = {
      "Strict-Transport-Security" = ["max-age=31536000"],
      "Content-Security-Policy" = ["connect-src https://clusterC.vault.external/"],
    },
  }
}

Примеры пользовательских HTTP-заголовков — Strict-Transport-Security и Content-Security-Policy. Их можно настроить для усиления безопасности приложения, которое взаимодействует с эндпоинтами Stronghold. Сканеры уязвимостей часто исследуют такие связанные с безопасностью HTTP-заголовки. Также можно настроить и специфические для приложения пользовательские заголовки, как настроен X-Custom-Header в примере выше.

Если заголовок определён в нескольких подразделах кодов состояния, будет возвращён заголовок, соответствующий наиболее конкретному коду ответа. Из примера конфигурации ниже, ответ 306 вернёт значение заголовка Custom для 3xx, а 307 вернёт значение заголовка Custom для 307:

listener "tcp" {
  custom_response_headers {
    "default" = {
       "X-Custom-Header" = ["default Custom header value"]
    },
    "3xx" = {
       "X-Custom-Header" = ["3xx Custom header value"]
    },
    "307" = {
       "X-Custom-Header" = ["307 Custom header value"]
    }
  }
}

Пример 6. Прослушивание на всех IPv4- и IPv6-интерфейсах.

Stronghold прослушивает все интерфейсы IPv4 и IPv6, включая localhost:

listener "tcp" {
  address         = "[::]:8200"
  cluster_address = "[::]:8201"
}

Пример 7. Прослушивание на определённых IPv6-адресах.

Использование только IPv6 с привязкой к интерфейсу с IP-адресом 2001:1c04:90d:1c00:a00:27ff:fefa:58ec:

listener "tcp" {
  address         = "[2001:1c04:90d:1c00:a00:27ff:fefa:58ec]:8200"
  cluster_address = "[2001:1c04:90d:1c00:a00:27ff:fefa:58ec]:8201"
}

Указание не loopback-интерфейса:

api_addr = "https://[2001:1c04:90d:1c00:a00:27ff:fefa:58ec]:8200"
cluster_addr = "https://[2001:1c04:90d:1c00:a00:27ff:fefa:58ec]:8201"

Примеры скрытия информации

Пример 1. Конфигурация с использованием параметров redact_addresses, redact_cluster_name и redact_version для скрытия информации в ответах:

ui            = true
cluster_addr  = "https://127.0.0.1:8201"
api_addr      = "https://127.0.0.1:8200"
disable_mlock = true

storage "raft" {
  path = "/path/to/raft/data"
  node_id = "raft_node_1"
}

listener "tcp" {
  address             = "127.0.0.1:8200",
  tls_cert_file = "/path/to/full-chain.pem"
  tls_key_file  = "/path/to/private-key.pem"
  redact_addresses    = "true"
  redact_cluster_name = "true"
  redact_version      = "true"
}

telemetry {
  statsite_address = "127.0.0.1:8125"
  disable_hostname = true
}

Пример 2. Результаты применения параметров скрытия API: /sys/health.

Пример вызова /sys/health/, где скрыты cluster_name и version. Поле cluster_name полностью исключено из ответа, а version представлено пустой строкой (""):

$ curl -s https://127.0.0.1:8200/v1/sys/health | jq

{
  "initialized": true,
  "sealed": false,
  "standby": false,
  "performance_standby": false,
  "replication_performance_mode": "disabled",
  "replication_dr_mode": "disabled",
  "server_time_utc": 1715935559,
  "version": "",
  "cluster_id": "be574716-e7e9-a950-ee34-d62d56cd6d4a"
}

Пример 3. Результаты применения параметров скрытия API: sys/leader.

Пример вызова /sys/leader/, где скрыты leader_address и leader_cluster_address. Они установлены в пустую строку (""):

$ curl -s https://127.0.0.1:8200/v1/sys/leader | jq

{
  "ha_enabled": true,
  "is_self": true,
  "active_time": "2024-05-13T07:54:20.471072843Z",
  "leader_address": "",
  "leader_cluster_address": "",
  "performance_standby": false,
  "performance_standby_last_remote_wal": 0,
  "raft_committed_index": 78,
  "raft_applied_index": 78
}

Пример 4. Результаты применения параметров скрытия API: sys/seal-status.

Пример вызова /sys/seal-status/, где скрыты поля cluster_name, build_date и version. Поле cluster_name полностью исключено из ответа, а build_date и version представлены пустыми строками (""):

$ curl -s https://127.0.0.1:8200/v1/sys/seal-status | jq

{
  "type": "shamir",
  "initialized": true,
  "sealed": false,
  "t": 3,
  "n": 6,
  "progress": 0,
  "nonce": "",
  "version": "",
  "build_date": "",
  "migration": false,
  "cluster_id": "be574716-e7e9-a950-ee34-d62d56cd6d4a",
  "recovery_seal": false,
  "storage_type": "raft"
}

Пример 5. CLI: stronghold status.

Команда CLI stronghold status использует эндпоинты, которые поддерживают скрытие данных, поэтому в выводе скрываются Version, Build Date, HA Cluster и Active Node Address.

Version, Build Date и HA Cluster показывают n/a, потому что соответствующий эндпоинт вернул пустую строку. В свою очередь Active Node Address показывается как <none>, потому что адрес был опущен в ответе API:

stronghold status

Key                     Value
---                     -----
Seal Type               shamir
Initialized             true
Sealed                  false
Total Shares            6
Threshold               3
Version                 n/a
Build Date              n/a
Storage Type            raft
HA Enabled              true
HA Cluster              n/a
HA Mode                 active
Active Since            2024-05-13T07:54:20.471072843Z
Active Node Address     <none>
Raft Committed Index    78
Raft Applied Index      78

Unix

Конфигурация слушателя Unix настраивает Stronghold на прослушивание на указанном Unix доменном сокете:

listener "unix" {
  address = "/run/vault.sock"
}

Секцию listener можно указать несколько раз, чтобы Stronghold одновременно прослушивал несколько сокетов.

Параметры слушателя Unix

  • address — обязательный строковый параметр. Указывает адрес для привязки Unix-сокета.

  • socket_mode — необязательный строковый параметр. Изменяет права доступа и специальные флаги Unix-сокета.

  • socket_user — необязательный строковый параметр. Изменяет пользователя-владельца Unix-сокета.

  • socket_group — необязательный строковый параметр. Изменяет группу-владельца Unix-сокета.

Примеры конфигурации секции listener unix

Пример 1. Прослушивание на нескольких сокетах.

Stronghold настроен на прослушивание на указанном сокете и сокете по умолчанию:

listener "unix" {}

listener "unix" {
  address = "/var/run/vault.sock"
}

Пример 2. Прослушивание на нескольких интерфейсах.

Stronghold настроен на прослушивание на указанном Unix-сокете, а также на loopback-интерфейсе:

listener "unix" {
  address = "/var/run/vault.sock"
}

listener "tcp" {
  address = "127.0.0.1:8200"
}

Пример 3. Настройка прав.

Конфигурация прав и владельца — пользователя и группы:

listener "unix" {
  address = "/var/run/vault.sock"
  socket_mode = "644"
  socket_user = "1000"
  socket_group = "1000"
}

Секция storage

Секция storage настраивает бэкенд хранения, который используется для долговременного хранения данных Stronghold.

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

Конфигурация

Бэкенд хранилища настраивается в конфигурационном файле Stronghold через секцию storage:

storage [NAME] {
  [PARAMETERS...]
}

Например:

storage "file" {
  path = "/mnt/vault/data"
}

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

Бэкенд хранения filesystem

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

Бэкенд хранения типа filesystem не поддерживает режим высокой доступности (HA).

Пример конфигурации секции storage с таким бэкендом хранения:

storage "file" {
  path = "/mnt/vault/data"
}
  • path — обязательный строковый параметр. Абсолютный путь к каталогу, где будут храниться данные. Если каталога не существует, Stronghold его создаст.

Бэкенд хранения Raft

Бэкенд интегрированного хранилища (Raft) используется для хранения данных Stronghold. В отличие от других бэкендов хранения, он не работает с одним источником данных: вместо этого все узлы кластера Stronghold будут иметь реплицированную копию данных. Данные реплицируются между всеми узлами с помощью алгоритма консенсуса Raft.

Бэкенд хранения Raft поддерживает режим высокой доступности (HA).

Пример конфигурации секции storage с бэкендом хранения типа Raft:

storage "raft" {
  path = "/path/to/raft/data"
  node_id = "raft_node_1"
}
cluster_addr = "http://127.0.0.1:8201"

При использовании бэкенда интегрированного хранилища нужно указать параметр cluster_addr, то есть адрес и порт, которые будут использоваться для связи между узлами в кластере Raft.

Также при использовании бэкенда интегрированного хранилища нельзя объявлять отдельный бэкенд ha_storage. Рекомендуем установить disable_mlock в значение true и отключить своппинг в системе.

Параметры

Параметры хранилища Raft

  • path — строка. Путь к каталогу файловой системы, где Stronghold хранит данные.
    Может быть переопределён переменной окружения VAULT_RAFT_PATH.

  • node_id — строка. Уникальный идентификатор узла в кластере Raft.
    Может быть переопределён переменной окружения VAULT_RAFT_NODE_ID.

  • performance_multiplier — целое число. Множитель, используемый для масштабирования ключевых временных параметров Raft.
    • Меньшие значения повышают чувствительность и сокращают время выбора master-узла.
    • Большие значения снижают чувствительность и увеличивают задержки.
      По умолчанию используется 5. Значение 1 соответствует наивысшей производительности (рекомендуется для production). Максимум — 10.
  • trailing_logs — целое число. Количество записей журнала, сохраняемых на диске после создания снимка.
    Полезно при больших снимках и высокой нагрузке записи.
    Значение по умолчанию: 10000.

  • snapshot_threshold — целое число. Минимальное количество зафиксированных записей Raft между созданием снимков.
    Увеличение снижает нагрузку на диск, но увеличивает время восстановления после сбоя.
    По умолчанию: 8192.

  • snapshot_interval — целое число. Интервал (в секундах), через который Raft проверяет необходимость создания снимка.
    Значение случайным образом варьируется между указанным интервалом и его удвоенным значением.
    По умолчанию: 120.

  • retry_join — список блоков. Задаёт параметры подключения к другим узлам кластера.
    Используется для поиска master-узла и присоединения к кластеру.
    Можно указать несколько блоков. Подробности см. в разделе Параметры секции retry_join.

  • retry_join_as_non_voter — логический. Если true, узел присоединяется как не голосующий.
    Такой узел не участвует в кворуме, но получает поток репликации.
    Аналогично флагу CLI -non-voter. Может быть переопределён переменной окружения VAULT_RAFT_RETRY_JOIN_AS_NON_VOTER.

  • max_entry_size — целое число. Максимальный размер записи Raft (в байтах).
    Превышение лимита приводит к сбою операции.
    По умолчанию: 1048576.

  • autopilot_reconcile_interval — строка. Интервал, через который автопилот проверяет изменения состояния кластера.
    Например: переход узла из статуса non-voter в voter, признание узла unhealthy или его исключение из конфигурации.
    Задаётся с суффиксом времени, например "40s" или "1h".

  • autopilot_update_interval — строка. Интервал опроса Stronghold для получения актуальной информации о кластере (конфигурация, состояние узлов, статистика).
    Задаётся с суффиксом времени.
    Например: "40s", "1h".

Параметры секции retry-join

  • leader_api_addr — строка. IP-адрес предполагаемого master-узла.

  • leader_tls_servername — строка. Имя сервера TLS, используемое при соединении по HTTPS.
    Должно совпадать с одним из DNS-имён в поле SAN (Subject Alternative Names) TLS-сертификата master-узла.
    Используется для проверки подлинности сертификата и гарантирует подключение именно к нужному серверу.

  • leader_ca_cert_file — строка. Путь к файлу сертификата ЦС предполагаемого master-узла.

  • leader_client_cert_file — строка. Путь к клиентскому сертификату, который узел Raft предъявляет master-узлу при соединении по TLS для подтверждения своей подлинности.

  • leader_client_key_file — строка. Путь к приватному ключу, используемому вместе с клиентским сертификатом для TLS-аутентификации при соединении с master-узлом.

  • leader_ca_cert — строка. Содержимое сертификата ЦС предполагаемого master-узла.

  • leader_client_cert — строка. Содержимое клиентского сертификата, предъявляемого узлом Raft при установлении TLS-соединения с master-узлом.

  • leader_client_key — строка. Содержимое приватного ключа, используемого вместе с клиентским сертификатом для TLS-аутентификации при соединении с master-узлом.

    Каждый блок retry_join может задавать TLS-сертификаты либо в виде путей к файлам, либо в виде их значений.
    Комбинировать оба способа нельзя.
    Если сертификаты передаются как значения, они должны быть указаны одной строкой с использованием \n для переноса строк.

Секция ui

Stronghold предоставляет встроенный веб-интерфейс (UI) для операторов.
С его помощью можно:

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

UI позволяет упростить администрирование Stronghold и выполнять большинство операций без использования CLI.

Активация ui

По умолчанию пользовательский интерфейс Stronghold не активирован. Для его активации установите параметр ui в конфигурации сервера Stronghold в значение true.

ui = true

listener "tcp" {
  # ...
}

Доступ к Stronghold UI

Пользовательский интерфейс работает на том же порту, что и слушатель Stronghold. Для доступа к UI необходимо настроить хотя бы одну секцию listener.

listener "tcp" {
  address = "10.0.1.35:8200"
  ...
}

Пользовательский интерфейс в приведённом примере доступен по URL-адресу https://10.0.1.35:8200/ui/ с любой машины в подсети — при условии отсутствия межсетевых экранов или соответствующей их настройке. Также UI доступен по любой записи DNS, которая разрешается на этот IP-адрес.

Секция user_lockout

Секция user_lockout определяет настройки блокировки пользователей при неудачных попытках входа в Stronghold. Настройки можно применить как глобально — для всех методов аутентификации (userpass, ldap и approle) с использованием общего имени секции user_lockout "all", так и индивидуально — для конкретного метода, указав его имя в секции. Поддерживаются следующие значения: all, userpass, ldap и approle.

Конфигурации, заданные для конкретного метода аутентификации, имеют более высокий приоритет по сравнению с настройками для всех методов аутентификации с использованием общего имени секции user_lockout "all". Если присутствуют обе конфигурации, будут применены параметры, которые относятся к конкретному методу.

Параметры секции user_lockout

  • lockout_threshold — строка. Количество неудачных попыток входа, после которых пользователь блокируется.

  • lockout_duration — строка. Время, на которое пользователь блокируется.
    Значение указывается с суффиксом времени, например "40s" (40 секунд) или "1h" (1 час).

  • lockout_counter_reset — строка. Интервал времени, после которого счётчик неудачных попыток входа сбрасывается, если за этот период новых попыток не было.
    Значение указывается с суффиксом времени.

  • disable_lockout — логический. При true полностью отключает механизм блокировки пользователя.