Настройка интеграции с системой управления секретами в окружении Platform V Backend#
HashiCorp Vault используется для управления следующими секретами:
сертификатами для обработки входящих и исходящих запросов с mTLS (ingress / egress);
сертификатами для mTLS подключения к БД;
учетными данными для подключения к БД;
сертификатами для mTLS подключения к OTT;
сертификатами для mTLS подключения к Kafka компонента журналирования.
Потребители
Единица развертывания |
Контейнер |
Используемые секреты |
Engine секретов в Vault |
Обновление при изменении |
|---|---|---|---|---|
ingress |
istio-proxy |
Серверный сертификат |
|
да |
Сертификаты доверенных УЦ |
|
да |
||
ott-sidecar |
Клиентский сертификат OTTS |
|
да |
|
Сертификаты доверенных УЦ |
|
да |
||
fluent-bit-sidecar |
Клиентский сертификат |
|
нет |
|
Сертификаты доверенных УЦ |
|
нет |
||
egress |
istio-proxy |
Клиентский сертификат |
|
да |
Сертификаты доверенных УЦ |
|
да |
||
ott-sidecar |
Клиентский сертификат OTTS |
|
нет |
|
Сертификат сервера OTTS |
|
нет |
||
Сертификаты доверенных УЦ |
|
да |
||
fluent-bit-sidecar |
Клиентский сертификат |
|
нет |
|
Сертификаты доверенных УЦ |
|
нет |
||
docgen-service |
docgen-service |
Не использует |
||
fluent-bit-sidecar |
Не использует |
|||
istio-proxy |
Не использует |
|||
template-provider |
template-provider |
Клиентский сертификат для подключения к БД |
|
да |
Сертификаты доверенных УЦ |
|
да |
||
Учетные данные для подключения к БД |
|
да |
||
fluent-bit-sidecar |
Не использует |
|||
istio-proxy |
Не использует |
|||
template-registry |
template-registry |
Клиентский сертификат для подключения к БД |
|
да |
Сертификаты доверенных УЦ |
|
да |
||
Учетные данные для подключения к БД |
|
да |
||
fluent-bit-sidecar |
Не использует |
|||
istio-proxy |
Не использует |
В случае интеграции с HashiCorp Vault потребуется:
установленный и настроенный HashiCorp Vault;
установленный и настроенный HashiCorp Vault Agent Injector в среде контейнеризации Kubernetes или Openshift;
получить необходимые привилегии для управления в HashiCorp Vault;
Необходимо учесть, что injector при запуске подхватывает значения runAsUser/runAsGroup из первого поднятого контейнера. В случае получения ошибки 403 на доступ к файлам секретов, требуется установить значение параметра holdApplicationUntilProxyStarts в false
подготовить секреты в зависимости от выбранного engine;
настроить возможность аутентификации Vault Agent из namespace DCGN среды контейнеризации Kubernetes или Openshift;
внести изменения в конфигурацию DCGN для настройки параметров интеграции;
если ранее был установлен DCGN без интеграции с системой управления секретами, то перед установкой необходимо очистить namespace от ранее созданных секретов.
Примечание. Для удаления секретов из namespace можно использовать playbook OPENSHIFT_DEL_RES Security job компонента Deploy Tools. Необходимо настроить файл openshift_del_res.conf на удаление секретов из проекта DCGN, пример:
openshift_del_res.project.1.cluster = none openshift_del_res.project.1.projects = project_DCGN # удаление secrets openshift_del_res.delete.projects.secrets = onПодробнее о работе и настройке job читайте в документации компонента Deploy Tools.
Настройки для конфигурации#
Наименование параметра в файле конфигурирования |
Описание параметра |
Значение по умолчанию или глобальные параметры при установке Deploy tools |
Версия ПО |
|---|---|---|---|
Файл dcgn.all.conf |
|||
dcgn.vault.agent.enabled |
Переключатель интеграции с HashiCorp Vault |
false |
1.3 |
Настройки для подключения к HashiCorp Vault |
|||
dcgn.vault.protocol |
Протокол |
1.3 |
|
dcgn.vault.host |
Хост |
1.3 |
|
dcgn.vault.port |
Порт |
1.3 |
|
dcgn.vault.egress.gw.port |
Egress gateway порт |
8550 |
1.3 |
Настройки vault-agent |
|||
dcgn.vault.tenant |
Имя ресурса проекта (тенант) / пространство секретов |
1.3 |
|
dcgn.vault.role |
Имя роли для доступа к секретам |
1.3 |
|
dcgn.vault.client-max-retries |
Количество повторных попыток при возникновении ошибок |
2 |
1.3 |
dcgn.vault.log-level |
Уровень детализации журнала агента |
info |
1.3 |
dcgn.vault.log-format |
Форматирование журнала |
standard |
1.3 |
Секреты |
|||
dcgn.vault.secret.pki.baseEngineMountPath |
Базовый путь engine PKI. Требуется указать значение в соответствии с конфигурацией стенда |
1.4 |
|
dcgn.vault.secret.kv.baseEngineMountPath |
Базовый путь engine KV Secrets Engine. Требуется указать значение в соответствии с конфигурацией стенда |
A/ST/BD/CORE/DCGN/ |
1.4 |
dcgn.vault.secret.pki.ott.baseEngineMountPath |
Базовый путь до SecMan для OTT. Требуется указать значение в соответствии с конфигурацией стенда |
4.0.0 |
|
dcgn.vault.secret.rootCertsPath |
Полный путь к хранилищу KV с доверенными сертификатами. Требуется указать значение в соответствии с конфигурацией стенда |
1.4.1 |
|
dcgn.vault.secret.truststore.pem |
Ключ доверенных сертификатов PEM |
truststore_pem |
1.4.1 |
dcgn.ose.configmap.certificate.client.cn |
CN клиентского сертификата. Требуется указать значение в соответствии с конфигурацией стенда |
1.4.1 |
|
dcgn.ose.configmap.certificate.server.cn |
CN серверного сертификата |
1.4 |
|
dcgn.ose.configmap.certificate.ott.cn |
CN сертификата для OTT |
1.4 |
|
dcgn.ose.configmap.vault.hashicorp.com.secret.engine.pki.name |
Имя/путь engine PKI |
PKI/ |
1.4 |
dcgn.ose.configmap.vault.hashicorp.com.secret.engine.pki.client.role |
Роль для выпуска клиентских сертификатов. Требуется указать значение в соответствии с конфигурацией стенда |
1.4 |
|
dcgn.ose.configmap.vault.hashicorp.com.secret.engine.pki.server.role |
Роль для выпуска серверных сертификатов. Требуется указать значение в соответствии с конфигурацией стенда |
1.4 |
|
dcgn.ose.configmap.vault.hashicorp.com.secret.engine.pki.ott.role |
Роль для выпуска сертификатов OTT. Требуется указать значение в соответствии с конфигурацией стенда |
1.4.1 |
|
dcgn.vault.secret.egress.certs.path |
Путь к сертификатам egress |
fetch/ common_name= format=pem |
1.4 |
dcgn.vault.secret.ingress.certs.path |
Путь к сертификатам ingress |
fetch/ common_name= format=pem |
1.4 |
dcgn.vault.secret.ott.certs.path |
Полный путь до секрета с сертификатом для OTT |
fetch/ common_name= format=pem |
1.4 |
dcgn.vault.secret.db.postgres.certs.path |
Путь к сертификатам для подключения к БД PostgreSQL |
fetch/ common_name= format=pem |
3.0.0.0 |
dcgn.vault.secret.db.postgres.credentials.path |
Путь к учетным данным для подключения к БД PostgreSQL |
KV/db/creds |
1.3 |
dcgn.vault.secret.db.postgres.credentials.userProperty |
Имя свойства учетных данных, описывающего пользователя для БД |
username |
1.3 |
dcgn.vault.secret.db.postgres.credentials.passwordProperty |
Имя свойства учетных данных, описывающего пароль для БД |
password |
1.3 |
Пути к сертификатам, в случае использования HashiCorp Vault для hotreload fluent-bit |
|||
dcgn.vault.secret.kafka.pki.path |
Путь к хранилищу PKI с сертификатом для kafka. Требуется указать значение в соответствии с конфигурацией стенда |
/ |
4.0.0 |
dcgn.vault.secret.kafka.kv.ca.path.secret |
Путь к хранилищу KV с доверенными сертификатами. Требуется указать значение в соответствии с конфигурацией стенда |
/ |
4.0.0 |
dcgn.vault.secret.kafka.cacert |
Путь к корневому сертификату для аутентификации в kafka. Требуется указать значение в соответствии с конфигурацией стенда |
$__vault{kv::ca.pem} |
4.0.0 |
dcgn.vault.secret.kafka.sslcert |
Путь к секрету с сертификатом для аутентификации в kafka. Требуется указать значение в соответствии с конфигурацией стенда |
$__vault{pki::::certificate} |
4.0.0 |
dcgn.vault.secret.kafka.sslkey |
Путь к секрету с приватным ключом для аутентификации в kafka. Требуется указать значение в соответствии с конфигурацией стенда |
$__vault{pki::::private_key} |
4.0.0 |
Файл dcgn.istio.all.conf |
|||
dcgn.ose.istio.egress.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-cpu |
Запрашиваемый объем ресурсов ЦП |
50m |
1.3 |
dcgn.ose.istio.ingress.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-cpu |
Запрашиваемый объем ресурсов ЦП |
50m |
1.3 |
dcgn.ose.istio.egress.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-mem |
Запрашиваемый объем ресурсов оперативной памяти |
64Mi |
1.3 |
dcgn.ose.istio.ingress.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-mem |
Запрашиваемый объем ресурсов оперативной памяти |
64Mi |
1.3 |
dcgn.ose.istio.egress.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-cpu |
Лимит ресурсов ЦП |
100m |
1.3 |
dcgn.ose.istio.ingress.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-cpu |
Лимит ресурсов ЦП |
100m |
1.3 |
dcgn.ose.istio.egress.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-mem |
Лимит ресурсов оперативной памяти |
128Mi |
1.3 |
dcgn.ose.istio.ingress.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-mem |
Лимит ресурсов оперативной памяти |
128Mi |
1.3 |
Файлы dcgn.template-provider.conf |
|||
dcgn.template-provider.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-cpu |
Запрашиваемый объем ресурсов ЦП |
50m |
1.3 |
dcgn.template-provider.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-mem |
Запрашиваемый объем ресурсов оперативной памяти |
64Mi |
1.3 |
dcgn.template-provider.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-cpu |
Лимит ресурсов ЦП |
100m |
1.3 |
dcgn.template-provider.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-mem |
Лимит ресурсов оперативной памяти |
128Mi |
1.3 |
Файлы dcgn.template-registry.conf |
|||
dcgn.template-registry.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-cpu |
Запрашиваемый объем ресурсов ЦП |
50m |
1.3 |
dcgn.template-registry.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-mem |
Запрашиваемый объем ресурсов оперативной памяти |
64Mi |
1.3 |
dcgn.template-registry.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-cpu |
Лимит ресурсов ЦП |
100m |
1.3 |
dcgn.template-registry.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-mem |
Лимит ресурсов оперативной памяти |
128Mi |
1.3 |
Для выпуска сертификатов с использованием engine PKI, путь к сертификатам задается в виде <pki_path>/issue/<role> <parameters>, где:
pki_path– путь до engine PKI;role– имя роли;parameters– список параметров разделенные пробелом, указываются парой ключ=значение.
Примеры:
dcgn.vault.secret.ingress.certs.path=pki/issue/dcgn common_name=<hostname> format=pem ttl=12h
dcgn.vault.secret.db.postgres.certs.path=pki/issue/dcgn common_name=<имя пользователя> format=pem
В DCGN поддерживается конфигурация engine секретов kv и pki, но по умолчанию поставляется конфигурация для engine pki.
Чтобы изменить engine в конфигурации необходимо для каждого path параметра секрета сменить формат pki на kv.
Например:
dcgn.vault.secret.db.postgres.certs.path={{ lookup('custom_vars', 'dcgn.vault.secret.pki.baseEngineMountPath') }}{{ lookup('custom_vars', 'dcgn.ose.configmap.vault.hashicorp.com.secret.engine.pki.name') }}fetch/{{ lookup('custom_vars', 'dcgn.ose.configmap.vault.hashicorp.com.secret.engine.pki.client.role') }} common_name={{ lookup('custom_vars', 'dcgn.ose.configmap.certificate.client.cn') }} format=pem
изменить на:
dcgn.vault.secret.db.postgres.certs.path={{ lookup('custom_vars', 'dcgn.vault.secret.kv.baseEngineMountPath') }}KV/db/certs
Требования и рекомендации при использовании engine секретов: kv, pki, database#
Не рекомендован к использованию engine Database Engine (database).
Использование KV Engine (kv)#
Хранение сертификатов
При использовании KV для хранения сертификатов, секрет должен содержать следующие ключи:
Ключ |
Описание |
|---|---|
|
Cертификаты доверенных УЦ |
|
Cертификат |
|
Cертификат издателя |
|
Приватный ключ |
Сертификаты должны быть представлены в PEM формате.
Пример содержимого секрета с сертификатами:
{
"ca_chain": [
"-----BEGIN CERTIFICATE-----\nMIIEjjCCA...\n-----END CERTIFICATE-----",
"-----BEGIN CERTIFICATE-----\nMIIDMjCCA...\n-----END CERTIFICATE-----"
],
"certificate": "-----BEGIN CERTIFICATE-----\nMIIFszCC...\n-----END CERTIFICATE-----",
"issuing_ca": "-----BEGIN CERTIFICATE-----\nMIIEjjCCA...\n-----END CERTIFICATE-----",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvAIBA...\n-----END PRIVATE KEY-----"
}
Хранение учетной записи БД
При использовании KV для хранения учетной записи БД, секрет должен содержать следующие ключи:
Ключ |
Описание |
|---|---|
|
Имя пользователя |
|
Пароль |
Пример содержимого секрета с учетной записью:
{
"username": "dcgn_dev",
"password": "password"
}
Примечание. По умолчанию Vault Agent с периодичностью в 5 минут запрашивает секрет. Изменить поведение можно добавив специальный ключ
ttl– время жизни секрета, тогда Vault Agent будет запрашивать его при достижении85%от указанногоttl. Пример значения:10.5(s|m|h|d), гдеs– секунды,m– минуты,h– часы,d– дни, дробная часть опциональна. Если не указана единица измерения времени, то значение интерпретируется в секундах.
Автоматизация применения секретов#
В DCGN реализован механизм автоматического обновления секретов, без перезапуска и без недоступности приложений.
Во время работы приложения (runtime) происходит отслеживание изменения в файлах на файловой системе и по факту изменений выполняется перезапуск ресурсов приложения.
Механизм автоматической ротации секретов можно отключить через параметр dcgn.secret.hotreload.enabled при старте приложения.
DCGN корректно обрабатывает ситуацию изменения секретов сразу в нескольких (или во всех) pod, не допуская ситуации одновременного обновления и применения секретов во всех приложениях.
Для обеспечения плавности обновления секретов между репликами одного приложения (pod), обновление выполняется с задержкой рассчитываемой по формуле: hotreload.timeLowerBound + |(hotreload.timeUpperBound - hotreload.timeLowerBound) * sin(x)|, где:
hotreload.timeLowerBound– нижняя граница времени применения секрета (раньше этого времени применение секрета не начнется);hotreload.timeUpperBound– верхняя граница времени применения секрета (позже этого времени применение секрета не начнется);x– случайное значение, генерируемое при старте приложения.
Общие настройки#
Наименование параметра в файле конфигурирования |
Описание параметра |
Значение по умолчанию или глобальные параметры при установке Deploy tools |
Версия ПО |
|---|---|---|---|
Файл dcgn.all.conf |
|||
Настройки для Hotreload |
|||
dcgn.secret.hotreload.enabled |
переключатель hotreload секретов |
1.4 |
|
dcgn.secret.hotreload.timeUpperBound |
нижняя граница времени применения секрета |
5 |
2.0.0 |
dcgn.secret.hotreload.timeLowerBound |
верхняя граница времени применения секрета |
5 |
2.0.0 |
dcgn.secret.hotreload.strategy |
стратегия применения секретов |
FAIL_FAST |
3.0.0.0 |
Примечание. Стратегия применения секретов реализована для секретов Базы данных DCGN. Возможные значения FAIL_FAST/FAIL_SAFE. При стратегии FAIL_SAFE приложение во время выполнения будет использовать старые секреты, если обновление секретов завершилось с ошибкой.
Ограничения#
Бесшовная ротация обеспечивается только при условии некоторого grace-периода смены секретов, при котором доступны старый и новый секреты.
При внештатном обновлении секретов инициализация применения выполняется вручную посредством перезапуска сервиса.
Секрет на сервис-провайдере ротируется раньше, чем на стороне клиента, например, на стороне ОТТ-сервера и в sidecars ОТТ. Предполагается, что это обеспечивается системой управления секретами или организационными мерами.
Применение сертификатов для установки mTLS-соединения с PostgreSQL выполняется автоматически средствами HikariCP и не подпадает под требование отключения.
Аутентификации по ТУЗ#
Для успешного обновления secret ТУЗ для подключения к СУБД требуется одновременное обновление ТУЗ в экземпляре СУБД, Secret Management System и в приложении. Ошибки аутентификации могут появится для новых соединений, которые создает пул со старым secret (но когда в экземпляр СУБД уже обновился ТУЗ), либо с новым secret (но когда экземпляр СУБД еще не обновил ТУЗ). Чтобы исключить такие ошибки, рекомендуется обеспечить период отсрочки (grace period) для отключаемого ТУЗ. Для этого нужно выполнить следующие шаги:
Ротация секрета на стороне Secret Management System типа логин/пароль, используемого для аутентификации в СУБД, производится администраторами путем замены ТУЗ в KV Engine:
Создаются две ТУЗ с пересекающимися сроками действия пароля (grace period - пересечение сроков действия паролей, когда действуют обе ТУЗ. Используется для плавной замены ТУЗ).
В KV Secrets Engine указываются логин, пароль и срок действия (TTL) первой ТУЗ.
При наступлении grace period в KV Secrets Engine указываются логин, пароль и срок действия (TTL) второй ТУЗ (в этот момент могут использоваться обе ТУЗ).
Далее ТУЗ меняются с предварительной сменой пароля.
Для смены пароля ТУЗ можно настроить использование статических ролей Database Secrets Engine:
Для каждой ТУЗ создается статическая роль.
Для роли настраивается политика генерации паролей.
Для смены пароля ТУЗ выполняется операция ротации, которая генерирует новый пароль и обновляет его в СУБД для ТУЗ.
После выполнения операции ротации логин, новый пароль и срок действия пароля (TTL) ТУЗ указываются в KV Secrets Engine.
Примечание.
Для исключения проблем при обновлении secret ТУЗ СУБД рекомендуется отказаться от аутентификации через ТУЗ и перейти на аутентификацию по сертификату.