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

Подключение СЗИ

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

Внимание!

Подключение СЗИ осуществляется от пользователя с правами sudo, пользователя postgres и пользователя администратора безопасности (в качестве примера взят kmadmin_pg).

Подключение СЗИ доступно двумя способами:

Автоматическое подключение СЗИ

Перед началом запуска сценария подключения рекомендуется выполнить настройку параметров. Перечень доступных параметров находится в разделе «Список доступных конфигурационных параметров для автоматизированной настройки СЗИ» документа «Справочная информация».

Особенности логики работы некоторых параметров пользовательского конфигурационного файла (config.yml):

  • параметр tde контролирует включение шифрования данных. Значение по умолчанию true;
  • параметр secure_config контролирует включение защиты конфигурации. Значение по умолчанию true;
  • параметр admin_protection подразумевает подключение только защиты от привилегированных пользователей. Значение по умолчанию true.

Вышеупомянутые параметры располагаются в блоке TYPE IST.

примечание

Утилиты initprotection/setup_kms_credentials обернуты в Python-модуль. Это позволяет исключить возможные зависания при передаче некорректного значения и организацией вызова утилиты initprotection от Linux-пользователя администратора безопасности.

Организована возможность передать имя пользователя с привилегиями на запуск инициализации механизма защиты данных и запуск инициализации подключения к защищенному хранилищу, контролируется параметром target_linux_user, значение по умолчанию: kmadmin_pg. Располагается в блоке SETTINGS INIT PROCESS. Скрипты по подключению СЗИ не вносят изменения в файл sudoers для данного пользователя и не корректируют права владельца на запуск утилит initprotection и setup_kms_credentials. Все необходимые права на запуск должны быть выданы до старта скриптов по подключению СЗИ.

Тип объединенного параметра адреса узла и порта VAULT VAULT_HOST_PORT соответствует list. Ограничений в количестве элементов списка нет. Располагаются в блоке CONNECTION VAULT PARAMETERS.

Параметр add_connection_string_to_hba отвечает за добавление строк подключения для созданных в процессе инициализации механизма защиты данных пользователей. Значение по умолчанию true. Располагается в блоке ADMIN PROTECTION SETTINGS. В случае, если параметр будет принимать значение false, в конфигурационный файл pg_hba.conf будет добавлен следующий комментарий:

# The connection string for security administrators is formed implicitly

Для каждой УЗ администратора безопасности можно задать индивидуальные правила подключения в параметре admin_protection_users. Параметры настройки располагаются в блоке ADMIN PROTECTION SETTINGS.

Параметр pg_encryption_keys_capacity задает настройку БД при подключении TDE, располагается в блоке CONFIGURATION PARAMETERS. Параметры dynamic_shared_memory_type и mkeychecker_delay в локальную конфигурацию не включены.

Подключения СЗИ при помощи Pangolin Installer

Выполните шаги:

  1. Произведите проверку наличия установленного пакета pangolin-installer-venv-controller версии продукта для которой планируется настройка СЗИ:

    dnf list installed | grep pangolin-installer-venv-controller

    В случае отсутствия данного пакета произведите его установку:

    dnf install -y pangolin-installer-venv-controller
  2. Активируйте виртуальное окружение для запуска скрипта:

    source /opt/pangolin-installer/bin/activate
  3. Заполните config.yml необходимыми конфигурационными параметрами для настройки СЗИ.

  4. Перейдите в каталог installer распакованного дистрибутива:

    cd <distrib_path>/installer

    Где distrib_path - абсолютный путь до распакованного дистрибутива.

  5. Запустите подключения СЗИ, для этого выполните следующую команду:

    pangolin-installer terminal -c <path_to_config>/config.yml -a configure_ist

    Где <path_to_config> - полный путь к конфигурационному файлу config.yml.

Проверки и информационные сообщения процесса подключения СЗИ

Проверка работоспособности с хранилищем секретов

Чтобы убедиться в том, что при запуске СУБД Pangolin происходит запрос сертификатов, выполните следующие действия:

  1. Запустите перехват сетевого трафика порту, где работает эмулятор SecMan:

    tshark -PV -C Custom -w outfile -i ens192 -f "tcp port <port>" 2>&1 | less
  2. Запустите СУБД Pangolin вручную посредством pg_ctl:

    pg_ctl start -D $PGDATA
  3. Проверьте в лог-файле сообщения о подключении к SecMan и получении сертификатов.

    Ожидаемый результат:

    Лог содержит сообщения:

    LOG:  Fetch certificate from SecMan.
    LOG: certificate, private key and certificate chain are loaded from PKCS#12 specified in file
  4. Остановите перехват трафика, и проверьте наличие пакетов обмена данными с эмулятором SecMan.

    Ожидаемый результат:

    Также в сетевом трафике присутствуют пакеты обмена данными с эмулятором SecMan:

    Transmission Control Protocol, Src Port: 8201, Dst Port:

    "certificate": "MIIJgQIBAzCCCUcGCSqGSIb3DQ...
    "expires": "2023-12-02T11:50:57Z",\n

