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
    
    "�|$�����j�'#��^-�3D%��w�k^���ɉ��N��1Ǹ�GQ�f�&p��q<�e���R��J4?/l��F@:����
    �h^���V�!x?�
    L��?4Y���_OP��R��*
    

Утилита 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@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 srv-64-114.db.dev.sbt setup_kms_credentials[102792]: Credentials for Secret storage has been added successfully
May 21 15:44:50 srv-64-114.db.dev.sbt 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-{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@srv-64-96 ~]$ /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@srv-64-96 ~]$ /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@srv-64-96 ~]$ /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@srv-64-96 ~]$ /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@srv-64-96 ~]$ /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@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-{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@srv-64-96 ~]$ /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 или при изменении настроек хранилища секретов (или сертификатов). Специальные команды для отключения функциональности отсутствуют.

Обеспечение отказоустойчивости СУБД 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 истек уже во время его работы. Проверка происходит только при обращении к Хранилищу секретов.

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

  • повреждение шифрованных параметров;

  • повреждение сохраненных шифрованных файлов сертификатов;

  • повреждение сохраненных шифрованных ключей;

  • смена параметров оборудования;

  • истечение срока давности кеша.