Перейти к основному содержимому

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:

Пример структуры хранения ключей в 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 = postgresql
  • enc_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 — ключ кодирования объекта в засекреченном виде;
    • objectIdoid объекта, которому назначен соответствующий ключ засекречивания. Для WAL должен быть null;
    • pgObjectType — тип объекта, которому назначен соответствующий ключ засекречивания. W — WAL, T — табличное пространство, R — отношение.

Установка и настройка HashiCorp Vault

  1. Cкачайте и распакуйте дистрибутив Vault, перенесите распакованный дистрибутив в директорию /usr/local/bin/:

    $ unzip vault_${VAULT_VERSION}_linux_amd64.zip

    $ sudo mv ./vault /usr/local/bin/
  2. Cоздайте пользователя Vault:

    $ sudo useradd --system --home /etc/vault --shell /bin/false vault
  3. Cоздайте директории для хранения настроек и данных:

    $ sudo mkdir /etc/vault
    $ sudo mkdir -p /var/lib/vault/data
  4. Cоздайте службу Vault (скопируйте файл vault.service на сервер в директорию /etc/systemd/system/):

    sudo cp ./vault.service /etc/systemd/system/
  5. Cоздайте конфигурационный файл Vault (скопируйте файл config.hcl на сервер в директорию /etc/vault/):

    $ sudo cp ./config.hcl /etc/vault/
  6. Создайте директории /ca, ca/signedcerts, ca/private:

    $ cd ~/ && mkdir ca && mkdir -p ca/signedcerts && mkdir ca/private && cd ca
  7. Создайте индексные данные БД:

    $ echo '01' > serial && touch index.txt && echo 'unique_subject = yes' > index.txt.attr
  8. Создайте корневой сертификат/ключ, изменив в файле caconfig.cnf путь на корректный к директории ca:

    • в параметре dir в секции local_ca;
    • в параметре default_keyfile в секции req.
  9. Скопируйте файл на сервер в директорию ~/ca:

    $ export OPENSSL_CONF=~/ca/caconfig.cnf
    $ openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825
    Введите пароль "test"
  10. Сгенерируйте ключ и создайте запрос на серверный сертификат (предварительно добавьте в конец файла 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"
  11. Декодируйте ключ:

    $ openssl rsa < key.pem > server_key.pem
  12. Сгенерируйте и подпишите серверный сертификат:

    $ export OPENSSL_CONF=~/ca/caconfig.cnf
    $ openssl ca -in req.pem -out server_crt.pem
    Введите пароль "test"
  13. Скопируйте ключ, серверный и корневой сертфиикаты в директорию /etc/vault/:

    $ sudo cp server_key.pem server_crt.pem cacert.pem /etc/vault/
  14. Назначьте владельцем пользователя Vault:

    $ sudo chown -R vault:vault /etc/vault /var/lib/vault
  15. Настройте автодополнение команд Vault:

    $ vault -autocomplete-install
    $ complete -C /usr/local/bin/vault vault
  16. Включите запуск Vault при загрузке системы:

    $ sudo systemctl daemon-reload
    $ sudo systemctl enable --now vault
  17. Запустите Vault:

    $ sudo systemctl start vault
  18. Проинициализируйте 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'
  19. Введите 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 ...'
  20. Разрешите аутентификацию по логину/паролю:

    $ 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/
  21. Установите логин/пароль:

    $ 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
  22. Через Web UI выполните аутентификацию пользователя на сервере Vault https://{IP-адрес настройки Vault-сервера}:{Порт}. Для аутентификации используйте токен:

    Аутентификация пользователя

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

    Вкладка Secrets

    Secret engines

    Enable secret engine

    Enable KV-engine

  24. Добавьте разрешения для выполнения операций с Key-Value-хранилищем, выбрав: Policies (1) -> default (2) -> Edit policy (3). Добавьте в конец (4) -> нажмите сохранить Save (5):

    path "kv/*" {
    capabilities = ["create", "update", "read", "delete", "list"]
    }

    Вкладка Policies

    ACL policies

    Enable secret engine

    Enable KV-engine

  25. Получите клиентский токен для последующих обращений к 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":"ea854659-6a63-orphan":true}}
  26. В последующих запросах можно использовать "client_token":"{Токен}". Например:

    $ curl --insecure --header "X-Vault-Token:{Токен} --request GET https://{IP-адрес}:{Порт}/v1/kv/data/

Добавление параметров в Хранилище секретов

Перед первоначальной настройкой механизма защиты данных от привилегированных пользователей в Pangolin необходимо выполнить добавление параметров в Key/Secret Management System на сервере с установленным HashiCorp Vault.

  1. Выполните аутентификацию пользователя на сервере Vault {IP адрес сервера, на котором производится настройка Vault}:{}Порт}. Для аутентификации используйте клиентский токен:

    Sign to Vault

  2. Зайдите в Key-Value-хранилище и нажмите Create secret (1):

    Create Secret

  3. В поле Path for this secret (2) укажите путь к параметру postgresql/CLUSTER_ID/postgresql/ИМЯ_ПАРАМЕТРА, где: CLUSTER_ID - имя кластера (должен быть уникальным для каждого кластера), ИМЯ_ПАРАМЕТРА = secure_config.

  4. В поле Version data (3, 4) укажите:

    • имя параметра = value;
    • значение = off;

    В случае отсутствии указанного значения параметра при старте БД в момент соединения с KMS и считывания параметров возникнет ошибка: CheckSecureConfig: secure_config parameter does not exist on KMS or has wrong value.

  5. Сохраните, нажав кнопку Save (5):

    Create Secret Interface

    Менять значение параметра можно, нажав Create new version справа:

    Change param

    Там же можно удалить параметр, нажав на кнопку Delete secret:

    Delete param

  6. Далее добавьте остальные параметры (в соответствии с заданными локальными параметрами в конфигурационном файле /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):

    Create Secret

    В поле Version data (8, 9, 10) укажите:

    • имя параметра = value;
    • соответствующее значение.

    Нажмите кнопку Save:

    Create Secret