Проверка пользователей

Если пользователи для успешного сценария подключения СЗИ на стенде отсутствуют, то выводится блокирующая дальнейшее выполнение сценария ошибка:

"FAIL__На хосте {{ ansible_fqdn }} не был обнаружен пользователь {}. На текущий момент подключение СЗИ невозможно, необходимо выполнить проверку корректного заполнения параметра target_linux_user в пользовательском конфигурационном файле '{}' или произвести создание пользователя. После произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка актуального master-узла

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

"FAIL__Текущий мастер в СУБД не соответствует значению, полученному из SM. На текущий момент подключение СЗИ невозможно, необходимо выполнить switchover__.FAIL"

Проверка файлов сертификатов

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

"FAIL__Сертификат'{}' не существует. Необходимо указать корректный путь.__FAIL"

Роль получает текущее значение следующих переменных:

Проверка наличия переменных окружения

Переменные окружения, которые необходимо проверить:

  • PGDATA;
  • PGHOME;
  • CLNAME;
  • PGPORT.

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

"FAIL__{PARAM} на хосте {{ ansible_fqdn }} отсутствует. Актуализируйте значение '{PARAM}' в файле /home/postgres/.bash_profile.__FAIL"

Проверка запуска СУБД

Если СУБД Pangolin не запущена, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__СУБД Pangolin не запущена. Дальнейшее подключение СЗИ невозможно.
Произведите проверку состояния СУБД Pangolin на сервере и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка запуска Pangolin Manager

Если служба Pangolin Manager не запущена, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Служба Pangolin Manager не запущена. Дальнейшее подключение СЗИ невозможно. Произведите проверку состояния службы Pangolin Manager на сервере и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка установки параметров в true

Если ни один из параметров, которые контролируют подключение СЗИ, не выставлен в true, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Не удалось сформировать список СЗИ к подключению. Скорректируйте значения в кастомном конфигурационном слое и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка символьных ссылок

Если символьная ссылка до плагина, контролирующего подключение к серверу VAULT, на стенде выставлена некорректно, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Подключение СЗИ на стенде возможно только с физическим(ими) сервером(ами) VAULT. Произведите проверку символьной ссылки до плагина: '{}' или переведите стенд на использование физического VAULT сервера. После произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка утилит setup_kms_credentials/initprotection

Если на стенде не была обнаружена утилита setup_kms_credentials или initprotection, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Утилита '{}' на стенде не обнаружена. Дальнейшее подключение выбранных СЗИ невозможно.
Произведите целостность данных в каталоге '{}'/bin и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка доступности серверов

Если ни один сервер из заданного списка недоступен, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Не удалось установить успешное подключение ни к одному из сервера(ов) VAULT. Проверьте корректность переданных параметров подключения к защищенному(ым) хранилищу(щам) VAULT в конфигурационном файле '{}'. После произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка списка УЗ администраторов

Если список УЗ администраторов безопасности был передан не в полном объеме, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Проверка входных параметров для инициализации механизма защиты данных не дала ожидаемый результат. Параметры УЗ администраторов безопасности были переданы неверно или не в полном объеме. Скорректируйте параметры в кастомном конфигурационном файле '{}', относящиеся к конфигурированию УЗ администраторов безопасности и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка метода засекречивания паролей УЗ администраторов безопасности

Если пароли для УЗ администраторов безопасности были заданы не методом SCRAM-SHA-256, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Проверка входных параметров для инициализации механизма защиты данных не дала ожидаемый результат. Пароли УЗ администраторов безопасности не были переданы в виде SCRAM-SHA-256. Скорректируйте параметры паролей для УЗ администраторов безопасности в кастомном конфигурационном файле '{}' и произведите повторный запуск скрипта по подключению СЗИ. __FAILL"

Проверка получения параметров VAULT_CLUSTER_ID, VAULT_LOGIN, VAULT_PASSWORD

Роль получает на вход параметры:

  • VAULT_CLUSTER_ID;
  • VAULT_LOGIN;
  • VAULT_PASSWORD;
  • VAULT_HOST_PORT.

