Подключение СЗИ
В данном разделе рассматривается подключение таких функциональностей, как защита данных от привилегированных пользователей, 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 в локальную конфигурацию не включены.
Запуск скрипта для подключения СЗИ
Выполните шаги:
-
Активируйте виртуальное окружение для запуска скрипта:
source /opt/pangolin-ansible-venv-controller/bin/activate -
Запустите 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 происходит запрос сертификатов, выполните следующие действия:
-
Запустите перехват сетевого трафика порту, где работает эмулятор SecMan:
tshark -PV -C Custom -w outfile -i ens192 -f "tcp port <port>" 2>&1 | less -
Запустите СУБД Pangolin вручную посредством
pg_ctl:pg_ctl start -D $PGDATA -
Проверьте в лог-файле сообщения о подключении к SecMan и получении сертификатов.
Ожидаемый результат:
Лог содержит сообщения:
LOG: Fetch certificate from SecMan.
LOG: certificate, private key and certificate chain are loaded from PKCS#12 specified in file -
Остановите перехват трафика, и проверьте наличие пакетов обмена данными с эмулятором 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-заменителем
Общие подготовительные действия
-
Перед началом подключения необходимо:
- выполнить команду
CHECKPOINTна первом узле (мастер); - убедиться, что WAL передан на реплику (
SELECT replay_lsn = pg_current_wal_insert_lsn() FROM pg_stat_replicationвозвращаетtrue); - выполнить команду
CHECKPOINTна втором узле.
- выполнить команду
-
Установите rpm/deb-пакет утилит безопасности из каталога
utilitiesдистрибутива:- SberLinux, РЕД ОС, CentOS
- Astra Linux
- Альт СП
sudo dnf install pangolin-security-utilities-{product_version}-{OS}.x86_64.rpmsudo apt install pangolin-security-utilities-{product_version}_amd64.debsudo apt-get 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 -
Выключите БД на время ручного подключения СЗИ:
-
Если конфигурация 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-заменителя вместо хранилища секретов используются локальные конфигурационные файлы со статическими и динамическими параметрами.
Выполните шаги:
-
Создайте файлы для хранения статических и динамических параметров. В кластерной конфигурации повторите это действие на реплике:
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 -
Сгенерируйте 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} -
Заполните файл со статическими параметрами, укажите
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.
-
-
Засекретьте файл со статическими параметрами утилитой
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 -
Заполните файл с динамическими параметрами. В кластерной конфигурации повторите это действие на реплике:
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. -
Настройте подключение к локальному хранилищу секретов. Для этого запустите утилиту
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отвечает за режим для отключения проверки параметров подключения к хранилищу секретов.Далее следуйте описанным шагам:
-
Заполните необходимые параметры.
-
Укажите имя своего кластера
CLUSTER_ID:Enter Pangolin cluster ID:
clustername <-Следующие параметры при работе с заменителем значения не имеют, можно указать как в примерах ниже.
-
Укажите файл или директорию с корневым центром сертификации:
Enter root CA folder or file or leave empty:
/pg_ssl <- -
Укажите
suffixдля доступа к хранилищу:Enter suffix or leave empty:
postgresql <- -
Укажите IP-адрес хранилища секретов:
Enter IP address or Domain Name of Secret storage:
0.0.0.0 <- -
Укажите порт KMS:
Enter port:
8200 <- -
Выберите протокол
https, нажав 2:Choose protocol type or leave empty to use default (https):
1. http
2. https <-
2 -
Выберите значение по умолчанию (
kv), нажав enter:Enter secrets prefix or leave empty to use default (kv):
enter <- -
Оставьте пустым пространство имен секретного хранилища, нажав enter:
Enter Secret storage namespace or leave empty:
enter <- -
Выберите
Userpass Auth Method, нажав 1:Choose credentials type:
1. Userpass Auth Method <-
2. AppRole Auth Method
1 -
На сообщение о вводе точки авторизации, нажмите enter:
Enter auth point or leave empty to use default (userpass):
enter <- -
Введите логин и пароль администратора:
Enter login:
adminencryption <-
Enter password:
****** <-
Confirm password:
****** <- -
На сообщение о добавлении еще одних учетных данных KMS ответьте no:
Do you want to add another Secret storage credentials? (yes/no)?:
no <- -
При успешном добавлении параметров появится сообщение:
Credentials for Secret storage has been set successfully -
Если при установке возникли проблемы, воспользуйтесь командой:
/opt/pangolin-security-utilities/bin/setup_kms_credentials --help -
В результате настройки создан файл с параметрами соединения с 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
-
-
-
Переопределите символьную ссылку плагина на заменитель. В кластерной конфигурации повторите это действие на реплике.
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 (прозрачное защитное преобразование данных)
Выполните шаги:
-
Проверьте значение
secure_configв файле динамических параметров. В кластерной конфигурации повторите это действие на реплике:sudo su - kmadmin_pg
cat /etc/pangolin-security-utilities/kms_dynamic_params.cfgОжидаемый результат:
secure_config = off -
Укажите значение параметра
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)
Ручное подключение СЗИ с хранилищем секретов
Общие подготовительные действия
- Перед началом подключения необходимо:
- выполнить команду
CHECKPOINTна первом узле (мастер); - убедиться, что WAL передан на реплику (
SELECT replay_lsn = pg_current_wal_insert_lsn() FROM pg_stat_replicationвозвращаетtrue); - выполнить команду
CHECKPOINTна втором узле.
-
Установите rpm/deb-пакет утилит безопасности из каталога
utilitiesдистрибутива:- SberLinux, РЕД ОС, CentOS
- Astra Linux
- Альт СП
sudo dnf install pangolin-security-utilities-{product_version}-{OS}.x86_64.rpmsudo apt install pangolin-security-utilities-{product_version}_amd64.debsudo apt-get 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 -
Выключите БД на время ручного подключения СЗИ:
-
Если конфигурация 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
Предварительно выполните дополнительные шаги по подключению системы ОдинКлюч (установите и запустите API-агент системы ОдинКлюч, а также установите символьную ссылку на плагинlibonekey_plugin.so). Более подробная информация представлена в разделе «Интеграция с системой хранения секретов ОдинКлюч» документа «Инструкции и рекомендации».
$ /opt/pangolin-security-utilities/bin/setup_kms_credentials -c <clustername> -h <IP-Address> -p <port> -i <login> --storage onekey
Enter password:
*****
Confirm password:
*****
Do you want to enter storage secret (yes/no)?:
no
Credentials check ок
Credentials for Secret storage has been set successfully
Где:
<clustername>– идентификатор кластера в хранилище секретов;<IP-Address>– IP-адрес API-агента системы ОдинКлюч;<port>- порт API-агента;<login>- логин пользователя в хранилище секретов.
При наличии дополнительного мастер-ключа на хранилище ОдинКлюч, на сообщение Do you want to enter storage secret (yes/no)? необходимо ответить yes, после чего ввести мастер-ключ от хранилища. В противном случае указать no.
Также можно выполнить настройку подключения к системе хранения ОдинКлюч в интерактивном режиме:
sudo su - kmadmin_pg
$ /opt/pangolin-security-utilities/bin/setup_kms_credentials --storage onekey
Заполните следующие параметры:
-
Укажите имя своего кластера
CLUSTER_ID:Enter Pangolin cluster ID:
clustername <- -
Укажите IP-адрес API-агента системы ОдинКлюч:
Enter IP address or Domain Name of Secret storage:
127.0.0.1 <- -
Укажите порт API-агента:
Enter port:
3012 <- -
Введите логин и пароль администратора:
Enter login:
admin <-
Enter password:
****** <-
Confirm password:
****** <-
Credentials check ок -
При наличии дополнительного мастер-ключа на хранилище ОдинКлюч ответьте yes, и введите мастер-ключ, иначе ответьте no:
Do you want to enter storage secret (yes/no)?:
yes
Enter OneKey storage secret:
****
Confirm OneKey storage secret:
**** -
На сообщение о добавлении еще одних учетных данных KMS ответьте no:
Do you want to add another Secret storage credentials? (yes/no)?:
no <- -
При успешном добавлении параметров появится сообщение:
Credentials for Secret storage has been set successfully -
Если при установке возникли проблемы, воспользуйтесь командой:
/opt/pangolin-security-utilities/bin/setup_kms_credentials --help
Пример команды для проверки подключения к хранилищу секретов ОдинКлюч:
setup_kms_credentials show --storage onekey
Подключение защиты данных от привилегированных пользователей
Инициализируйте механизм защиты данных от привилегированных пользователей (только на мастере). Укажите каталог данных СУБД, имена администраторв безопасности БД (через запятую, если несколько), пароли для создаваемых администраторов безопасности передайте в открытом виде:
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 (прозрачное защитное преобразование данных)
Выполните шаги:
-
Измените значение параметра
is_tde_onнаonв хранилище секретов. -
Укажите значение параметра
secure_config = offв хранилище секретов, если не планируется подключение защиты конфигурации. -
Укажите значение параметра
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)