Защита параметров конфигурации

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

Настроечные параметры PostgreSQL

Полный список настроечных параметров, управляемых администраторами безопасности через VAULT в режиме защищенного конфигурирования, находится в таблице документа «Конфигурационные параметры».

Инструкция по добавлению параметров в Хранилище приведена в подразделе «Добавление параметров в Хранилище секретов» раздела «HashiCorp Vault и KMS-заменитель» документа «Инструкции и рекомендации».

Ниже будут описаны внесенные изменения в рамках настройки некоторых из них в режиме защищенного конфигурирования.

Параметры, выведенные из хранения в защищенном хранилище/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 необходимо выполнить последовательно следующие действия:

  1. Остановить работу vault:

    $ sudo systemctl stop vault
  2. Скачать дистрибутив vault, распаковать и перенести в директорию /usr/local/bin/:

    $ unzip vault_${VAULT_VERSION}_linux_amd64.zip
    $ sudo mv vault /usr/local/bin/
  3. Запустить vault:

    $ sudo systemctl start vault

Возможные проблемы и их решение при работе HashiCorp Vault

В случае перезагрузки (рестарта) сервера с Vault? либо рестарта сервиса Vault, Хранилище переходит в состояние SEALED:

Sealed status

Для восстановления:

  1. Зайдите на сервер с установленным 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.
  2. Поочередно введите 3 ключа в Unseal из списка (Unseal Key 1, Unseal Key 2, Unseal Key 3):

    Unseal keys

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

Подготовка файлов

  1. Выполните генерацию мастер-ключа с помощью утилиты 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}
  2. Создайте файл со статическими параметрами /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}
  3. Создайте файл с динамическими параметрами /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
  4. Скопируйте подготовленные файлы на Standby-узел:

    scp /etc/postgres/kms_*.cfg postgres@{{ replica_ip }}:/etc/postgres
  5. Выдайте права 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
  6. Выполните вход администратором ИБ:

    $ su - kmadmin_pg
  7. Закодируйте файл со статическими параметрами (сначала на 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
  8. Убедитесь, что файл со статическими параметрами засекречен:

    $ 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-6.5.0/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@srv-64-96 ~]$ 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@srv-64-96 ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials delete --index=0 --skip-confirm