Если для одного из них было передано пустое значение, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Проверка входных параметров для инициализации подключения к защищенному(ым) хранилищу(ам) VAULT не дала ожидаемый результат. Значение для параметра '{}' не должно быть пустым. Скорректируйте параметры '{}' в кастомном конфигурационном файле '{}' и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка значение параметра VAULT_HOST_PORT

Если значение для параметра VAULT_HOST_PORT было передано в некорректном формате, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Проверка входных параметров для инициализации подключения к защищенному(ым) хранилищу(ам) VAULT не дала ожидаемый результат. Значение для параметра '{}' указано в неверном формате. Скорректируйте параметры '{}' в кастомном конфигурационном файле '{}' и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка наличия VAULT_CLUSTER_ID на защищенном хранилище VAULT

В случае отсутствия выводится ошибка вида:

"FAIL__cluster id - '{}' в защищенном хранилище VAULT '{}' не обнаружен. Дальнейшее подключение невозможно. Произведите проверку на предмет корректно сконфигурированого id на сервере VAULT и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка значение параметра VAULT_CLUSTER_ID

Если значение для параметра VAULT_CLUSTER_ID было передано в некорректном формате, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Проверка входных параметров для инициализации подключения к защищенному(ым) хранилищу(ам) VAULT не дала ожидаемый результат. Значение для параметра '{}' не должно начинаться или заканчиваться кавычками. Скорректируйте параметры '{}' в кастомном конфигурационном файле '{}' и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Получение общего списка параметров из защищенного хранилища VAULT

При возникновении ошибок в ходе получения общего списка параметров защищенного хранилища выводится ошибка вида:

"FAIL__В процессе получения списка параметров из защищенного хранилища VAULT возникли ошибки: {}. Произведите проверку состояния VAULT сервера(ов) и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка корректного значения для параметра secure_config на защищенном хранилище VAULT

Значение on устанавливается, если планируется подключение защиты параметров конфигурации, значение off используется, если подключение защиты параметров конфигурации не планируется.

В случае возникновения проблем выводится ошибка вида:

"FAIL__Для подключения выбранных СЗИ значение для параметра secure_config должен быть выставлено в {} на защищенном хранилище VAULT. Скорректируйте значение для параметра на защищенном хранилище VAULT и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка корректного значения для параметра is_tde_on на защищенном хранилище VAULT

Если планируется подключение TDE, ожидается значение on/true. В случае, когда подключение TDE не планируется, устанавливается значение off/false.

При некорректном значении параметра выводится следующая ошибка:

"FAIL__Для подключения выбранных СЗИ значение для параметра is_tde_on должен быть выставлено в {} на защищенном хранилище VAULT. Скорректируйте значение для параметра на защищенном хранилище VAULT и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка идентичности значений pg_ident на защищенном хранилище VAULT и в локальном конфигурационном файле

В случае неидентичности значений выводится ошибка вида:

"FAIL__Для подключения выбранных СЗИ значение для параметра pg_ident на защищенном хранилище VAULT должно соответствовать значению в локальном конфигурационном файле '{}/pg_ident.conf'. Синхронизируйте значения и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

Проверка готовности защищенного хранилища VAULT к последующему подключению выбранных СЗИ посредством secret_storage_client

Утилита secret_storage_client входит в состав дистрибутива и поставляется в рамках rpm/deb-пакета в каталоге utilities/. На вход скрипты, использующие данную утилиту для проверки, ожидают корректно переданный путь к каталогу с утилитами utilities/ в переменную utility_path в строку запуска ansible. При отсутствии утилиты по переданному пути в лог будет выведено предупреждающее сообщение. Процесс подключения при этом не останавливается.

В случае когда по переданному пути утилита не будет найдена, выведется предупреждение:

"WARNING__По переданному пути '{}' утилита secret_storage_client не обнаружена. Проверки готовности защищенного хранилища VAULT к подключению выбранных СЗИ будут пропущены.__WARNING"

Сообщения об успешном прохождении проверок

"INFO__Список СЗИ к подключению успешно сформирован. В процессе работы скрипта будет подключено: {}.__INFO"
"INFO__Проверка доступности VAULT сервера(ов) прошла успешно.__INFO"

Проверки и информационные сообщения после подключения выбранного списка СЗИ

Проверка наличия конфигурационного файла VAULT после работы утилиты setup_kms_credentials

В случае, когда файл не был найден, будет выведена ошибка:

"FAIL__Конфигурационный файл VAULT '{}' не был обнаружен. Причина может быть в некорректной работе утилиты setup_kms_credentials. Лог работы утилиты: {}__FAIL"

