HashiCorp Vault и KMS-заменитель#
Для реализации механизма защиты данных требуется наличие установленного и интегрированного решения Key/Secret Management System. В СУБД Pangolin реализована интеграция с KMS HashiCorp Vault, который используется в качестве защищенного хранилища ключей засекречивания и настроек, а также, как система управления ключами.
HashiCorp Vault — это инструмент с открытым исходным кодом, который обеспечивает безопасный и надежный способ хранения и распространения секретов, таких как ключи API, токены доступа и пароли.
Также был разработан плагин-заменитель KMS, реализованный в виде библиотеки libkms_substitute_plugin.so.
Ключи засекречивания и мастер-ключ#
Ключи засекречивания организованы в двухуровневую иерархию:
мастер-ключ регулярно изменяется и используется для засекречивания ключей второго уровня;
ключи второго уровня засекречивают объекты базы данных и не подлежат ротации, что позволяет избежать перекодирования данных при обновлении мастер-ключа.
Мастер-ключ#
Мастер-ключ устанавливается при первом запуске базы данных (БД), а также может быть изменен сотрудником службы безопасности вручную. Если новый мастер-ключ не задан, он генерируется автоматически.
Мастер-ключ хранится в Hashicorp Vault по пути postgresql/<ID кластера>/keys. ID кластера можно уточнить на сервере:
postgres=# SHOW cluster_name;
cluster_name
--------------
temp_install
(1 row)
Пример структуры хранения ключей в Hashicorp Vault:

actual_master_key— параметр, содержащий имя параметра с актуальным мастер-ключом;master_key_value_<timestamp>— значение мастер-ключа, где<timestamp>— дата и время в форматеГГГГММДД_ЧЧммСС;wal_key— параметр, содержащий ключ засекречивания WAL, общий для серверов БД, между которыми выполняется репликация.
Функции для поддержки ротации и изменения мастер-ключей на стороне БД:
block_rotate_master_key()— захватывает блокировку изменения мастер-ключа, служит для исключения ротации мастер-ключа TDE на кластере при работе таких утилит, какpg_rewind;unblock_rotate_master_key()— снимает блокировку изменения мастер-ключа на кластере;set_master_key(new_master_key TEXT)— устанавливает новое значение мастер-ключа;rotate_master_key()— генерирует и устанавливает новое значение мастер-ключа;reencrypt_keys()— переперекодирует хранилище ключей актуальным мастер-ключом, опираясь на информацию о предыдущем использованном мастер-ключе;restore_keys()— перекодирует хранилище ключей актуальным мастер-ключом, в том числе поддерживает нахождение мастер-ключа из истории в хранилище секретов, которым был засекречен конкретный ключ объекта. Также используется в восстановлении резервных копий, снятых во время действия предыдущих мастер-ключей.
Ключи второго уровня#
Ключи второго уровня засекречивают объекты базы данных и не подлежат ротации, что позволяет избежать перекодирования данных при обновлении мастер-ключа.
Ключи второго уровня хранятся на сервере БД в виде файлов:
enc_conn_settings.cfg(засекреченный):не входит в резервные копии БД;
находится в директории
/etc/postgres, владельцем являетсяkmadmin_pg;создается при настройке соединения с KMS через утилиту
setup_kms_credentialsадминистратором безопасности;содержит параметры соединения с KMS и засекреченные учетные данные для этого соединения.
enc_settings.cfg:входит в резервные копии БД;
хранится в директории
PGDATA/global, владельцем является пользовательpostgres;создан при первом запуске БД;
указаны метка текущего и предыдущего мастер-ключей засекречивания, а также флаг включения засекречивания WAL (по умолчанию включен).
Пример файла
enc_settings.cfg:$PGDATA/global/ -rw------- 1 postgres postgres 84 Sep 28 10:59 enc_settings.cfg $ cat $PGDATA/global/enc_settings.cfg active_master_key_id = master_key_value_20220412_131233_249 kms_domain = postgresqlenc_keys.json:входит в резервную копию БД;
также находится в директории
PGDATA/global, владельцем является пользователь postgres;содержит ключи засекречивания для табличных пространств, отношений и журналов WAL;
Пример файла
enc_keys.json:$PGDATA/global/ -rw------- 1 postgres postgres 108916 Sep 28 10:59 enc_keys.json $ cat $PGDATA/global/enc_keys.json … { "controlBlock" : "{хеш}", "dataBaseId" : 16403, "encryptionKey" : "{encryptionKey}", "objectId" : 16774, "pgObjectType" : "R" }, { "controlBlock" : "{хеш}", "encryptionKey" : "{encryptionKey}", "pgObjectType" : "W" }Содержит следующие данные:
controlBlock— контрольный блок, состоящий из метки мастер-ключа,oidбазы данных объекта, типа объекта иoidсамого объекта, засекреченный ключом;dataBaseId—oidбазы данных объекта;encryptionKey— ключ кодирования объекта в засекреченном виде;objectId—oidобъекта, которому назначен соответствующий ключ засекречивания. Для WAL должен бытьnull;pgObjectType— тип объекта, которому назначен соответствующий ключ засекречивания.W— WAL,T— табличное пространство,R— отношение.
Установка и настройка HashiCorp Vault#
Cкачайте и распакуйте дистрибутив Vault, перенесите распакованный дистрибутив в директорию /usr/local/bin/:
$ unzip vault_${VAULT_VERSION}_linux_amd64.zip $ sudo mv ./vault /usr/local/bin/Cоздайте пользователя Vault:
$ sudo useradd --system --home /etc/vault --shell /bin/false vaultCоздайте директории для хранения настроек и данных:
$ sudo mkdir /etc/vault $ sudo mkdir -p /var/lib/vault/dataCоздайте службу Vault (скопируйте файл
vault.serviceна сервер в директорию/etc/systemd/system/):sudo cp ./vault.service /etc/systemd/system/Cоздайте конфигурационный файл Vault (скопируйте файл
config.hclна сервер в директорию/etc/vault/):$ sudo cp ./config.hcl /etc/vault/Создайте директории
/ca,ca/signedcerts,ca/private:$ cd ~/ && mkdir ca && mkdir -p ca/signedcerts && mkdir ca/private && cd caСоздайте индексные данные БД:
$ echo '01' > serial && touch index.txt && echo 'unique_subject = yes' > index.txt.attrСоздайте корневой сертификат/ключ, изменив в файле
caconfig.cnfпуть на корректный к директорииca:в параметре
dirв секцииlocal_ca;в параметре
default_keyfileв секцииreq.
Скопируйте файл на сервер в директорию
~/ca:$ export OPENSSL_CONF=~/ca/caconfig.cnf $ openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825 Введите пароль "test"Сгенерируйте ключ и создайте запрос на серверный сертификат (предварительно добавьте в конец файла
localhost.cnfстроку:IP.2 = HOST, гдеHOST- IP-адрес сервера, на котором разворачиваете Vault. Скопируйте файлlocalhost.cnfв директорию~/ca):$ export OPENSSL_CONF=~/ca/localhost.cnf $ openssl req -newkey rsa:2048 -keyout key.pem -keyform PEM -out req.pem -outform PEM Введите пароль "test"Декодируйте ключ:
$ openssl rsa < key.pem > server_key.pemСгенерируйте и подпишите серверный сертификат:
$ export OPENSSL_CONF=~/ca/caconfig.cnf $ openssl ca -in req.pem -out server_crt.pem Введите пароль "test"Скопируйте ключ, серверный и корневой сертфиикаты в директорию
/etc/vault/:$ sudo cp server_key.pem server_crt.pem cacert.pem /etc/vault/Назначьте владельцем пользователя Vault:
$ sudo chown -R vault:vault /etc/vault /var/lib/vaultНастройте автодополнение команд Vault:
$ vault -autocomplete-install $ complete -C /usr/local/bin/vault vaultВключите запуск Vault при загрузке системы:
$ sudo systemctl daemon-reload $ sudo systemctl enable --now vaultЗапустите Vault:
$ sudo systemctl start vaultПроинициализируйте Vault:
$ sudo -u vault bash -c 'env VAULT_ADDR=https://127.0.0.1:8200 VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault operator init > /etc/vault/init.file'Введите 3 ключа (по одному) в хранилище
Unseal, где {Токен} - используемый корневой токен (см.cat /etc/vault/init.file):$ sudo -u vault bash -c 'env VAULT_ADDR=https://{IP-адрес}:{Порт} VAULT_TOKEN={Токен} VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault operator unseal {хеш} $ sudo -u vault bash -c 'env VAULT_ADDR=https://{IP-адрес}:{Порт} VAULT_TOKEN={Токен} VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault operator unseal ...' $ sudo -u vault bash -c 'env VAULT_ADDR=https://{IP-адрес}:{Порт} VAULT_TOKEN={Токен} VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault operator unseal ...'Разрешите аутентификацию по логину/паролю:
$ sudo -u vault bash -c 'env VAULT_ADDR=https://127.0.0.1:8200 VAULT_TOKEN={Токен} VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault auth enable userpass' Success! Enabled userpass auth method at: userpass/Установите логин/пароль:
$ sudo -u vault bash -c 'env VAULT_ADDR=https://127.0.0.1:8200 VAULT_TOKEN={Токен} VAULT_CACERT=/etc/vault/cacert.pem /usr/local/bin/vault write auth/userpass/users/adminencryption password=test policies=admins' Success! Data written to: auth/userpass/users/adminencryptionЧерез Web UI выполните аутентификацию пользователя на сервере Vault https://{IP-адрес настройки Vault-сервера}:{Порт}. Для аутентификации используйте токен:

