Настроить хранение чувствительной информации в Vault

Продукты
Все продукты

Вы можете повысить безопасность использования Creatio отказавшись от хранения чувствительных данных в конфигурационных файлах. Для этого можно использовать приложение Vault by HashiCorp, которое позволяет безопасно хранить чувствительные данные и управлять ими. К таким данным относятся:

  • пароли;
  • имена пользователей;
  • ключи API;
  • токены доступа.

Вы можете вынести в защищенное хранилище Vault параметры подключений, которые обычно хранятся в файле ConnectionStrings.config вашего приложения:

  • базы данных Creatio;
  • Quartz (при условии хранения данных в отдельной БД);
  • Redis;
  • s3Connection;
  • ElasticSearch;
  • influx;
  • MessageBroker.

Эту настройку можно выполнять как во время развертывания вашего приложения Creatio, так и для уже работающих сред.

В Vault для хранения чувствительных данных используются секреты (secrets). Они записаны в специальных хранилищах секретов (Secrets Engines). Хранилища бывают различных типов. Для чувствительных данных Creatio необходимо использовать хранилище типа “ключ-значение” (key-value) — KV версии 2. Это позволяет хранить чувствительные данные в виде пар, состоящих из ключа и значения. Значение содержит чувствительную информацию, а ключ необходимо указать в файле ConnectionStrings.config вашего приложения Creatio. Также вы можете хранить в Vault ключи шифрования (AES).

На заметку. Дополнительно в Vault можно настроить сохранение истории изменений пар “ключ-значение”.

Рис. 1 — Схема взаимодействия Creatio и Vault
vault_creatio_scheme.png

Общий порядок подключения и настройки функциональности включает следующие шаги:

  1. Настройки на стороне Vault:

    1. Развертывание и запуск сервера Vault.
    2. Создание секретных ключей.
    3. Настройка политик безопасности.
    4. Настройка параметров авторизации.
  2. Настройки на стороне Creatio:

    1. Настройка параметров подключения к Vault.
    2. Настройка строк подключения ConnectionStrings.config.
    3. Включение признаков.
    4. Перезапуск Creatio.

Рассмотрим эти этапы подробнее.

Настройки на стороне Vault 

Развернуть и запустить сервер Vault 

Перед использованием сервер Vault должен быть запущен в промышленном режиме. Допустимо разворачивать Vault как на отдельном сервере, так и на том же сервере, где развернуты другие элементы инфраструктуры Creatio, руководствуясь общими требованиями к серверам. Это можно сделать как при развертывании Creatio, так и позднее.

Сервер Vault необходимо развернуть на хосте под управлением Linux/Windows таким образом, чтобы было установлено https-соединение. Для этого используйте серверный сертификат, который должен храниться на том же хосте, где развернут сервер. Серверный сертификат может быть выдан и зарегистрирован любым доступным центром сертификации.

Важно. Приватный ключ серверного сертификата необходимо хранить в защищенной папке.

Развертывание и запуск Vault подробно описаны в документации приложения (на английском языке):

  1. Установка.
  2. Настройка.
  3. Первый запуск.
  4. Инициализация после первого запуска.

Важно. Сохраните unseal-ключи и токен, полученные при инициализации. Это позволит убедиться в безопасности запуска и осуществить его от имени администратора.

Действия, которые выполняются каждый раз при перезапуске сервера Vault:

  1. Повторный запуск.
  2. “Распаковка” с использованием unseal-ключей, полученных при инициализации Vault.

Создать хранилище секретных ключей 

Для хранения секретов используется хранилище (secrets engine) типа kv (key/value) версии 2.

В Vault чувствительные данные со всей историей изменений содержатся в специальных хранилищах (Secrets Engines). У каждого хранилища обязательным атрибутом является уникальный путь, который будет использоваться для подключения. Для хранилища, в котором будут содержаться чувствительные данные Creatio, рекомендуем указать в качестве пути имя вашего сайта.

  1. В интерфейсе Vault перейдите в раздел Secrets.
  2. Создайте хранилище секретов (Secrets Engine), в котором будут храниться пары ключей и значений. Рекомендуем называть хранилище SecretsEngine по имени продукта, для которого создаются секреты. Например, Creatio. Подробно создание хранилища рассмотрено в документации Vault (на английском языке).

Хранилище может содержать несколько секретов, каждый из которых будет соответствовать определенной строке подключения или ключу шифрования. Для каждого секрета в хранилище необходимо указать уникальный путь к секрету. Каждый секрет может содержать необходимое количество пар “ключ-значение”, отдельная пара для каждого типа чувствительных данных. Например, если необходимо хранить в Vault логин и пароль, то это будет две пары “ключ-значение”.