Проверка успешного подключения

Если после работы утилиты setup_kms_credentials не удалось установить ни одного успешного подключения, то выводится следующее сообщение в лог:

"FAIL__Не удалось установить ни одного успешного подключения к защищенному(ым) хранилищу(ам) VAULT. Возникли следующие ошибки: {}. Проверьте доступность сервера(ов) VAULT и корректность переданных параметров в кастомном конфигурационном файле '{}'.__FAIL"

Проверка работа утилиты initprotection

Если работа утилиты initprotection завершилась неудачей, то выводится следующее сообщение в лог:

"FAIL__В процессе инициализации механизма защиты данных возникли ошибки: '{}'.__FAIL"

Проверка состояния стенда

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

"FAIL__В процессе работы скриптов что-то пошло не так. TDE на текущем стенде не включено. Произведите проверку параметра по включению TDE в конфигурационном файле или на сервере(ах) VAULT.__FAIL"
"FAIL__В процессе работы скриптов что-то пошло не так. Защита конфигурации на текущем стенде не включена. Произведите проверку параметра secure_config на сервере(ах) VAULT.__FAIL"
"FAIL__В процессе работы скриптов что-то пошло не так. Защита данных от привилегированных пользователей на текущем стенде не включена.__FAIL"

Сообщения об успешном прохождении проверок

"INFO__Проверка наличия конфигурации VAULT прошла успешно.__INFO"
"INFO__Инициализация механизма защиты данных выполнена успешно.__INFO"
"INFO__Итоговая проверка подключения tde, admin_protection, secure_config завершилась успешно.__INFO"

Ручное подключение СЗИ

В СУБД Pangolin реализована интеграция с системами управления ключами (Key Management System, KMS): HashiCorp Vault, системой хранения секретов ОдинКлюч и с KMS-заменителем (локальным файловым хранением секретов). В данном разделе рассматривается ручное подключение таких функциональностей, как защита данных от привилегированных пользователей, TDE (прозрачное защитное преобразование данных) и защита параметров конфигурации.

Внимание!

Подключение СЗИ осуществляется от пользователя с правами sudo, пользователя postgres и пользователя администратора безопасности (в качестве примера взят kmadmin_pg).

Ручное подключение СЗИ доступно в двух вариациях:

Обозначения

Далее в разделе будут использоваться следующие обозначения:

  • <PGDATA> – путь к каталогу данных СУБД;
  • {major_version} – мажорная версия СУБД (текущая 8);
  • {cluster_id} – идентификатор (ID) кластера в системе;
  • <IP-Address> – IP-адрес узла сервера;
  • <port>– порт узла сервера;
  • <name security administrator> – имя пользователя СУБД роли администратора безопасности.

Ручное подключение СЗИ с хранилищем секретов

Общие подготовительные действия

  1. Перед началом подключения необходимо:
  • выполните команду CHECKPOINT на первом узле (мастер);
  • убедитесь, что WAL передан на реплику (SELECT replay_lsn = pg_current_wal_insert_lsn() FROM pg_stat_replication возвращает true);
  • выполните команду CHECKPOINT на втором узле.
  1. Установите rpm/deb-пакет утилит безопасности из каталога utilities дистрибутива:

    sudo dnf install pangolin-security-utilities-{product_version}-{OS}.x86_64.rpm
    Подсказка

    Пример заполненной команды:

    cd distributive/utilities
    sudo dnf install -y pangolin-security-utilities-8.2.0-sberlinux9.x86_64.rpm
  2. Выключите БД на время ручного подключения СЗИ:

    • Если конфигурация standalone:

      sudo su - postgres
      /opt/pangolin-dbms-server/bin/pg_ctl stop -D $PGDATA

      Ожидаемый результат:

      waiting for server to shut down.... done
      server stopped
    • Если кластерная конфигурация (во избежание переключения, действие сначала производится на реплике, затем на мастере):

    sudo su - postgres
    sudo systemctl stop pangolin-manager

    Ожидаемый результат:

    sudo su - postgres
    list

    + Cluster: clustername ({cluster_id}) ---------------+---------+---------+----+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +-------------------------+--------------------------+---------+---------+----+-----------+
    | <IP-Address> | <IP-Address>:<port> | Replica | stopped | | unknown |
    | <IP-Address> | <IP-Address>:<port> | Replica | stopped | | unknown |
    +-------------------------+--------------------------+---------+---------+----+-----------+

Конфигурирование хранилища секретов

Внимание!

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