Создайте Key-Value-хранилище и разрешите с ним работу, выбрав
Secrets -> Enable new engine (1) -> KV (2) -> Next (3) -> Enable engine (4):



Добавьте разрешения для выполнения операций с Key-Value-хранилищем, выбрав:
Policies (1) -> default (2) -> Edit policy (3). Добавьте в конец (4) -> нажмите сохранитьSave(5):path "kv/*" { capabilities = ["create", "update", "read", "delete", "list"] }



Получите клиентский токен для последующих обращений к Vault:
$ curl --insecure --request POST --data '{"password": "test"}' https://127.0.0.1:8200/v1/auth/userpass/login/adminencryption {"request_id":"{id}","lease_id":"","renewable":false,"lease_duration":0,"data":null,"wrap_info":null,"warnings":null,"auth":{"client_token":"{token}","policies":["admins","default"],"token_policies":["admins","default"],"metadata":{"username":"adminencryption"},"lease_duration":36000,"renewable":true,"entity_id":"{entity_id}":true}}В последующих запросах можно использовать
"client_token":"{Токен}". Например:$ curl --insecure --header "X-Vault-Token:{Токен} --request GET https://{IP-адрес}:{Порт}/v1/kv/data/
Добавление параметров в хранилище секретов#
Перед первоначальной настройкой механизма защиты данных от привилегированных пользователей в Pangolin необходимо выполнить добавление параметров в Key/Secret Management System на сервере с установленным HashiCorp Vault.
Выполните аутентификацию пользователя на сервере Vault
{IP адрес сервера, на котором производится настройка Vault}:{}Порт}. Для аутентификации используйте клиентский токен:
Зайдите в Key-Value-хранилище и нажмите
Create secret(1):
В поле
Path for this secret(2) укажите путь к параметруpostgresql/CLUSTER_ID/postgresql/ИМЯ_ПАРАМЕТРА, где:CLUSTER_ID- имя кластера (должен быть уникальным для каждого кластера),ИМЯ_ПАРАМЕТРА = secure_config.В поле
Version data(3, 4) укажите:имя параметра =
value;значение =
off;
В случае отсутствии указанного значения параметра при старте БД в момент соединения с KMS и считывания параметров возникнет ошибка:
CheckSecureConfig: secure_config parameter does not exist on KMS or has wrong value.Сохраните, нажав кнопку
Save(5):
Менять значение параметра можно, нажав
Create new versionсправа:
Там же можно удалить параметр, нажав на кнопку
Delete secret:
Далее добавьте остальные параметры (в соответствии с заданными локальными параметрами в конфигурационном файле
/etc/pangolin-manager/postgres.yml). Минимальный набор параметров для успешного старта БД:secure_config = off is_tde_on = on ssl: on ssl_cert_file: /pg_ssl/server.crt ssl_key_file: /pg_ssl/server.key ssl_ca_file: /pg_ssl/root.crt pg_ident password_policies_enable: on psql_encrypt_password: on password_encryption: scram-sha-256 enabled_sec_admin_extra_auth_methods: cert enabled_extra_auth_methods: certНажмите
Create secret(1):
В поле
Version data(8, 9, 10) укажите:имя параметра =
value;соответствующее значение.
Нажмите кнопку
Save:
Защита параметров конфигурации#
В рамках функциональности защиты конфигурации реализовано разделение разрешений на некоторые настроечные параметры PostgreSQL.
Настроечные параметры PostgreSQL#
Полный список настроечных параметров, управляемых администраторами безопасности через VAULT в режиме защищенного конфигурирования, находится в таблице «Конфигурационные параметры» документа «Справочная информация».
Инструкция по добавлению параметров в хранилище приведена в подразделе «Добавление параметров в хранилище секретов».
Ниже будут описаны внесенные изменения в рамках настройки некоторых из них в режиме защищенного конфигурирования.
Параметры, выведенные из хранения в защищенном хранилище/VAULT#
Параметры, по умолчанию не хранящиеся в защищенном хранилище (могут при необходимости быть добавлены):
pg_hba.conf– методы аутентификации и подключения;shared_preload_libraries,jit_provider– подгружаемые PostgreSQL библиотеки;local_preload_libraries,session_preload_libraries– подгружаемые PostgreSQL библиотеки;dynamic_library_path– путь к динамически подгружаемым модулям;password_encryption– метод хеширования паролей пользователей.
Параметры, переданные на сторону защищенного хранилища/VAULT#
Параметры, перемещенные в защищенное хранилище:
allowed_servers– список разрешенных к использованию LDAP и RADIUS серверов;ssl– режим работы с SSL;encrypt_new_tablespaces– засекречивание новых табличных пространств;Примечание
Параметр действует только при запуске Pangolin и включенном TDE:
is_tde_on = on/true.В случае, если в качестве значения параметра выбрано значение по умолчанию
ddl, новые табличные пространства кодируются только при ручной установке опцииis_encrypted = on, по умолчанию засекречивание не применяется.При выборе значения параметра
always, опцияis_encryped, передаваемая в команде, игнорируется, так как в этом случае на все таблицы пространства будет применено засекречивание.enabled_sec_admin_extra_auth_methods– список дополнительно разрешенных к использованию методов аутентификации для ролей администраторов безопасности;enabled_extra_auth_methods– список дополнительно разрешенных к использованию методов аутентификации для всех ролей.Примечание
По умолчанию доступны только методы аутентификации
scram-sha-256,ldap,radius. Для применения изменений, достаточно выполнитьreload (SIGHUP)Pangolin.Значения параметров применяются при аутентификации, так как это единственный этап, когда можно фактически определить принадлежность аутентифицируемой роли к администраторам безопасности. При использовании не разрешенного для роли метода аутентификации она будет завершена с сообщением:
Authentication method "<метод аутентификации>" isn't allowed for non security admin role "<роль>". Соответствующая запись с аналогичным сообщением помещается в лог аудита как ошибка открытия соединения.
Параметры, внесенные под двойное управление#
Параметр pg_ident_conf (карты сопоставления пользователей при авторизации) вносится под двойное управление – то есть прописывается одновременно и в VAULT, и в локальном файле. При этом совпадение порядка слов не требуется.
Внимание
В случае, если в правилах pg_ident заданы регулярные значения, необходимо убедиться в их полном совпадении.
Обновление HashiCorp Vault#
Для обновления HashiCorp Vault до версии 1.4.0 необходимо выполнить последовательно следующие действия:
Остановить работу vault:
$ sudo systemctl stop vaultСкачать дистрибутив vault, распаковать и перенести в директорию
/usr/local/bin/:$ unzip vault_${VAULT_VERSION}_linux_amd64.zip $ sudo mv vault /usr/local/bin/Запустить vault:
$ sudo systemctl start vault
Возможные проблемы и их решение при работе HashiCorp Vault#
В случае перезагрузки (рестарта) сервера с Vault, либо рестарта сервиса Vault, хранилище переходит в состояние SEALED:

