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

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

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

Внимание!

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

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

Автоматическое подключение СЗИ при помощи запуска Ansible плейбука​

Общий механизм подключения вынесен в независимый external-скрипт внутри общих скриптов развертывания/обновления, к которым относятся:

  • playbook_configure_ist.yaml - осуществляет запуск сценария подключения СЗИ;
  • custom_configure_ist.yml - пользовательский конфигурационный слой для настройки входных параметров.

Ansible-роль (configure_ist) для запуска процесса подключения СЗИ выглядит следующим образом:

  • tasks:

    • check.yml - файл с задачами для проверки состояния стенда, влияющими на успешное подключение СЗИ, проверка входных параметров;
    • common_check.yml - файл с задачами для общей проверки состояния стенда. Проверки путей до конфигурационных файлов, путей до сертификатов;
    • define_current_master.yml - файл с задачами для определения текущей конфигурации. В случае со стендом с Pangolin Manager, определение текущего master;
    • install.yml - файл с задачами по подключению СЗИ;
    • main.yml - файл с задачами, включает в себя вызов всех файлов в текущем каталоге;
    • switch.yml - файл с задачами по остановке/запуску БД;
    • check_and_use_custom_config.yml - файл с задачами по проверке доступности, указанного пользователем, конфигурационного файла;
    • set_connection.yml - файл с задачами для проверки подключения к СУБД;
  • group_vars:

    • all.yml - переменные, используемые в данной роли по умолчанию;
    • message.yml - переменные для вывода информации (INFO) / ошибок (FAIL);
  • inventory:

    • cluster:

      • hosts.ini - обеспечивает возможность передачи параметров подключения к хостам. Содержит файлы для кластерной конфигурации;
      • inventory.py - скрипт, обеспечивающий возможность заполнять inventory-файлы в автоматическом режиме;
    • standalone:

      • hosts.ini - обеспечивает возможность передачи параметров подключения к хостам. Содержит файлы для конфигурации standalone;
      • inventory.py - скрипт, обеспечивающий возможность заполнять inventory-файлы в автоматическом режиме;
  • filter_plugins:

    • common_filters.py - скрипт для обработки входных данных;
  • library:

    • yedit - скрипт для работы с конфигурационным файлом Pangolin Manager. Поставляется в скомпилированном виде;
    • pangolin_protect_init.py - скрипт для работы с утилитами setup_kms_credentials, initprotection.

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

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

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

примечание

Утилиты initprotection/setup_kms_credentials в external-скрипте обернуты в 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
Внимание!

С версии 5.5.0 параметры, которые в более ранних версиях задавали правила подключения для admin_protection_users.sec_admin (sec_admin_hba_rule.connection, sec_admin_hba_rule.databases, sec_admin_hba_rule.network, sec_admin_hba_rule.auth) и параметр sec_admin_backup_networks (список хостов к подключению admin_protection_users.sec_admin_backup) были исключены.

Тип параметра sec_admin_hba_rule.network изменен с str на list.

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

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

Запуск скрипта для подключения СЗИ​

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

  1. Активируйте виртуальное окружение для запуска скрипта:

    source /opt/pangolin-ansible-venv-controller/bin/activate
  2. Запустите external-скрипт подключения СЗИ, для этого выполните Ansible плейбук playbook_configure_ist.yaml.

    • пример запуска для конфигурации standalone:

      ansible-playbook playbook_configure_ist.yaml -i inventories/standalone/hosts.ini --extra-vars "custom_config=<Путь к пользовательскому конфигурационному файлу> utility_path=<Путь к каталогу с утилитами, входит в состав дистрибутива>" --flush-cache -vv
    • пример запуска для кластерной конфигурации:

      ansible-playbook playbook_configure_ist.yaml -i inventories/cluster/hosts.ini \
      --extra-vars " custom_config=path/to/custom_config \
      utility_path=path/to/utilities" \
      --flush-cache -vv

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

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

Чтобы убедиться в том, что при запуске СУБД 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
    ...

Проверка корректной передачи в строку запуска ansible обязательных параметров​

Для корректной работы скрипта по подключению СЗИ необходимо передать в строку запуска два обязательных параметра:

  • custom_config - путь к пользовательскому конфигурационному файлу инсталлятора;
  • utility_path - путь к каталогу utilities/, входящего в состав дистрибутива.

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

"FAIL__Один из обязательных входных параметров: custom_config, utility_path не был задан при старте. Скорректируйте строку запуска ansible и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"

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

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

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

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

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

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

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

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

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

Проверка переданного пути к конфигурационному файлу инсталлятора на корректность​

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

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

Проверка наличия конфигурационного файла на управляющем узле​

При наличии файла выводится подсказка с информацией о расположении файла:

"INFO__Файл конфигурации '{}' найден.__INFO"

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

"FAIL__Файл конфигурации '{}' не найден. Строка запуска ansible должна содержать параметр custom_file с корректным путем к пользовательскому конфигурационному файлу custom_file. Скорректируйте строку запуска ansible и произведите повторный запуск скрипта по подключению СЗИ.__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 входит в состав дистрибутива и располагается в папке installer/utilities/secret_storage_client_bundle/bin/. На вход скрипты, использующие данную утилиту для проверки, ожидают корректно переданный путь к каталогу с утилитами utilities/ в переменную utility_path в строку запуска ansible. При отсутствии утилиты по переданному пути в лог будет выведено предупреждающее сообщение. Процесс подключения при этом не останавливается.

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

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

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

"INFO__Список СЗИ к подключению успешно сформирован. В процессе работы скрипта будет подключено: {}.__INFO"
"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} – мажорная версия СУБД (текущая 6);
  • {cluster_id} – идентификатор (ID) кластера в системе;
  • <IP-Address> – IP-адрес узла сервера;
  • <port>– порт узла сервера;
  • <name security administrator> – имя пользователя СУБД роли администратора безопасности.

Ручное подключение СЗИ с 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-6.7.6-sberlinux9.6.x86_64.rpm

  3. Выключите БД на время ручного подключения СЗИ:

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

      sudo su - postgres
      /usr/pangolin/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 /usr/pangolin/lib/plugins/libkms_substitute_plugin.so /usr/pangolin/lib/libconnector_plugin.so

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

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

sudo su - kmadmin_pg
sudo -iu postgres -g kmadmin_pg /usr/pangolin/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
    /usr/pangolin/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)

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

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

  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-6.7.6-sberlinux9.6.x86_64.rpm

  2. Выключите БД на время ручного подключения СЗИ:

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

      sudo su - postgres
      /usr/pangolin/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 /usr/pangolin/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
    /usr/pangolin/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)