В качестве хранилища секретов в СУБД Pangolin используется HashiCorp Vault или ОдинКлюч. Создайте хранилище в необходимой системе хранения, и добавьте параметры из перечня защищаемых параметров.

Запустите утилиту setup_kms_credentials под пользователем kmadmin_pg для настройки подключения к созданному хранилищу секретов (на мастере и реплике). Пример настройки подключения к хранилищу секретов:

$ /opt/pangolin-security-utilities/bin/setup_kms_credentials -c <clustername> -h <IP-Address> -p <port> -u <postgresql> -t 1 -i <login>

Где:

  • <clustername> – идентификатор кластера в хранилище секретов;
  • <IP-Address> – IP-адрес хранилища секретов;
  • <port> - порт для подключения к хранилищу;
  • <postgresql> – суффикс пути (subdomain) в хранилище секретов;
  • ключ -t - отвечает за тип авторизации: 1 - для Userpass-авторизации, 2 - для AppRole-авторизации;
  • <login> - логин пользователя в хранилище секретов.

Пример заполненной команды:

setup_kms_credentials -c clustername -h 127.0.0.1 -p 8200 -u postgresql -t 1 -i admin

Enter password:
**************
Confirm password:
**************

Credentials for Secret storage has been set successfully

Пример команды для проверки подключения к хранилищу секретов HashiCorp Vault:

setup_kms_credentials show

Подключение защиты данных от привилегированных пользователей

Инициализируйте механизм защиты данных от привилегированных пользователей (только на мастере). Укажите каталог данных СУБД, имена администраторв безопасности БД (через запятую, если несколько), пароли для создаваемых администраторов безопасности передайте в открытом виде:

sudo su - kmadmin_pg
sudo -iu postgres -g kmadmin_pg /opt/pangolin-dbms-server/bin/initprotection
Enter PGDATA directory [/pgdata/0{major_version}/data]: <PGDATA>
Enter security administrator names (comma-separated):<name security administrator>,<name security administrator>
Enter new security admin password for user "<name security administrator>":
Enter it again:
Enter new security admin password for user "<name security administrator>":
Enter it again:

Ожидаемый результат:

Protection mechanism is initialized.
syncing data to disk

Подключение TDE (прозрачное защитное преобразование данных)

Выполните шаги:

  1. Измените значение параметра is_tde_on на on в хранилище секретов.

  2. Укажите значение параметра secure_config = off в хранилище секретов, если не планируется подключение защиты конфигурации.

  3. Укажите значение параметра is_tde_on = on в конфигурационном файле на сервере. В кластерной конфигурации повторите действие на реплике:

    sudo su - postgres
    • Для конфигурации standalone:

      vim $PGDATA/postgresql.conf

      Ожидаемый результат:

      grep is_tde_on $PGDATA/postgresql.conf
      is_tde_on = 'on'
    • Для кластерной конфигурации:

      vim /etc/pangolin-manager/postgres.yml

      Ожидаемый результат:

      grep is_tde_on /etc/pangolin-manager/postgres.yml
      is_tde_on: 'on'

Подключение защиты конфигурации

Для подключения защиты конфигурации измените значение параметра secure_config на on в хранилище секретов. Проверьте, и при необходимости добавьте, остальные параметры конфигурации.

Общие завершающие действия

Запустите СУБД:

  • Если конфигурация standalone:

    sudo su - postgres
    /opt/pangolin-dbms-server/bin/pg_ctl start -D $PGDATA

    Ожидаемый результат:

    done
    server started
  • Если конфигурация кластерная. Действие сначала производится на мастере, затем на реплике:

    sudo su - postgres
    sudo systemctl start pangolin-manager

    Ожидаемый результат:

    sudo su - postgres
    list

    + Cluster: clustername ({cluster_id}) -----------+--------------+---------+----+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +---------------------+--------------------------+--------------+---------+----+-----------+
    | <IP-Address> | <IP-Address>:<port> | Sync Standby | running | 2 | 0 |
    | <IP-Address> | <IP-Address>:<port> | Leader | running | 2 | |
    +---------------------+--------------------------+--------------+---------+----+-----------+

Проверка успешного включения функциональностей

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

  • Включение защиты параметров:

    SELECT current_setting('secure_config') AS secure_config;

    secure_config
    ---------------
    on
    (1 row)
  • Успешное включение защиты данных от привилегированных пользователей:

    SELECT check_admin_protect_is_on();

    check_admin_protect_is_on
    ---------------------------
    t
    (1 row)
  • Успешное включение TDE:

    SELECT * FROM check_tde_is_on();

    check_tde_is_on
    -----------------
    t
    (1 row)