Для восстановления:
Зайдите на сервер с установленным Vault и выполните команду
cat /etc/vault/init.file:$ cat /etc/vault/init.file Unseal Key 1: {hash_unseal_key_1} Unseal Key 2: {hash_unseal_key_2} Unseal Key 3: {hash_unseal_key_3} Unseal Key 4: {hash_unseal_key_4} Unseal Key 5: {hash_unseal_key_5} Initial Root Token: {id_root_token} Vault initialized with 5 key shares and a key threshold of 3. Please securely distribute the key shares printed above. When the Vault is re-sealed, restarted, or stopped, you must supply at least 3 of these keys to unseal it before it can start servicing requests. Vault does not store the generated master key. Without at least 3 key to reconstruct the master key, Vault will remain permanently sealed! It is possible to generate new unseal keys, provided you have a quorum of existing unseal keys shares. See "vault operator rekey" for more information.Поочередно введите 3 ключа в
Unsealиз списка (Unseal Key 1,Unseal Key 2,Unseal Key 3):
KMS-заменитель#
При использовании KMS-заменителя вместо хранилища секретов необходимо использовать локальные конфигурационные файлы.
Плагин-заменитель KMS считывает данные для пары ключ-значение из двух файлов. Первый файл /etc/postgres/kms_static_params.cfg содержит статические параметры, второй файл /etc/postgres/kms_dynamic_params.cfg – динамические. Файл со статическими параметрами засекречен ключом, генерируемым из параметров сервера. Файл с динамическими параметрами может меняться. При внесении изменений необходимо обеспечить идентичность файлов с динамическими параметрами в кластере.
Если файлы /etc/postgres/kms_static_params.cfg и /etc/postgres/kms_dynamic_params.cfg не обнаружены или имеют некорректный формат, система будет считать, что используется реальный KMS, но учетные данные для подключения к нему не найдены.
Ограничения:
При использовании KMS-заменителя ротация мастер-ключа запрещена.
Изменение параметров кластера, хранящихся в KMS, можно проводить только в выключенном режиме.
Чтобы инициализация базы данных с подключенным заменителем KMS выполнилась, необходимо, чтобы файлы
/etc/postgres/enc_connection_settings.cfg,kms_static_params.cfgиkms_dynamic_params.cfgлибо все присутствовали, либо все отсутствовали.Если в исходные файлы c настройками KMS вносятся правки, то измененные файлы должны быть скопированы на все узлы кластера и на каждом узле закодированы со статическими параметрами с помощью утилиты засекречивания
encrypt_params_file.При включении в кластер нового узла актуальные файлы параметров KMS должны быть таким же образом скопированы на него и засекречены.
Подготовка файлов со статическими и динамическими параметрами#
Статические параметры#
Файл со статическими параметрами /etc/postgres/kms_static_params.cfg представляет собой простой текстовый документ, каждая строка которого содержит пару:
<имя ключа (параметра на KMS)> = <значение для данного ключа>
В файл со статическими параметрами должны быть помещены:
меткa мастер-ключа;
сгенерированный мастер-ключ;
сгенерированный ключ засекречивания WAL.
Пример файла со статическими параметрами:
actual_master_key = master_key_value_00000000_000000_000
master_key_value_00000000_000000_000 = {generated_master_key}
wal_key = {generated_wal_key}
Сгенерировать собственный мастер-ключ возможно с помощью утилиты {{ PGHOME }}/bin/generate_encryption_key.
Файл /etc/postgres/kms_static_params.cfg помещается на все узлы кластера во время настройки перед запуском утилиты setup_kms_credentials. С помощью утилиты засекречивания {{ PGHOME }}/bin/encrypt_params_file подготовленный файл со статическими параметрами необходимо закодировать на каждом узле кластера.
Примечание
Утилиты генерации ключей generate_encryption_key и кодирования encrypt_params_file расположены в директории {{ PGHOME }}/bin (где {{ PGHOME }} - директория с бинарными файлами для работы БД, например, /usr/pangolin-5.2.1.
Динамические параметры#
Файл с динамическими параметрами может содержать все параметры, которые могут изменяться администратором безопасности на KMS, то есть в файл можно поместить все настройки, которые могут быть на реальном KMS.
Файл с динамическими параметрами /etc/postgres/kms_dynamic_params.cfg представляет собой простой текстовый документ, каждая строка которого содержит пару:
<имя ключа (параметра на KMS)> = <значение для данного ключа>
Пример файла с динамическими параметрами:
secure_config = on
is_tde_on = on
pg_ident +=
ssl = on
ssl_cert_file = /pg_ssl/server.crt
ssl_key_file = /pg_ssl/server.key
ssl_ca_file = /pg_ssl/root.crt
password_policies_enable = on
psql_encrypt_password = on
password_encryption = scram-sha-256
enabled_sec_admin_extra_auth_methods = cert
enabled_extra_auth_methods = cert
Подготовка файлов#
Выполните генерацию мастер-ключа с помощью утилиты
generate_encryption_key(утилита расположена в директории{{ PGHOME }}/bin):# вход пользователем kmadmin_pg $ su - kmadmin_pg Password: # генерация мастер-ключа $ {{ PGHOME }}/bin/generate_encryption_key Key was generated successfully. Key: {generated_master_key} # генерация ключа засекречивания для WAL $ {{ PGHOME }}/bin/generate_encryption_key Key was generated successfully. Key: {generated_wal_key}Создайте файл со статическими параметрами
/etc/postgres/kms_static_params.cfg(метку мастер-ключа укажите именноmaster_key_value_00000000_000000_000):# создание файла $ touch /etc/postgres/kms_static_params.cfg # добавление сгенерированного на предыдущем шаге мастер-ключа и ключа засекречивания для WAL журналов $ vim /etc/postgres/kms_static_params.cfg actual_master_key = master_key_value_00000000_000000_000 master_key_value_00000000_000000_000 = {generated_master_key} wal_key = {generated_wal_key}Создайте файл с динамическими параметрами
/etc/postgres/kms_dynamic_params.cfg:# создание файла $ touch /etc/postgres/kms_dynamic_params.cfg # добавление параметров $ vim /etc/postgres/kms_dynamic_params.cfg secure_config = on is_tde_on = on pg_ident += ssl = on ssl_cert_file = /pg_ssl/server.crt ssl_key_file = /pg_ssl/server.key ssl_ca_file = /pg_ssl/root.crt password_policies_enable = on psql_encrypt_password = on password_encryption = scram-sha-256 enabled_sec_admin_extra_auth_methods = cert enabled_extra_auth_methods = certСкопируйте подготовленные файлы на Standby-узел:
scp /etc/postgres/kms_*.cfg postgres@{{ replica_ip }}:/etc/postgresВыдайте права
kmadmin_pgна файлы со статическими и динамическими параметрами (сначала на Active-узле, затем на Standby-узле):chown kmadmin_pg:kmadmin_pg /etc/postgres/kms_static_params.cfg chown kmadmin_pg:kmadmin_pg /etc/postgres/kms_dynamic_params.cfgВыполните вход администратором ИБ:
$ su - kmadmin_pgЗакодируйте файл со статическими параметрами (сначала на Active-узле, затем на Standby-узле). В результате должно быть получено сообщение об успешном заксекречивании:
File /etc/postgres/kms_static_params.cfg was encrypted successfully:$ {{ PGHOME }}/bin/encrypt_params_file Start to encrypt file: /etc/postgres/kms_static_params.cfg File /etc/postgres/kms_static_params.cfg was encrypted successfullyУбедитесь, что файл со статическими параметрами засекречен:
$ cat /etc/postgres/kms_static_params.cfg
Утилита setup_kms_credentials#
Описываемая функциональность:
обеспечивает настройку параметров подключения к хранилищу секретов;
упрощает процесс изменения параметров для работы с хранилищем секретов;
обеспечивает возможность обнаружения ошибок в параметрах подключения к хранилищу секретов на этапе конфигурирования доступа;
обеспечивает настройку системы для работы с хранилищем сертификатов;
упрощает использование утилиты в автоматизированных скриптах.
обеспечивает настройку проверки серверного сертификата хранилища секретов.
Если изменение параметров подключения к хранилищу секретов или сертификатов производится на работающем кластере, то выполните/запустите перечитывание конфигурационных параметров в компонентах кластера. Перезапуск кластера не требуется.
Утилита setup_kms_credentials позволяет сохранять дополнительные параметры для работы с хранилищем секретов SecMan. Дополнительные параметры имеют значения по умолчанию или расширяют текущие типы данных. Это обеспечивает обратную совместимость формата засекреченного файла /etc/postgres/enc_connection_settings.cfg (владелец: kmadmin_pg, группа: kmadmin_pg, права: -rw-r--r--). Процесс добавления новых параметров не меняется.
Параметры для работы с хранилищем секретов#
Параметры подключения передаются строкой вида:
/usr/pangolin-{version}/bin/setup_kms_credentials -c {cluster_id} -h {IP-адрес} -p {Порт} -t {тип авторизации} -i {логин пользователя}
К обязательным параметрам относятся:
-c- идентификатор кластера;-h- IP-адрес узла;-p- порт для подключения;-t- тип авторизации;-i- логин пользователя.
Тип авторизации (значение параметра -t) может принимать значения:
1- для Userpass-авторизации;2- для Approle-авторизации.
Примечание
В интерактивном режиме передается только пароль.
Необязательные параметры:
--purpose- назначение (сертификатыcertsили секретыsecrets). Значение по умолчанию -secrets;--format/-f- формат вывода (JSON,table- таблица). Значение по умолчанию -table;--protocol/-l- протокол (httpилиhttps). Значение по умолчанию -https;--prefix/-x- префикс пути. Значение по умолчанию -kv;--suffix/-u- суффикс пути. По умолчанию передаваемое значение отсутствует.--namespace/-n- пространство имен, по умолчанию не задано;--auth/-a- точка авторизации, по умолчанию не передается;--root-ca/-r- файл или папка с корневым сертификатом для проверки сервера хранилища секретов. Если не задано, используется ближайшая доступная директория;--skip-confirm- настройка ввода, определяющая наличие/отсутствие подтверждения для редактирования или удаления записи;--index- индекс записи в режиме редактирования или удаления;--plain- вывод информации;--no-check- режим для отключения проверки параметров подключения к хранилищу секретов;--debug- показать информацию для отладки.
При отсутствии явно заданных необязательных параметров, используются значения по умолчанию.
Примечание
Параметры root-caи suffix являются локальными параметрами отдельной записи. Единственный глобальный параметр - cluster_id.
Утилита setup_kms_credentials обеспечивает возможность задавать значения параметров root-ca и suffix (оба параметра расположены в разделе credentials) для каждого отдельного подключения к хранилищу секретов/сертификатов.
Если файл /etc/postgres/enc_connection_settings.cfg (/etc/postgres/enc_connection_settings_cert.cfg) имеет старый формат, root-ca и suffix не заданы для конкретного подключения, то для обеспечения совместимости утилита дублирует эти два параметра для каждого отдельного подключения.
Если соединение было создано с помощью новой версии программы, а параметры root-ca и suffix не были заданы, то в файл с параметрами подключений к хранилищу секретов/сертификатов /etc/postgres/enc_connection_settings.cfg (/etc/postgres/enc_connection_settings_cert.cfg) будут записаны пустые значения для данных параметров. В выводе команды show для параметра root-ca будет указываться реально используемое (вычисляемое) значение данного параметра для каждой записи, а при выводе в JSON-формат значение по умолчанию будет соответствовать True в поле root_ca_calculated. В табличном выводе параметр root_ca_calculated не указывается.
Примечание
Если при добавлении новой записи в файл с параметрами подключения к хранилищу секретов/сертификатов, указать параметр cluster-id, отличный от уже записанного, утилита заканчивает работу с ошибкой: Error: wrong cluster-id {wrong cluster-id}, credentials was set for {correct cluster-id}.
Удаление файла с параметрами подключения к хранилищу секретов/сертификатов#
Утилита setup_kms_credentials удаляет файл /etc/postgres/enc_connection_settings.cfg (/etc/postgres/enc_connection_settings_cert.cfg), если он не содержит записей с параметрами подключения к хранилищу секретов/сертификатов сразу после операции удаления последней записи:
[kmadmin_pg@server-name ~]$ ls -lh /etc/postgres/enc_connection_settings.cfg
-rw-r--r-- 1 kmadmin_pg kmadmin_pg 328 May 6 10:27 /etc/postgres/enc_connection_settings.cfg
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials delete --index=0 --skip-confirm
[kmadmin_pg@server-name ~]$ ls -lh /etc/postgres/enc_connection_settings.cfg
ls: cannot access '/etc/postgres/enc_connection_settings.cfg': No such file or directory
Если файл был удален, то при последующем создании новой записи с параметрами подключения к хранилищу секретов/сертификатов необходимо заново ввести значение cluster-id:
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials add --cluster ZVO --host <IP-адрес> --port 8200 --type 1 -i secmanLogIn --purpose secrets --no-check
Enter password:
**************
Confirm password:
**************
Credentials for Secret storage has been added successfully
При отсутствии файла /etc/postgres/enc_connection_settings.cfg (/etc/postgres/enc_connection_settings_cert.cfg) команда show утилиты setup_kms_credentials выводит сообщение No credentials specified или {} для JSON-формата:
[kmadmin_pg@server-name ~]$ ls -lh /etc/postgres/enc_connection_settings.cfg
ls: cannot access '/etc/postgres/enc_connection_settings.cfg': No such file or directory
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials show
No credentials specified
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials show --format=json
{}
Режим deletall#
Режим deleteall используется совместно с флагом --purposeи удаляет файл /etc/postgres/enc_connection_settings.cfg (/etc/postgres/enc_connection_settings_cert.cfg).
Если в качестве значения флага установлено certs (deleteall --purpose=certs), то будет удален файл с параметрами подключения к хранилищу сертификатов /etc/postgres/enc_connection_settings_cert.cfg:
[kmadmin_pg@server-name ~]$ ls -lh /etc/postgres/enc_connection_settings_cert.cfg
-rw-r--r-- 1 kmadmin_pg kmadmin_pg 376 May 6 11:32 /etc/postgres/enc_connection_settings_cert.cfg
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials deleteall --purpose=certs --skip-confirm
[kmadmin_pg@server-name ~]$ ls -lh /etc/postgres/enc_connection_settings_cert.cfg
ls: cannot access '/etc/postgres/enc_connection_settings_cert.cfg': No such file or directory
[kmadmin_pg@server-name ~]$ ls -lh /etc/postgres/enc_connection_settings.cfg
-rw-r--r-- 1 kmadmin_pg kmadmin_pg 328 May 6 10:27 /etc/postgres/enc_connection_settings.cfg
Если значение флага соответствует secrets (deleteall --purpose=secrets), то файл с параметрами подключения к хранилищу секретов /etc/postgres/enc_connection_settings.cfg будет удален:
[kmadmin_pg@server-name ~]$ ls -lh /etc/postgres/enc_connection_settings.cfg
-rw-r--r-- 1 kmadmin_pg kmadmin_pg 328 May 6 10:27 /etc/postgres/enc_connection_settings.cfg
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials deleteall --purpose=secrets --skip-confirm
[kmadmin_pg@server-name ~]$ ls -lh /etc/postgres/enc_connection_settings.cfg
ls: cannot access '/etc/postgres/enc_connection_settings.cfg': No such file or directory
[kmadmin_pg@server-name ~]$ ls -lh /etc/postgres/enc_connection_settings_cert.cfg
-rw-r--r-- 1 kmadmin_pg kmadmin_pg 376 May 6 11:32 /etc/postgres/enc_connection_settings_cert.cfg
При попытке вызвать команду deleteall, когда файл с параметрами подключения к хранилищу секретов/сертификатов уже удален, команда не выполнится, а в консоль будет выведено сообщение File enc_connection_settings.cfg does not exist или File enc_connection_settings_cert.cfg does not exist, если флаг --purpose при вызове команды был установлен в значение certs:
[kmadmin_pg@server-name ~]$ ls -lh /etc/postgres/enc_connection_settings.cfg
ls: cannot access '/etc/postgres/enc_connection_settings.cfg': No such file or directory
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials deleteall --purpose=secrets --skip-confirm
File enc_connection_settings.cfg does not exist
[kmadmin_pg@server-name ~]$ ls -lh /etc/postgres/enc_connection_settings_cert.cfg
ls: cannot access '/etc/postgres/enc_connection_settings_cert.cfg': No such file or directory
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials deleteall --purpose=certs --skip-confirm
File enc_connection_settings_cert.cfg does not exist
Если не указан флаг --purpose, то утилита закончит работу с ошибкой Error: --purpose not specified:
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials deleteall --skip-confirm
Error: --purpose not specified
Мониторинг работы утилиты#
При вызове setup_kms_credentials delete в случае не заданного индекса будет получено сообщение об ошибке:
Error: Index to delete not specified
При вызове операции delete утилиты setup_kms_credentials на несуществующем хранилище будет получен вывод об ошибке:
Error: File enc_connection_settings.cfg does not exist
Внимание
Новый формат файлов /etc/postgres/enc_connection_settings.cfg(/etc/postgres/enc_connection_settings_cert.cfg) обратно не совместим с более ранними версиями СУБД Pangolin.
Любые изменения в файле /etc/postgres/enc_connection_settings.cfg(/etc/postgres/enc_connection_settings_cert.cfg): создание, редактирование или удаление записи с параметрами подключения к хранилищу секретов/сертификатов, логируются в syslog:
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials add -h <IP-адрес> -p 8200 -u pang -t 1 -r -i adminencryption --no-check
Enter password:
**************
Confirm password:
**************
Credentials for Secret storage has been added successfully
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials delete --index 1 --skip-confirm
Credentials for Secret storage has been removed successfully
[kmadmin_pg@server-name ~]$ exit
[pprb_dev@server-name ~]$ sudo journalctl -q --since "2024-05-21 15:43:57" --until "2024-05-21 15:44:55" | grep setup_kms_credentials
May 21 15:44:07 <server_name> setup_kms_credentials[102792]: Credentials for Secret storage has been added successfully
May 21 15:44:50 <server_name> setup_kms_credentials[102831]: Credentials for Secret storage has been removed successfully
При выполнении команд setup, edit или add утилита setup_kms_credentials осуществляет проверку добавляемой или редактируемой записи с параметрами подключения.
В зависимости от результата проверки, дополнительно к сообщению о произведенном действии, будет выведено сообщение Credentials check ok, если проверка пройдена, или сообщение Credentials check failed, если проверка не пройдена:
[kmadmin_pg@server-name ~]$ /usr/pangolin-{version}/bin/setup_kms_credentials -c {user} -h <IP-адрес> -p 8200 -u postgresql -t 1 -r -i adminencryption
Enter password:
**************
Confirm password:
**************
Credentials check ok
Credentials for Secret storage has been set successfully
[kmadmin_pg@server-name ~]$ /usr/pangolin-{version}/bin/setup_kms_credentials add -h <IP-адрес> -p 8200 -r -u -t 1 -i fake_login
Enter password:
**************
Confirm password:
**************
Credentials check failed
Credentials for Secret storage has been added successfully
Для отключения вывода сообщения будет использоваться существующий ключ --no-check:
[kmadmin_pg@server-name ~]$ /usr/pangolin-{version}/bin/setup_kms_credentials add -h <IP-адрес> -p 8200 -r -u -t 1 -i fake_login --no-check
Enter password:
**************
Confirm password:
**************
Credentials for Secret storage has been added successfully
Ключ --verify учитывает результат проверки при выполнении запрашиваемой операции: если проверка не пройдена, утилита заканчивает работу с ошибкой, запись не добавляется/не изменяется:
[kmadmin_pg@server-name ~]$ /usr/pangolin-{version}/bin/setup_kms_credentials -c Fake_c_id -h <IP-адрес> -p 8200 -r -u -t 1 -i fake_login --verify
Enter password:
**************
Confirm password:
**************
Credentials check failed
Error: Credentials for Secret storage not set
[kmadmin_pg@server-name ~]$ /usr/pangolin-{version}/bin/setup_kms_credentials add -h <IP-адрес> -p 8200 -r -u -t 1 -i fake_login --verify
Enter password:
**************
Confirm password:
**************
Credentials check failed
Error: Credentials for Secret storage not added
[kmadmin_pg@server-name ~]$ /usr/pangolin-{version}/bin/setup_kms_credentials edit --index 0 -h <IP-адрес> -s fake_suffix --verify
Enter password:
**************
Confirm password:
**************
Credentials check failed
Error: Credentials for Secret storage not edited
Ключи --verify и --no-check не совместимы — утилита заканчивает работу с ошибкой, если указать их вместе:
[kmadmin_pg@server-name ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials add -h <IP-адрес> -p 8200 -r -u -t 1 -i fake_login --verify --no-check
Error: keys --verify and --no-check cannot be used together
Функция check_kms_is_on() (проверка доступности плагина взаимодействия с KMS)#
Специальная проверка, которая показывает, получилось ли выбрать такие значения из файла enc_connection_settions.cfg, содержащего варианты подключения к хранилищу секретов.
Функция проверяет, что плагин взаимодействия с KMS:
найден, доступен и подключен к КМС;
содержит в себе все функции API
sKmsConnectionInitialized.
Пример использования:
SELECT check_kms_is_on();
При успешном подключении на выходе функции будет получено значение true, в противном случае — false.
Режимы работы утилиты#
Режимы работы утилиты:
setup- ввести новый набор данных для хранилища (хранилищ) секретов или сертификатов, поведение по умолчанию;show- показать текущий набор параметров подключений к хранилищам секретов/сертификатов (без паролей и идентификаторов секретов);add- добавить новую запись в набор параметров подключений к хранилищам секретов/сертификатов;delete- удалить запись из набора параметров подключений к хранилищам секретов/сертификатов по номеру записи;edit- редактировать запись из набора параметров подключений к хранилищам секретов/сертификатов по номеру записи.
Примечание
Начиная с версии 5.4.0, отсутствует обратная совместимость обновления по параметру suffix.
Режим просмотра добавленных параметров подключения#
Пример команды просмотра записей в табличном формате:
[user ~]$ /usr/pangolin-{version}/bin/setup_kms_credentials show --plain
Pangolin cluster ID: {cluster_id}
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
| # | protocol | host | port | root CA path | suffix | prefix | namespace | cred type | auth point | id | status |
-----+----------+-------------+------+------------------+---------+--------+-----------+----------------------+------------+-----------------+----------------
| 0 | https | <IP-адрес> | 8200 | /pg_ssl/root_di1 | suffix1 | kv | | Userpass Auth Method | userpass | adminencryption | Ok |
| 1 | https | <IP-адрес> | 8200 | /pg_ssl/root_di2 | suffix2 | kv | | Userpass Auth Method | userpass | adminencryption | Ok |
+------------------------------------------------------------------------------------------------------------------------------------------------------------+
[kmadmin_pg@server-name ~]$ /usr/pangolin-{version}/bin/setup_kms_credentials show --purpose=certs --plain
Pangolin cluster ID: test
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
| # | protocol | host | port | root CA path | suffix | prefix | namespace | cred type | auth point | id | status |
-----+----------+------------+------+------------------+---------+--------+-----------------------+----------------------+------------+-----------------+----------
| 0 | https | <IP-адрес> | 8203 | /pg_ssl/root_di1 | pango1 | SBERCA | CI00000000_CI00000000 | Userpass Auth Method | userpass | adminencryption | Ok |
| 1 | https | <IP-адрес> | 8203 | /pg_ssl/root_di2 | pango2 | SBERCA | CI00000000_CI00000000 | Userpass Auth Method | userpass | adminencryption | Ok |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------+
Режим просмотра добавленных параметров подключения в JSON#
Пример команды просмотра записей в JSON-формате:
[user ~]$ /usr/pangolin-{version}/bin/setup_kms_credentials show --format=json
{
"cluster_id" : "test",
"credentials" :
[
{
"auth_point" : "userpass",
"host" : {IP-адрес},
"id" : "qewr",
"namespace" : "",
"port" : {Порт},
"prefix" : "kv",
"protocol" : "HTTPS",
"status" : "Storage error",
"type" : "USER_PASS"
},
{
"auth_point" : "userpass",
"host" : {IP-адрес},
"id" : "qwer",
"namespace" : "",
"port" : {Порт},
"prefix" : "kv",
"protocol" : "HTTPS",
"status" : "Storage error",
"type" : "USER_PASS"
}
],
"root_ca" : "/pg_ssl",
"suffix" : ""
}
[user ~]$ /usr/pangolin-{version}/bin/setup_kms_credentials show --purpose=certs --format=json
{
"cluster_id" : "test",
"credentials" :
[
{
"auth_point" : "userpass",
"host" : {IP-адрес},
"id" : "adminencryption",
"namespace" : "CI00000000_CI00000000",
"port" : {Порт},
"prefix" : "SBERCA",
"protocol" : "HTTPS",
"root_ca" : "/pg_ssl/root_di1",
"root_ca_calculated" : "false",
"status" : "Ok",
"suffix" : "pango1",
"type" : "USER_PASS"
},
{
"auth_point" : "userpass",
"host" : {IP-адрес},
"id" : "adminencryption",
"namespace" : "CI00000000_CI00000000",
"port" : {Порт},
"prefix" : "SBERCA",
"protocol" : "HTTPS",
"root_ca" : "/pg_ssl/root_di2",
"root_ca_calculated" : "false",
"status" : "Ok",
"suffix" : "pango2",
"type" : "USER_PASS"
}
]
}
Отключение функциональности#
Настройка параметров подключения производится при первоначальной настройке кластера Pangolin или при изменении настроек хранилища секретов (или сертификатов). Специальные команды для отключения функциональности отсутствуют.
Задание уровня логирования сообщений о загрузке параметров из защищенного хранилища#
Значение параметра secure_config_log_level задает уровень логирования на котором будут выводиться сообщения о загрузке параметров из защищенного хранилища. Значение по умолчанию: LOG. Для уменьшения размера лога установить значение меньше чем log_min_messages.
Параметр может быть установлен как в файле конфигурации, так и командой:
ALTER SYSTEM SET secure_config_log_level = DEBUG1;
Обеспечение отказоустойчивости СУБД Pangolin при отказе хранилища секретов#
Отказоустойчивость обеспечивается:
сохранением параметров и их хранением в засекреченных файлах;
наличием модуля хранения засекреченных сертификатов;
отдельным конфигурационным параметром срока актуальности сохраненных параметров;
валидностью кеша на период его времени жизни, в том числе при отключении функциональности;
обновлением кеша при смене параметров в случае успешного подключения и использование кешированных параметров в случае неуспешного;
Засекреченный дамп хранится в виде файлов, не доступныx для перекодирования и использования на другой установке. Алгоритм засекречивания основывается на информации о системных параметрах и защищен от перекодирования.
Внимание
Кеширование данных происходит только при включенных функциональностях обращения к хранилищу секретов. При отключении функциональности кеш сохраняется и инвалидируется по истечении vault_cache_expiration_timeout.
Перекодирование сохраненных дампов невозможно. При изменении параметров оборудования дамп станет невалидным.
По умолчанию функциональность выключена. Включение происходит установкой параметра enable_vault_params_cache в значение on одновременно локально и в хранилище параметров. Локально функциональность может быть установлена как вручную, так и командой:
ALTER SYSTEM SET enable_vault_params_cache = on;
Внимание
Перед включением функциональности убедитесь в том, что значение параметра secure_config = on.
Время жизни дампа контролируется параметром vault_cache_expiration_timeout. Параметр имеет значение по умолчанию (1 месяц) источником параметра является хранилище секретов, значение параметра — строка в формате interval.
Имеется возможность кеширования сертификатов. По умолчанию значение параметра - on:
show enable_vault_certificates_cache;
Кеширование серверных и клиентских сертификатов в Pangolin Pooler настраиваются следующими параметрами:
server_tls_enable_vault_certificates_cache = 0
client_tls_enable_vault_certificates_cache = 0
Начиная с версии 6.4.0, был добавлен новый источник конфигурационных параметров vault cache, присваиваемый параметру при восстановлении его из кеша. Например, для enabled_extra_auth_methods при восстановлении от кеша:
SELECT source FROM pg_settings WHERE name = 'enabled_extra_auth_methods';
vault cache
Также имеется возможность настройки старта отсчета времени жизни кеша:
с его последнего успешного формирования;
c первого неуспешного взаимодействия с хранилищем.
Поведение настраивается параметром vault_cache_expiration_at_fault, значение по умолчанию on. Если параметр включен, то отсчет времени жизни ведется с первого неуспешного взаимодействия с хранилищем секретов/сертификатов.
Реализованы функции мониторинга оставшегося времени жизни кеша для сертификатов:
SELECT certificate_cache_expired_at();
и для конфигурационных параметров/ключей кодирования:
SELECT params_cache_expired_at();
Данные функции возвращают одно из следующих значений в зависимости от состояния кеша и функциональности:
при истечении времени жизни:
Vault cache will be expired at: expiredесли истечение времени жизни еще не началось:
Vault cache will be expired at: expiration not started yetво время истечения времени жизни:
Vault cache will be expired at: years: \d* month: \d* days: \d* hours: \d* minutes: \d* seconds: \d*
Также время жизни кеша может быть возвращено в формате interval:
select params_cache_expired_at_interval();
params_cache_expired_at_interval
----------------------------------
365 days 23:59:42.451545
select certificate_cache_expired_at_interval();
params_cache_expired_at_interval
----------------------------------
365 days 23:59:42.451545
В случае, соответствующем expired:
select params_cache_expired_at_interval();
params_cache_expired_at_interval
----------------------------------
00:00:00
select certificate_cache_expired_at_interval();
params_cache_expired_at_interval
----------------------------------
00:00:00
В случае, соответствующем expiration not started yet:
select params_cache_expired_at_interval();
params_cache_expired_at_interval
----------------------------------
-1 mons -1 days -00:00:00.000001
(1 row)
select certificate_cache_expired_at_interval();
params_cache_expired_at_interval
----------------------------------
-1 mons -1 days -00:00:00.000001
(1 row)
Функция, возвращающая признак работы от кеша сертификатов/параметров:
SELECT vault_cache_usage();
В зависимости от источника данных сообщение будет содержать признак cache или vault:
postgres=# select * from vault_cache_usage();
cache | source
--------------+--------
params | vault/cache
certificates | vault/cache
(2 rows)
Поведение при отсутствии параметра secure_config в кластере:
В этом случае кластер считается невалидным и при возможности будет произведен запуск от кешированных параметров. В логах присутствуют соответствующие сообщения:
WARNING: parameter "secure_config" does not exist on KMS
WARNING: postgres: Try to restore cached parameters
LOG: Enabled vault cache mode: enabled
WARNING: Parameter secure_config restored from local cache
Использование функциональности#
Ниже рассмотрены четыре сценария с включенной и выключенной функциональностью:
При выключенной функциональности и успешном подключении, преобразованные файлы дампа не создаются. База данных запускается успешно.
При выключенной функциональности и неуспешном подключении преобразованные файлы дампа не создаются. База данных не может запуститься, в логах появится ошибка подключения к хранилищу секретов.
При включенной функциональности и успешном подключении создаются преобразованные файлы дампа. База данных запускается штатно.
При включенной функциональности и неуспешном соединении в случае наличия кеша по итогу успешного подключения ранее будут использоваться параметры кеша. При отсутствии кеша или его повреждении база данных не может начать свою работу и завершается с ошибкой в логе.
Примечание
Сценарий под номером 4 аналогичен и для файлов сертификатов.
Другой причиной невозможности запуска базы данных является истечение срока службы данных (vault_cache_expiration_timeout). При этом СУБД Pangolin не будет остановлен, если vault_cache_expiration_timeout истек уже во время его работы. Проверка происходит только при обращении к хранилищу секретов.
Причины ошибки при запуске с включенной функциональностью:
повреждение засекреченных параметров;
повреждение сохраненных засекреченных файлов сертификатов;
повреждение сохраненных засекреченных ключей;
смена параметров оборудования;
истечение срока давности кеша.