Хранилище секретов

Общие сведения о Хранилище секретов

Termidesk Connect позволяет получать секреты из хранилищ на базе OpenBao или HashiCorp Vault.

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

Termidesk Connect предоставляет возможность настройки параметров подключения к Хранилищу секретов, например к OpenBao, Hashicorp Vault или другому.

Termidesk Connect поддерживает следующие типы Хранилищ секретов:

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

  • ad – AD/LDAP. Позволяет создавать временные учетные записи. Используется для управления динамическими учетными данными (LDAP) и данными аутентификации (AD);

  • pki – PKI. Используется генерации TLS/SSL-сертификатов по запросу. Каждый успешный запрос на выдачу или подпись создает новый уникальный сертификат с собственным закрытым ключом. Ранее выданные сертификаты продолжают действовать до истечения их времени жизни.

Для получения данных из Хранилищ секретов используется специально сформированный URL в следующем формате:

<тип>://<путь>[?<параметры>]#<секрет>

где:

  • <тип> – тип Хранилища секретов (kv, ad или pki);

  • <путь> – путь к секрету;

  • <параметры> – опциональные параметры запроса;

  • <секрет> – имя запрашиваемого секрета.

Примеры формирования URL

Пример 1. Получение секрета из Хранилища секретов kv версии 1.

Если секрет создан командами:

secrets enable -version=1 -path=legacy kv
vault kv put legacy/snmp username="snm-user" auth_key="authkey" priv_key="privkey"

Выполнить HTTP-запрос для чтения секрета:

curl -H "X-Vault-Token: root-token" http://192.0.2.1:8200/v1/legacy/snmp

Ответ в формате JSON:

{
    "request_id": "780cb833-32b7-2dfa-1699-51027d56b542",
    "data": {
        "auth_key": "snmp-authkey",
        "priv_key": "snm-privkey",
        "username": "snm-user2"
    }
}

Правила формирования URL на основе запроса:

  • определить схему: kv://;

  • извлечь путь из URL HTTP-запроса http://192.0.2.1:8200/v1/legacy/snmp, исключив базовую часть http://192.0.2.1:8200/v1/: legacy/snmp;

  • добавить к схеме kv:// полученный путь legacy/snmp: kv://legacy/snmp;

  • указать имя требуемого ключа через символ #:

    • для ключа username: kv://legacy/snmp#username;

    • для ключа auth_key: kv://legacy/snmp#auth_key;

    • для ключа priv_key: kv://legacy/snmp#priv_key.

Пример 2. Получение секрета из Хранилища секретов kv версии 2.

Если секрет создан командой:

vault kv put secret/snmp username="snm-user" auth_key="authkey" priv_key="privkey"

Выполнить HTTP-запрос для чтения секрета:

curl -H "X-Vault-Token: root-token" http://192.0.2.1:8200/v1/secret/data/snmp

Ответ:

{
    "request_id": "780cb833-32b7-2dfa-1699-51027d56b542",
    "data": {
        "data": {
            "auth_key": "snmp-authkey",
            "priv_key": "snm-privkey",
            "username": "snm-user2"
        }
    }
}

Правила формирования URL на основе запроса:

Правила аналогичны kv версии 1, отличие только в пути.
  • определить схему: kv://;

  • извлечь путь из URL HTTP-запроса http://192.0.2.1:8200/v1/secret/data/snmp, исключив базовую часть http://192.0.2.1:8200/v1/: secret/data/snmp;

  • добавить к схеме kv:// полученный путь secret/data/snmp: kv://secret/data/snmp;

  • указать имя требуемого ключа через символ #:

    • для ключа username: kv://secret/data/snmp#username;

    • для ключа auth_key: kv://secret/data/snmp#auth_key;

    • для ключа priv_key: kv://secret/data/snmp#priv_key.

Пример 3. Получение сертификатов из Хранилища секретов pki.

Если PKI и роль настроены через команды:

# Включение PKI
vault secrets enable pki

# Создание роли для выпуска сертификатов
vault secrets enable pki
    vault write pki/roles/example-dot-com \
    allowed_domains="example.com" \
    allow_subdomains=true \
    allow_bare_domains=true \
    max_ttl=72h

Выполнить HTTP-запрос для генерации сертификата:

В теле HTTP-запроса передаются параметры сертификата в формате JSON: {"common_name": "app.example.com", "ttl": "24h"}.

curl -H "X-Vault-Token: token" \
-d '{"common_name": "app.example.com", "ttl": "24h"}' \
http://192.0.2.1:8200/v1/pki/issue/example-dot-com

Ответ:

{
    "request_id": "e86ed1f5-f7bb-1f6a-a864-6a5540c92191",
    "lease_id": "",
    "renewable": false,
    "lease_duration": 0,
        "data": {
        "certificate": "-----BEGIN CERTIFICATE....",
        "issuing_ca": "-----BEGIN CERTIFICATE-----...",
        "private_key": "-----BEGIN RSA PRIVATE KEY-----..."
    },
    "wrap_info": null,
    "warnings": null,
    "auth": null,
    "mount_type": "pki"
}

Правила формирования URL на основе запроса:

  • определить схему: pki://;

  • извлечь путь из URL HTTP-запроса http://192.0.2.1:8200/v1/pki/issue/example-dot-com, исключив базовую часть http://192.0.2.1:8200/v1/: pki/issue/example-dot-com;

  • добавить к схеме pki:// полученный путь pki/issue/example-dot-com: kv://secret/data/snmp;

  • добавить параметры из тела запроса после символа ?: pki://pki/issue/example-dot-com?common_name="app.example.com"&ttl="24h";

    Из JSON-формата {"common_name": "app.example.com", "ttl": "24h"} формируется строка параметров: common_name="app.example.com"&ttl="24h".

  • указать конкретный сертификат или ключ для получения через символ #:

    • для сертификата:

      pki://pki/issue/example-dot-com?common_name="app.example.com"&ttl="24h"#certificate
    • для закрытого ключа:

      pki://pki/issue/example-dot-com?common_name="app.example.com"&ttl="24h"#private_key
    • для сертификата УЦ:

      pki://pki/issue/example-dot-com?common_name="app.example.com"&ttl="24h"#issuing_ca

Настройка подключения к Хранилищу секретов

Настройка подключения к Хранилищу секретов выполняется одним из способов:

Для настройки Хранилища секретов выполнить:

Описание параметров также приведено в подразделе Объект openbao.
  • указание URL-адреса для Хранилища секретов:

Пример значения параметра: http://192.0.2.10:8200
set openbao url <URL-адрес>
  • указание VRF для подключения к Хранилищу секретов (по умолчанию – default):

set openbao vrf <имя_VRF>
  • задание максимально допустимого времени (в секундах) ожидания ответа HTTP-запроса от API-сервера (по умолчанию – 60):

set openbao request-timeout <значение>
  • задание интервала (в секундах) повторной отправки HTTP-запроса при возникновении ошибки (по умолчанию – 10):

set openbao retry-interval <значение>
  • задание интервала (в секундах) обновления токена авторизации (по умолчанию – 3600):

set openbao renew-token-interval <значение>
  • задание интервала (в секундах) обновления секретов (по умолчанию – 1800):

Termidesk Connect с заданной периодичностью будет отправлять запросы в Хранилище секретов для получения новых значений секретов.
set openbao renew-secret-interval <значение>
  • задание интервала (в секундах) обновления сертификатов (по умолчанию – 86400):

Termidesk Connect с заданной периодичностью будет отправлять запросы в Хранилище секретов для получения новых значений сертификатов.
set openbao renew-cert-interval <значение>
  • (опционально) указание пространства имен (Namespace), заданного в Хранилище секретов:

set openbao ns <значение>
  • настройка параметров аутентификации Termidesk Connect в Хранилище секретов:

    • указание пути к методу аутентификации (auth method) в Хранилище секретов:

      set openbao auth mount <значение>
    • задание идентификатора роли (RoleID) для метода аутентификации AppRole:

      set openbao auth approle <значение>
    • указание пути к файлу, содержащему идентификатор секрета (SecretID) или токен для его раскрытия (unwrapping):

      set openbao auth secret-file <значение>
    • указание флага использования упакованного токена (wrapped-token) для идентификатора секрета (SecretID) (по умолчанию – true):

      Возможные значения:

      • true – содержимое файла будет предварительно раскрыто (unwrapped) для получения действительного идентификатора секрета (SecretID);

      • false – содержимое файла будет упаковано (wrapped) для получения действительного идентификатора секрета (SecretID).

      set openbao auth wrapping-token <true/false>
  • (опционально) настройка параметров SSL-подключения к Хранилищу конфигурации:

    • задание файла сертификата УЦ (указывается полный путь и имя файла с расширением):

      Пример значения параметра: /dev/shm/server.cert.
      set openbao ssl ca-cert <имя_файла>
    • задание файла сертификата (указывается полный путь и имя файла с расширением):

      set openbao ssl cert <имя_файла>
    • задание файла ключа (указывается полный путь и имя файла с расширением):

      set openbao ssl key <имя_файла>
  • применение заданных настроек:

commit
  • сохранение настроек:

write