[kmadmin_pg@srv-64-96 ~]$ 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@srv-64-96 ~]$ /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@srv-64-96 ~]$ ls -lh /etc/postgres/enc_connection_settings.cfg
ls: cannot access '/etc/postgres/enc_connection_settings.cfg': No such file or directory

[kmadmin_pg@srv-64-96 ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials show
No credentials specified

[kmadmin_pg@srv-64-96 ~]$ /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@srv-64-96 ~]$ 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@srv-64-96 ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials deleteall --purpose=certs --skip-confirm

[kmadmin_pg@srv-64-96 ~]$ 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@srv-64-96 ~]$ 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@srv-64-96 ~]$ 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@srv-64-96 ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials deleteall --purpose=secrets --skip-confirm

[kmadmin_pg@srv-64-96 ~]$ ls -lh /etc/postgres/enc_connection_settings.cfg
ls: cannot access '/etc/postgres/enc_connection_settings.cfg': No such file or directory

[kmadmin_pg@srv-64-96 ~]$ 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@srv-64-96 ~]$ ls -lh /etc/postgres/enc_connection_settings.cfg
ls: cannot access '/etc/postgres/enc_connection_settings.cfg': No such file or directory

[kmadmin_pg@srv-64-96 ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials deleteall --purpose=secrets --skip-confirm
File enc_connection_settings.cfg does not exist

[kmadmin_pg@srv-64-96 ~]$ 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@srv-64-96 ~]$ /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@srv-64-96 ~]$ /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@srv-64-96 ~]$ /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@srv-64-96 ~]$ /usr/pangolin-6.3.0/bin/setup_kms_credentials delete --index 1 --skip-confirm

Credentials for Secret storage has been removed successfully

[kmadmin_pg@srv-64-96 ~]$ exit
[pprb_dev@srv-64-96 ~]$ 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@srv-64-96 ~]$ /usr/pangolin-6.5.0/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@srv-64-96 ~]$ /usr/pangolin-6.5.0/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@srv-64-96 ~]$ /usr/pangolin-6.5.0/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@srv-64-96 ~]$ /usr/pangolin-6.5.0/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@srv-64-96 ~]$ /usr/pangolin-6.5.0/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@srv-64-96 ~]$ /usr/pangolin-6.5.0/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@srv-64-96 ~]$ /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-6.5.0/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@srv-64-96 ~]$ /usr/pangolin-6.5.0/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-6.5.0/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-6.5.0/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.

Перешифрование сохраненных дампов невозможно. При изменении параметров оборудования дамп станет невалидным.

API решения

По умолчанию функциональность выключена. Включение происходит установкой параметра 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

Использование функциональности

Ниже рассмотрены четыре сценария с включенной и выключенной функциональностью:

  1. При выключенной функциональности и успешном подключении шифрованные файлы дампа не создаются. База данных запускается успешно.
  2. При выключенной функциональности и неуспешном подключении шифрованные файлы дампа не создаются. База данных не может запуститься, в логах появится ошибка подключения к хранилищу секретов.
  3. При включенной функциональности и успешном подключении создаются шифрованные файлы дампа. База данных запускается штатно.
  4. При включенной функциональности и неуспешном соединении в случае наличия кеша по итогу успешного подключения ранее будут использоваться параметры кеша. При отсутствии кеша или его повреждении база данных не может начать свою работу и завершается с ошибкой в логе.

Примечание:

Сценарий под номером 4 аналогичен и для файлов сертификатов.

Другой причиной невозможности запуска базы данных является истечение срока службы данных (vault_cache_expiration_timeout). При этом СУБД Pangolin не будет остановлен, если vault_cache_expiration_timeout истек уже во время его работы. Проверка происходит только при обращении к Хранилищу секретов.

Причины ошибки при запуске с включенной функциональностью:

  • повреждение шифрованных параметров;
  • повреждение сохраненных шифрованных файлов сертификатов;
  • повреждение сохраненных шифрованных ключей;
  • смена параметров оборудования;
  • истечение срока давности кеша.