Ручное подключение СЗИ с KMS-заменителем

Общие подготовительные действия

  1. Перед началом подключения необходимо:

    • выполнить команду CHECKPOINT на первом узле (мастер);
    • убедиться, что WAL передан на реплику (SELECT replay_lsn = pg_current_wal_insert_lsn() FROM pg_stat_replication возвращает true);
    • выполнить команду CHECKPOINT на втором узле.
  2. Установите rpm/deb-пакет утилит безопасности из каталога utilities дистрибутива:

    sudo dnf install pangolin-security-utilities-{product_version}-{OS}.x86_64.rpm
    Подсказка

    Пример заполненной команды:

    cd distributive/utilities
    sudo dnf install -y pangolin-security-utilities-8.2.0-sberlinux9.x86_64.rpm
  3. Выключите БД на время ручного подключения СЗИ:

    • Если конфигурация standalone:

      sudo su - postgres
      /opt/pangolin-dbms-server/bin/pg_ctl stop -D <PGDATA>

      Ожидаемый результат:

      waiting for server to shut down.... done
      server stopped
    • Если кластерная конфигурация, во избежание переключения, действие сначала производится на реплике, затем на мастере:

    sudo su - postgres
    sudo systemctl stop pangolin-manager

    Ожидаемый результат:

    sudo su - postgres
    list

    + Cluster: clustername ({cluster_id}) ---------------+---------+---------+----+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +-------------------------+--------------------------+---------+---------+----+-----------+
    | <IP-Address> | <IP-Address>:<port> | Replica | stopped | | unknown |
    | <IP-Address> | <IP-Address>:<port> | Replica | stopped | | unknown |
    +-------------------------+--------------------------+---------+---------+----+-----------+

Локальное конфигурирование

Внимание!

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

При использовании KMS-заменителя вместо хранилища секретов используются локальные конфигурационные файлы со статическими и динамическими параметрами.

