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

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

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

Внимание!

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

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

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

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

  • playbook_configure_ist.yaml - осуществляет запуск сценария подключения СЗИ;
  • custom.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 - файл с задачами для проверки подключения к СУБД;
    • secret_dump.yml - файл с задачами для настройки secret_dump secret_dump;
  • 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. Произведите проверку наличия установленного пакета pangolin-ansible-venv-controller версии продукта для которой планируется настройка СЗИ:

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

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

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

    source /opt/pangolin-ansible-venv-controller/bin/activate
  3. Перейдите в каталог installer распакованного дистрибутива:

    cd <distrib_path>/installer

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

  4. Запустите 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 scripts_external/configure_ist/playbook_configure_ist.yaml -i inventories/cluster/hosts.ini \
      --extra-vars "custom_config=<path_to_config> utility_path=<utilities_path>" --flush-cache -vv

      Где:

      • path_to_config - абсолютный путь до пользовательского конфигурационного файла;
      • utilities_path - абсолютный путь до каталога utilities, находящийся в директории дистрибутива.

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

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

Чтобы убедиться в том, что при запуске СУБД 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__Проверка доступности 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} – мажорная версия СУБД (текущая 7);
  • {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-7.3.1-{OS}.x86_64.rpm
    Подсказка

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

        cd distributive/utilities
    sudo dnf install -y pangolin-security-utilities-7.3.1-sberlinux9.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 для настройки подключения к созданному хранилищу секретов (на мастере и реплике). Пример настройки подключения к хранилищу секретов:

Подключение к HashiCorp Vault:

$ /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)

Ручное подключение СЗИ с 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-7.3.1-{OS}.x86_64.rpm
    Подсказка

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

       cd distributive/utilities
    sudo dnf install -y pangolin-security-utilities-7.3.1-sberlinux9.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)