Создать секретные ключи  

Чтобы создать секретные ключи для строки подключения к БД в файле ConnectionStrings.config:

  1. В интерфейсе Vault перейдите в раздел Secrets.
  2. Откройте созданное хранилище секретов (Secrets Engine).
  3. Укажите путь к секрету (Path). Для подключения к БД, а также к Redis путь к чувствительным данным должен совпадать с именем соответствующей строки подключения в ConnectionStrings.config. Например, если вы используете PostgreSql, то для строки подключения к БД необходимо указать dbPostgreSql.
  4. Аналогичным способом настройте другие строки подключения, которые содержат секретную информацию.
  5. В каждом секрете, соответствующем строке подключения, создайте все необходимые пары ключ/значение, где ключ будет содержать уникальное имя секрета (рекомендуем давать осмысленное имя, чтобы ключ было легко идентифицировать), а значение — секретную информацию. Для ключей и значений имеет значение регистр.

    В результате путь к созданному секрету имеет вид <secretsEnginePath>/dbPostgreSql, где <secretsEnginePath> — путь к хранилищу секретов, а dbPostgreSql — путь к секрету.

    Важно. При изменении значения секретов в Vault перезапустите Creatio, чтобы они применились.

Рис. 2 — Пример заполнения указанных ключей в Vault
vault_keys.png

В данном примере используются данные из следующей строки файла ConnectionStrings.config:

<add name="dbPostgreSql" connectionString="Pooling=true; Database=SOME_DB_NAME; Host=SOME_DB_HOST; Username=SOME_USER; Password=SOME_PASSWORD; Port=SOME_DB_PORT; Timeout=5; CommandTimeout=400" />

где:

  • DbHost — адрес сервера БД, который соответствует параметру Host со значением SOME_DB_HOST.
  • DbPort — порт сервера БД, который соответствует параметру Port со значением SOME_DB_PORT.
  • DbName — адрес сервера БД, который соответствует параметру Database со значением SOME_DB_NAME.
  • Username — имя пользователя БД, который соответствует параметру Username со значением SOME_USER.
  • Password — пароль пользователя БД, который соответствует параметру Password со значением SOME_PASSWORD.

Подробнее: Versioned Key/Value Secrets Engine, официальная документация Vault (на английском языке).

Настроить политики безопасности 

Так как в Vault может храниться чувствительная информация различного типа, рекомендуем создать отдельные политики безопасности (policies), чтобы разграничить уровни доступа к указанным ключам. Доступ Creatio к хранилищу секретов необходимо ограничить правом на чтение.

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

Настройка политики, которая дает Creatio доступ на чтение всех секретов, определенных в хранилище с путем <secretsEnginePath> случае выглядит следующим образом:

path "<secretsEnginePath>/*" 
{capabilities = ["read", "list"]
}

где <secretsEnginePath> — путь к хранилищу секретов.

Подробнее: Policies (официальная документация Vault на английском языке).

Настроить авторизацию в Vault 

В Creatio вы можете настроить следующие типы авторизации в Vault:

  • по клиентскому сертификату;
  • по токену.

Настроить авторизацию по сертификату 

  1. Выпустите отдельный клиентский сертификат и зарегистрируйте его на хосте, где работает приложение Creatio.
  2. Добавьте сертификат в Vault как метод авторизации.
  3. Укажите политику, которая позволит читать секреты, содержащие информацию из строк подключения.

Подробнее: Auth Methods, официальная документация Vault (на английском языке).

Настроить авторизацию по токену 

При инициализации сервера Vault генерируется токен администратора (Root Token), который строго не рекомендуется использовать для авторизации, поскольку он дает практически неограниченные права. Для авторизации Creatio необходимо сгенерировать клиентский токен с определенными политиками безопасности, которые позволяют читать только секреты, предназначенные для подстановок в строки соединения вашего приложения.

Чтобы сгенерировать клиентский токен, предназначенный для авторизации Creatio в Vault, нужно выполнить команду:

vault token create -policy=<policyName>

где <policyName> — название политики безопасности.

Подробнее: Tokens, Token create - Command, официальная документация Vault (на английском языке).

Настройки на стороне Creatio  

Настроить параметры подключения к Vault 

Настройки подключения к Vault должны быть заданы в секции vaultConfig конфигурационного файла web.config в корневой папке Creatio. Описание параметров данного раздела содержится в таблице ниже:

Название параметра Описание Значение
hostUri Строка, содержащая адрес сервера Vault Формат параметра: https://<адрес сервера Vault>:<порт, на котором развернут сервер Vault>.
authMethodType Тип авторизации Допустимые значения:

Token — авторизация по токену.

Cert — авторизация по сертификату.

secretsEnginePath Путь к хранилищу секретов в Vault В качестве пути рекомендуется использовать имя сайта.
token Строка, содержащая клиентский токен. Задается, если используется авторизация по токену.
certFilePath Путь к сертификату. Задается, если используется авторизация по сертификату.
certPassword Пароль к сертификату. Задается, если для доступа к сертификату используется пароль. Иначе остается пустым ("").

В случае, если в качестве authMethodType задано недопустимое значение, то в работе Creatio возникнет ошибка.

<vaultConfig hostUri="https://127.0.0.1:1024" authMethodType="Token"
token="s.on3zJH6fXZlodRAYqgTXYEot"
secretsEnginePath="<secretsEnginePath>" />
<vaultConfig hostUri="https://127.0.0.1:1024"
authMethodType="Cert"
certFilePath="<path>"
certPassword="<password>"
secretsEnginePath="<secretsEnginePath>" />

где

  • <secretsEnginePath> — путь к хранилищу секретов,
  • <path> — путь к файлу сертификата,
  • <password> — пароль для доступа к сертификату.

Настроить шаблоны строк подключения 

Файл ConnectionStrings.config должен содержать шаблоны строк подключения для замены их секретами из Vault. В шаблонах вместо секретных значений указывается название ключа секрета в квадратных скобках.

Например, если строка подключения содержит значение пароля Password="somePassword", то шаблон строки подключения должен иметь вид Password="[DBPassword]", где DBPassword — название ключа с секретом в Vault.

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

К примеру, если конфигурационный файл содержит строку подключения:

<add name="dbPostgreSql" connectionString="Pooling=true; Database=SOME_DB_NAME; Host=SOME_DB_HOST; Username=SOME_USER; Password=SOME_PASSWORD; Port=SOME_DB_PORT; Timeout=5; CommandTimeout=400" />

То шаблон такой строки может выглядеть следующим образом:

<add name="dbPostgreSql" connectionString="Pooling=true; Database=[DbName]; Host=[DbHost]; Username=[Username]; Password=[Password]; Port=[DbPort]; Timeout=5; CommandTimeout=400" />

где DbHost, DbPort, DbName, Username, Password — ключи соответствующих секретов, хранящихся в Vault.

Включить признаки  

Для настройки строк подключения в конфигурационном файле web.config, который находится в корневой папке Creatio, добавьте следующие строки в секцию <appSettings>:

<add key="UseConnectionStringProvider" value="true" />
<add key="UseSecretsInConnectionStrings" value="true" />

Если вы хотите использоваться также ключи шифрования (AES), то дополнительно выполните следующие настройки:

  1. В конфигурационном файле web.config, который находится в корневой папке Creatio, добавьте следующую строку в секцию <appSettings>:<add key="UseSecretsInEncryptionKeys" value="true" />
  2. В хранилище секретов Vault, имя которого указано в конфигурационном файле в секции vaultConfig → параметр secretsEnginePath, добавьте секрет с названием EncryptionKeys.
  3. В секрет EncryptionKeys добавьте ключи со значениями, которые указаны в конфигурационном файле приложения Creatio:
    • InitializationSecurityVector,
    • CurrentSecurityKey.
  4. Удалите из конфигурационного файла признаки InitializationSecurityVector, CurrentSecurityKey.
Рис. 3 — Пример заполнения ключей
aes_keys.png

Важно. Названия секрета и ключей должны точно соответствовать указанным выше. В случае отключения указанных флагов хранение секретной информации в Creatio при помощи Vault не будет работать корректно.

Перезапустите Creatio, чтобы изменения вступили в силу.

Отключить хранение ключей в Vault 

Если необходимо отключить хранение ключей AES в Vault, то выполните следующие действия:

  1. Добавьте в конфигурационный файл приложения Creatio признаки:
    • InitializationSecurityVector,
    • CurrentSecurityKey.

    Значения данных ключей хранятся в хранилище секретов Vault, имя которого указано в конфигурационном файле в секции vaultConfig → параметр secretsEnginePath → секрет EncryptionKeys:

    <add key="InitializationSecurityVector" value="Значение_ключа_из_Vault" />
    
    <add key="CurrentSecurityKey" value="Значение_ключа_из_Vault" />
  2. В конфигурационном файле приложения Creatio выключите признак UseSecretsInEncryptionKeys:
    <add key="UseSecretsInEncryptionKeys" value="false" />
  3. Перезапустите Creatio, чтобы изменения вступили в силу.