Выполните шаги:

  1. Создайте файлы для хранения статических и динамических параметров. В кластерной конфигурации повторите это действие на реплике:

    sudo su
    touch /etc/pangolin-security-utilities/kms_dynamic_params.cfg
    touch /etc/pangolin-security-utilities/kms_static_params.cfg
    chown kmadmin_pg:pangolin_users /etc/pangolin-security-utilities/kms_dynamic_params.cfg
    chown kmadmin_pg:pangolin_users /etc/pangolin-security-utilities/kms_static_params.cfg

    Ожидаемый результат:

    ls -la /etc/pangolin-security-utilities
    -rw-r--r-- 1 kmadmin_pg pangolin_users 0 Nov 1 12:25 kms_dynamic_params.cfg
    -rw-r--r-- 1 kmadmin_pg pangolin_users 0 Nov 1 12:25 kms_static_params.cfg

    Файл со статическими параметрами имеет простой текстовый формат, каждая строка содержит пару: <имя ключа> = <значение для данного ключа>. Файл может содержать следующие параметры:

    • actual_master_key – метка актуального мастер-ключа;
    • actual_master_key_created = <timestamp> – параметр, содержащий дату и время установки/ротации мастер-ключа в формате YYYYMMDD_HHMMSS_MMM, где YYYY – год, MM – месяц, DD – день, HH – часы в формате 24 часа, MM – минуты, SS – секунды, MMM - миллисекунды;
    • master_key_value_00000000_000000_000 – значение мастер-ключа;
    • wal_key – значение ключа засекречивания WAL-журналов;
    • secret_dump_key – значение ключа кодирования ключей для создания дампа с помощью расширения secret_dump.
    Примечание

    При старте БД с использованием KMS-заменителя считывается параметрmaster_key_value_00000000_000000_000 из файла со статическими параметрами, поэтому значение метки мастер-ключа (actual_master_key) и имя мастер-ключа (master_key_value_<timestamp>) необходимо указать master_key_value_00000000_000000_000, иначе будет получена ошибка:

    Parameter master_key_value_00000000_000000_000 does not exist in static KMS config file
  2. Сгенерируйте 3 ключа (master_key, wal_key и secret_dump_key) с помощью утилиты generate_encryption_key на мастере:

    sudo su - kmadmin_pg
    /opt/pangolin-security-utilities/bin/generate_encryption_key

    Ожидаемый результат:

    Key was generated successfully. Key: {hash}
    Key was generated successfully. Key: {hash}
    Key was generated successfully. Key: {hash}
  3. Заполните файл со статическими параметрами, укажите master_key, wal_key и secret_dump_key полученные на предыдущем шаге. В кластерной конфигурации повторите это действие на реплике:

    sudo su - kmadmin_pg
    vim /etc/pangolin-security-utilities/kms_static_params.cfg

    Ожидаемый результат:

    cat /etc/pangolin-security-utilities/kms_static_params.cfg

    actual_master_key = master_key_value_00000000_000000_000
    actual_master_key_created = {timestamp}
    master_key_value_00000000_000000_000 = {hash}
    wal_key = {hash}
    secret_dump_key = {hash}

    Где:

    • {timestamp} – актуальные дата и время создания мастер-ключа, например, 20251101_070115_770. В случае, если установить в параметре actual_master_key_created значение 00000000_000000_000, то будет получена ошибка при вызове функции get_last_master_key_rotation_time():

      ERROR:  Failed to get last master key rotation time
    • {hash} – хеш ключей, полученный в пункте 2 с помощью утилиты generate_encryption_key.

  4. Засекретьте файл со статическими параметрами утилитой encrypt_params_file. В кластерной конфигурации повторите это действие на реплике:

    sudo su - kmadmin_pg
    /opt/pangolin-security-utilities/bin/encrypt_params_file

    Ожидаемый результат:

    Start to encrypt file: /etc/pangolin-security-utilities/kms_static_params.cfg
    File /etc/pangolin-security-utilities/kms_static_params.cfg was encrypted successfully
  5. Заполните файл с динамическими параметрами. В кластерной конфигурации повторите это действие на реплике:

    sudo su - kmadmin_pg
    vim /etc/pangolin-security-utilities/kms_dynamic_params.cfg

    Ожидаемый результат:

    cat /etc/pangolin-security-utilities/kms_dynamic_params.cfg
    secure_config = off
    is_tde_on = off
    allowed_servers =
    Примечание

    Если не требуется включение функциональности защиты конфигурации, то в файле с динамическими параметрами достаточно указать 2 параметраsecure_config = off и is_tde_on = on.

  6. Настройте подключение к локальному хранилищу секретов. Для этого запустите утилиту setup_kms_credentials под пользователем kmadmin_pg для настройки соединения (сначала на Active-узле, затем на Standby-узле). Обратите внимание, что не все параметры указываются при работе с KMS-заменителем. Действие сначала производится на мастере, затем на реплике:

    • Пример подключения к локальному хранилищу секретов с указанием необходимых параметров:

      $ /opt/pangolin-security-utilities/bin/setup_kms_credentials -c clustername -h 0.0.0.0 -p 8200 -u postgresql -t 1 -i adminencryption --no-check

      Enter password:
      **************
      Confirm password:
      **************

      Credentials for Secret storage has been set successfully
    • В интерактивном режиме:

      $ /opt/pangolin-security-utilities/bin/setup_kms_credentials --no-check

      Параметр --no-check отвечает за режим для отключения проверки параметров подключения к хранилищу секретов.

      Далее следуйте описанным шагам:

      1. Заполните необходимые параметры.

      2. Укажите имя своего кластера CLUSTER_ID:

        Enter Pangolin cluster ID:
        clustername <-

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

      3. Укажите файл или директорию с корневым центром сертификации:

        Enter root CA folder or file or leave empty:
        /pg_ssl <-
      4. Укажите suffix для доступа к хранилищу:

        Enter suffix or leave empty:
        postgresql <-
      5. Укажите IP-адрес хранилища секретов:

        Enter IP address or Domain Name of Secret storage:
        0.0.0.0 <-
      6. Укажите порт KMS:

        Enter port:
        8200 <-
      7. Выберите протокол https, нажав 2:

        Choose protocol type or leave empty to use default (https):
        1. http
        2. https <-

        2
      8. Выберите значение по умолчанию (kv), нажав enter:

        Enter secrets prefix or leave empty to use default (kv):
        enter <-
      9. Оставьте пустым пространство имен секретного хранилища, нажав enter:

        Enter Secret storage namespace or leave empty:
        enter <-
      10. Выберите Userpass Auth Method, нажав 1:

        Choose credentials type:
        1. Userpass Auth Method <-
        2. AppRole Auth Method

        1
      11. На сообщение о вводе точки авторизации, нажмите enter:

        Enter auth point or leave empty to use default (userpass):
        enter <-
      12. Введите логин и пароль администратора:

        Enter login:
        adminencryption <-

        Enter password:
        ****** <-
        Confirm password:
        ****** <-
      13. На сообщение о добавлении еще одних учетных данных KMS ответьте no:

        Do you want to add another Secret storage credentials? (yes/no)?:
        no <-
      14. При успешном добавлении параметров появится сообщение:

        Credentials for Secret storage has been set successfully
      15. Если при установке возникли проблемы, воспользуйтесь командой:

        /opt/pangolin-security-utilities/bin/setup_kms_credentials --help
      16. В результате настройки создан файл с параметрами соединения с KMS:

        /etc/pangolin-security-utilities/enc_connection_settings.cfg:
        -rw-r----- 1 kmadmin_pg pangolin_users 176 Oct 3 06:49 enc_connection_settings.cfg
  7. Переопределите символьную ссылку плагина на заменитель. В кластерной конфигурации повторите это действие на реплике.

    sudo su - postgres
    ln -sfr /opt/pangolin-dbms-server/lib/plugins/libkms_substitute_plugin.so /opt/pangolin-dbms-server/lib/libconnector_plugin.so

Подключение защиты данных от привилегированных пользователей

Инициализируйте механизм защиты данных от привилегированных пользователей (только на мастере). Укажите каталог данных СУБД, имена администратора безопасности БД (через запятую, если несколько), пароли для создаваемых администраторов безопасности передайте в открытом виде:

sudo su - kmadmin_pg
sudo -iu postgres -g kmadmin_pg /opt/pangolin-dbms-server/bin/initprotection
Enter PGDATA directory [/pgdata/0{major_version}/data]: <PGDATA>
Enter security administrator names (comma-separated):<name security administrator>,<name security administrator>
Enter new security admin password for user "<name security administrator>":
Enter it again:
Enter new security admin password for user "<name security administrator>":
Enter it again:

Ожидаемый результат:

Protection mechanism is initialized.
syncing data to disk

Подключение TDE (прозрачное защитное преобразование данных)

Выполните шаги:

  1. Проверьте значение secure_config в файле динамических параметров. В кластерной конфигурации повторите это действие на реплике:

    sudo su - kmadmin_pg
    cat /etc/pangolin-security-utilities/kms_dynamic_params.cfg

    Ожидаемый результат:

    secure_config = off
  2. Укажите значение параметра is_tde_on в конфигурационном файле. В кластерной конфигурации повторите действие на реплике:

    sudo su - postgres
    • Для конфигурации standalone:

      vim $PGDATA/postgresql.conf

      Ожидаемый результат:

      grep is_tde_on $PGDATA/postgresql.conf
      is_tde_on = 'on'
    • Для кластерной конфигурации:

      vim /etc/pangolin-manager/postgres.yml

      Ожидаемый результат:

      grep is_tde_on /etc/pangolin-manager/postgres.yml
      is_tde_on: 'on'

Подключение защиты конфигурации

Чтобы подключить защиту конфигурации, измените значение параметра secure_config на on в файле динамических параметров. Проверьте, и при необходимости добавьте, остальные параметры конфигурации. В кластерной конфигурации действие повторите на реплике:

sudo su - kmadmin_pg
vim /etc/pangolin-security-utilities/kms_dynamic_params.cfg

Ожидаемый результат:

cat /etc/pangolin-security-utilities/kms_dynamic_params.cfg

secure_config = on

Общие завершающие действия

Запустите СУБД:

  • Если конфигурация standalone:

    sudo su - postgres
    /opt/pangolin-dbms-server/bin/pg_ctl start -D $PGDATA

    Ожидаемый результат:

    done
    server started
  • Если конфигурация кластерная. Действие сначала произведите на мастере, затем на реплике:

    sudo su - postgres
    sudo systemctl start pangolin-manager

    Ожидаемый результат:

    sudo su - postgres
    list

    + Cluster: clustername ({cluster_id}) -----------+--------------+---------+----+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +---------------------+--------------------------+--------------+---------+----+-----------+
    | <IP-Address> | <IP-Address>:<port> | Sync Standby | running | 2 | 0 |
    | <IP-Address> | <IP-Address>:<port> | Leader | running | 2 | |
    +---------------------+--------------------------+--------------+---------+----+-----------+

    Ожидаемый результат в логе БД:

    LOG: KmsSubstituteConnector::GetValue clusterId: clustername subdomain ...

Проверка успешного включения функциональностей

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

  • Включение защиты параметров:

    SELECT current_setting('secure_config') AS secure_config;

    secure_config
    ---------------
    on
    (1 row)
  • Успешное включение защиты данных от привилегированных пользователей:

    SELECT check_admin_protect_is_on();

    check_admin_protect_is_on
    ---------------------------
    t
    (1 row)
  • Успешное включение TDE:

    SELECT * FROM check_tde_is_on();

    check_tde_is_on
    -----------------
    t
    (1 row)