СЗИ. Установка\подключение#
Автоматическое подключение СЗИ с помощью external-скрипта#
Общий механизм подключения вынесен в независимый 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- файл с задачами по остановке/запуску БД;
group_vars:all.yml- переменные, используемые в данной роли по умолчанию;message.yml- переменные для вывода информации (INFO)/ошибок (FAIL);
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.
Особенности логики работы некоторых параметров пользовательского конфигурационного файла:
параметр
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 --flush-cache -vv
Проверки и информационные сообщения процесса подключения СЗИ#
Проверка работоспособности с Хранилищем секретов#
Чтобы убедиться в том, что при запуске СУБД Pangolin происходит запрос сертификатов, выполните следующие действия:
Запустите перехват сетевого трафика порту, где работает эмулятор SecMan:
tshark -PV -C Custom -w outfile -i ens192 -f "tcp port <Порт>" 2>&1 | lessЗапустите СУБД Pangolin вручную посредством
pg_ctl:pg_ctl -D /pgdata/0{major_version}/data startПроверьте в лог-файле сообщения о подключении к 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 и replica-узлов. Информация может быть неактуальной, поэтому реализована проверка актуального master-узла. В случае, если адрес master-узла отличается от переданного на вход, то выводится ошибка, блокирующая дальнейшее выполнение сценария:
"FAIL__Текущий мастер в СУБД не соответствует значению, полученному из SM. На текущий момент подключение СЗИ невозможно, необходимо выполнить switchover__.FAIL"
Проверка файлов сертификатов#
Если файлы сертификатов отсутствуют, то выводится ошибка, блокирующая дальнейшее выполнение сценария:
"FAIL__Файл сертификата {} не найден на хосте {{ ansible_fqdn }}. Проверьте наличие файла.__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__Служба Patroni не запущен. Произведите проверку состояния службы Pangolin Manager на сервере.__FAIL"
Проверка установки параметров в true#
Если ни один из параметров, которые контролируют подключение СЗИ, не выставлен в true, то выводится ошибка, блокирующая дальнейшее выполнение сценария:
"FAIL__Не удалось сформировать список СЗИ к подключению. Скорректируйте значения в пользовательском конфигурационном слое.__FAIL"
Проверка символьных ссылок#
Если символьная ссылка до плагина, контролирующего подключение к серверу VAULT, на стенде выставлена некорректно, то выводится ошибка, блокирующая дальнейшее выполнение сценария:
"FAIL__Подключение СЗИ на стенде возможно только с физическим(ими) сервером(ами) VAULT. Произведите проверку символьной ссылки до плагина: {}.__FAIL"
Проверка плагинов setup_kms_credentials/initprotection#
Если на стенде не был обнаружен плагин setup_kms_credentials или initprotection, то выводится ошибка, блокирующая дальнейшее выполнение сценария:
"FAIL__Плагин '{}' на стенде не обнаружен.__FAIL"
Проверка доступности серверов#
Если ни один сервер из заданного списка недоступен, то выводится ошибка, блокирующая дальнейшее выполнение сценария:
"Не удалось установить успешное подключение ни к одному из сервера(ов) VAULT. Проверьте корректность переданных параметров подключения к защищенному(ым) хранилищу(щам) VAULT в конфигурационном файле' {}'. После произведите повторный запуск скрипта по подключению СЗИ.__FAIL"
Проверка списка УЗ администраторов#
Если список УЗ администраторов безопасности был передан не в полном объеме, то выводится ошибка, блокирующая дальнейшее выполнение сценария:
"FAIL__Проверка входных параметров для инициализации механизма защиты данных не дала ожидаемый результат. Параметры УЗ администраторов безопасности были переданы неверно или не в полном объеме. Скорректируйте параметры в пользовательском конфигурационном файле '{}', относящиеся к конфигурированию УЗ администраторов безопасности и произведите повторный запуск скрипта по подключению СЗИ.__FAIL"
Проверка метода шифрования паролей УЗ администраторов безопасности#
Если пароли для УЗ администраторов безопасности были заданы не методом SCRAM-SHA-256, то выводится ошибка, блокирующая дальнейшее выполнение сценария:
"FAIL__Проверка входных параметров для инициализации механизма защиты данных не дала ожидаемый результат. Пароли УЗ администраторов безопасности не были переданы в виде SCRAM-SHA-256. Скорректируйте параметры паролей для УЗ администраторов безопасности в пользовательском конфигурационном файле '{}' и произведите повторный запуск скрипта по подключению СЗИ. __FAIL"
Проверка получения параметров 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"
"INFO__Проверка доступности VAULT сервера(ов) прошла успешно.__INFO"
Проверки и информационные сообщения после подключения выбранного списка СЗИ#
Проверка наличия конфигурационного файла VAULT после работы утилиты setup_kms_credentials#
В случае, когда файл не был найден, будет выведена ошибка:
"FAIL__Конфигурационный файл VAULT '{}' не был обнаружен. Причина может быть в некорректной работе утилиты setup_kms_credentials. Лог работы утилиты: {}__FAIL"
Проверка успешного подключения#
Если после работы утилиты setup_kms_credentials не удалось установить ни одного успешного подключения, то выводится следующее сообщение в лог:
"FAIL__Не удалось установить ни одного успешного подключения. Проверьте доступность сервера(ов) VAULT и корректность переданных параметров в пользовательском конфигурационном файле.__FAIL"
Проверка работа утилиты initprotection#
Если работа утилиты initprotection завершилась неудачей, то выводится следующее сообщение в лог:
"FAIL__В процессе инициализация механизма защиты данных возникли ошибки: '{}'.__FAIL"
Проверка состояния стенда#
Если проверка состояния стенда после работы скриптов не дала ожидаемый результат, то выводятся следующие сообщения в лог:
"FAIL__В процессе работы скриптов что-то пошло не так. TDE на текущем стенде не включено. Произведите проверку параметра по включению TDE в конфигурационном файле или на сервере(ах) VAULT.__FAIL"
"FAIL__В процессе работы скриптов что-то пошло не так. Защита конфигурации на текущем стенде не включена. Произведите проверку параметра secire_config на сервере(ах) VAULT.__FAIL"
"FAIL__В процессе работы скриптов что-то пошло не так. Защита от привилегированных пользователей на текущем стенде не включена.__FAIL"
Сообщения об успешном прохождении проверок#
"INFO__Проверка наличия конфигурации VAULT прошла успешно.__INFO"
"INFO__Инициализация механизма защиты данных выполнена успешно.__INFO"
"INFO__Итоговая проверка подключения TDE завершилась успешно.__INFO"
"INFO__Итоговая проверка подключения защиты конфигурации завершилась успешно.__INFO"
"INFO__Итоговая проверка подключения защиты от привилегированных пользователей завершилась успешно.__INFO"
Ручное подключение СЗИ#
В Pangolin реализована интеграция с KMS HashiCorp Vault и с локальным файловым хранением секретов. В данном разделе рассматривается ручное подключение таких функциональностей, как защита от привилегированных пользователей, TDE и защита конфигурации.
Внимание!
Подключение СЗИ осуществляется от пользователя с правами sudo, пользователя
postgresи пользователя администратора безопасности (в качестве примера взят kmadmin_pg).
Инструкция рассчитана на подключение СЗИ в СУБД Pangolin, начиная с версии 5.4.0.
Ручное подключение СЗИ с локальным файловым хранением секретов#
Общие подготовительные действия#
Выключите БД на время ручного подключения СЗИ:
Если конфигурация standalone:
sudo su - postgres /usr/pangolin/bin/pg_ctl stop -D /pgdata/0{major_version}/dataОжидаемый результат:
waiting for server to shut down.... done server stoppedЕсли конфигурация кластерная:
sudo su - postgres sudo systemctl stop pangolin-managerДействие сначала производится на реплике, затем на мастере.
Ожидаемый результат:
sudo su - postgres list + Cluster: clustername (7258206222218039502) ----+---------+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +---------------------+--------------------------+---------+---------+----+-----------+ | <Адрес> | <Адрес>:<Порт> | Replica | stopped | | unknown | | <Адрес> | <Адрес>:<Порт> | Replica | stopped | | unknown | +---------------------+--------------------------+---------+---------+----+-----------+
Локальное конфигурирование#
Примечание:
Пропустите этот раздел, если требуется подключение только защиты от привилегированных пользователей.
Выполните шаги:
Создайте каталог для расширенной конфигурации, если такого нет. В кластерной конфигурации повторите это действие на реплике:
sudo su mkdir /etc/postgres chown postgres:kmadmin_pg /etc/postgres chmod 0731 /etc/postgresОжидаемый результат:
ls -la /etc | grep postgres drwx-wx--x 2 postgres kmadmin_pg 4096 Jul 21 18:00 postgresСоздайте файлы для хранения статических и динамических параметров. В кластерной конфигурации повторите это действие на реплике:
sudo su touch /etc/pangolin-security-utilities/kms_dynamic_params.cfg touch /etc/pangolin-security-utilities/kms_static_params.cfg chown kmadmin_pg:postgres /etc/pangolin-security-utilities/kms_dynamic_params.cfg chown kmadmin_pg:postgres /etc/pangolin-security-utilities/kms_static_params.cfg chmod 0640 /etc/pangolin-security-utilities/kms_dynamic_params.cfg chmod 0640 /etc/pangolin-security-utilities/kms_static_params.cfgОжидаемый результат:
ls -la /etc/postgres -rw-r----- 1 kmadmin_pg postgres 0 Jul 21 18:05 kms_dynamic_params.cfg -rw-r----- 1 kmadmin_pg postgres 0 Jul 21 18:06 kms_static_params.cfgФайл со статическими параметрами имеет простой текстовый формат, каждая строка содержит пару: <имя ключа> = <значение для данного ключа>. Файл может содержать следующие параметры:
ключ
actual_master_key– метка актуального мастер-ключа;wal_key– значение ключа шифрования WAL кластера;master_key_value_<timestamp>– значение мастер-ключа,<timestamp>– дата и время в формате ГГГГММДД_ЧЧммСС, где ГГГГ – год, ММ – месяц, ДД – день, ЧЧ – час в формате 24 часа, мм – минута, СС – секунда.
Сгенерируйте ключи с помощью утилиты
generate_encryption_key. В кластерной конфигурации повторите это действие на реплике:sudo su - kmadmin_pg /opt/pangolin-security-utilities/bin/generate_encryption_keyОжидаемый результат:
Key was generated successfully. Key: {хеш}Key was generated successfully. Key: {хеш}Заполните файл со статическими параметрами. В кластерной конфигурации повторите это действие на реплике:
sudo su - kmadmin_pg vim /etc/pangolin-security-utilities/kms_static_params.cfgОжидаемый результат:
ls -la /etc/pangolin-security-utilities/kms_static_params.cfg actual_master_key = master_key_value_00000000_000000_000 master_key_value_00000000_000000_000 = {хеш} wal_key = {хеш}Зашифруйте файл со статическими параметрами. В кластерной конфигурации повторите это действие на реплике:
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Ожидаемый результат:
ls -la /etc/pangolin-security-utilities/kms_dynamic_params.cfg secure_config = off is_tde_on = off allowed_servers = enabled_sec_admin_extra_auth_methods = cert encrypt_new_tablespaces = ddl masking_mode = disabled password_encryption = scram-sha-256 password_policies_enable = on password_policy.allow_hashed_password = on password_policy.alpha_numeric = 3 password_policy.check_syntax = on password_policy.custom_function = password_policy.deny_default = off password_policy.expire_warning = 7 days password_policy.failure_count_interval = 0 password_policy.grace_login_limit = 0 password_policy.grace_login_time_limit = 3 days password_policy.illegal_values = on password_policy.in_history = 4 password_policy.lockout = on password_policy.lockout_duration = 24 hours password_policy.max_age = 0 password_policy.max_failure = 6 password_policy.max_inactivity = 0 password_policy.max_rpt_chars = 0 password_policy.min_age = 0 password_policy.min_alpha_chars = 0 password_policy.min_length = 16 password_policy.min_lowercase = 0 password_policy.min_special_chars = 1 password_policy.min_uppercase = 1 password_policy.password_strength_estimator_score = 3 password_policy.reuse_time = 365 days password_policy.track_login = 0 password_policy.transport_password_life_time = 0 password_policy.transport_password_mark_automatic = off password_policy.use_password_strength_estimator = on performance_insights.masking = on psql_encrypt_password = on ssl = on pg_ident_conf +=Переопределите символьную ссылку плагина на заменитель. В кластерной конфигурации повторите это действие на реплике.
sudo su - postgres ln -s /usr/pangolin/lib/plugins/libkms_substitute_plugin.so /usr/pangolin/lib/libconnection_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/0{major_version}/data
Enter security administrator names (comma-separated):sec_admin,sec_admin_backup
Enter new security admin password for user "sec_admin":
Enter it again:
Enter new security admin password for user "sec_admin_backup":
Enter it again:
Ожидаемый результат:
Protection mechanism is initialized.
syncing data to disk
Подключение TDE#
Внимание!
Пропустите действия в этом разделе, если не планируется подключение защиты конфигурации.
Выполните шаги:
Укажите значение параметра
secure_configв файле динамических параметров для standalone и кластерной конфигурации:sudo su - kmadmin_pg vim /etc/pangolin-security-utilities/kms_dynamic_params.cfgИзмените значение параметра
secure_configнаoff:secure_config = offОжидаемый результат:
ls -la /etc/pangolin-security-utilities/kms_dynamic_params.cfg secure_config = offУкажите значение параметра
is_tde_onв конфигурационном файле:sudo su - postgres # Для конфигурации standalone vim /pgdata/postgresql.conf # Для кластерной конфигурации vim /etc/pangolin-manager/postgres.ymlИзмените значение параметра
is_tde_onнаon:# Для конфигурации standalone is_tde_on = on # Для кластерной конфигурации is_tde_on: onОжидаемый результат:
Для standalone-конфигурации:
cat /pgdata/postgresql.conf | grep is_tde_on is_tde_on = onДля cluster-конфигурации:
cat /etc/pangolin-manager/postgres.yml | grep is_tde_on is_tde_on: on
Подключение защиты конфигурации#
Чтобы подключить защиту конфигурации, измените значение параметра secure_config на on в файле динамических параметров. В кластерной конфигурации действие повторите на реплике:
sudo su - kmadmin_pg
vim /etc/pangolin-security-utilities/kms_dynamic_params.cfg
Ожидаемый результат:
ls -la /etc/pangolin-security-utilities/kms_dynamic_params.cfg
secure_config = on
Общие завершающие действия#
Включите БД:
Если конфигурация standalone:
sudo su - postgres /usr/pangolin/bin/pg_ctl start -D /pgdata/0{major_version}/dataОжидаемый результат:
done server startedЕсли конфигурация кластерная. Действие сначала производится на мастере, затем на реплике:
sudo su - postgres sudo systemctl start pangolin-managerОжидаемый результат:
sudo su - postgres list + Cluster: clustername (7258206222218039502) ----+--------------+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +---------------------+--------------------------+--------------+---------+----+-----------+ | <IP-адрес> | <IP-адрес>:<Порт> | Sync Standby | running | 2 | 0 | | <IP-адрес> | <IP-адрес>:<Порт> | Leader | running | 2 | | +---------------------+--------------------------+--------------+---------+----+-----------+Ожидаемый результат в логе БД:
LOG: The initialization of KMS substitute completed successfully.
Ручное подключение СЗИ с KMS HashiCorp Vault#
Примечание:
В скриптах развертывания/обновления также реализован внешний скрипт по автоматическому подключению СЗИ.
Общие подготовительные действия#
Выключите БД на время ручного подключения СЗИ:
Если конфигурация standalone:
sudo su - postgres /usr/pangolin/bin/pg_ctl stop -D /pgdata/0{major_version}/dataОжидаемый результат:
waiting for server to shut down.... done server stoppedЕсли конфигурация кластерная, действие сначала производится на реплике, затем на мастере:
sudo su - postgres sudo systemctl stop pangolin-managerОжидаемый результат:
sudo su - postgres list + Cluster: clustername (7258206222218039502) ----+---------+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +---------------------+--------------------------+---------+---------+----+-----------+ | <IP-адрес> | <IP-адрес>:<Порт> | Replica | stopped | | unknown | | <IP-адрес> | <IP-адрес>:<Порт> | Replica | stopped | | unknown | +---------------------+--------------------------+---------+---------+----+-----------+
Конфигурирование KMS HashiCorp Vault#
Выполните шаги:
Выполните аутентификацию пользователя на сервере Vault. Для аутентификации используйте клиентский токен:

Зайдите в хранилище kv и нажмите Create secret (1) для создания уникального CLUSTER_ID.

Выполните следующие действия:
В поле Path for this secret (2) укажите путь к параметру:
postgresql/<CLUSTER_ID>/postgresql/<param>, где:CLUSTER_ID- имя кластера. Должно быть уникальным для каждого кластера;param- наименование параметра, например,secure_config.
В поле Version data (3, 4) укажите имя параметра -
value, значение -off.Сохраните, нажав кнопку Save (5).

Повторите действие по созданию остальных параметров из списка:
is_tde_on = off allowed_servers = enabled_sec_admin_extra_auth_methods = cert encrypt_new_tablespaces = ddl masking_mode = disabled password_encryption = scram-sha-256 password_policies_enable = on password_policy.allow_hashed_password = on password_policy.alpha_numeric = 3 password_policy.check_syntax = on password_policy.custom_function = password_policy.deny_default = off password_policy.expire_warning = 7 days password_policy.failure_count_interval = 0 password_policy.grace_login_limit = 0 password_policy.grace_login_time_limit = 3 days password_policy.illegal_values = on password_policy.in_history = 4 password_policy.lockout = on password_policy.lockout_duration = 24 hours password_policy.max_age = 0 password_policy.max_failure = 6 password_policy.max_inactivity = 0 password_policy.max_rpt_chars = 0 password_policy.min_age = 0 password_policy.min_alpha_chars = 0 password_policy.min_length = 16 password_policy.min_lowercase = 0 password_policy.min_special_chars = 1 password_policy.min_uppercase = 1 password_policy.password_strength_estimator_score = 3 password_policy.reuse_time = 365 days password_policy.track_login = 0 password_policy.transport_password_life_time = 0 password_policy.transport_password_mark_automatic = off password_policy.use_password_strength_estimator = on performance_insights.masking = on psql_encrypt_password = on ssl = on pg_ident_conf +=
Подключение защиты от привилегированных пользователей#
Выполните команды инициализации механизма защиты от привилегированных пользователей (только на мастере). Пароль передайте в открытом виде:
sudo su - kmadmin_pg
sudo -iu postgres -g kmadmin_pg /usr/pangolin/bin/initprotection
Enter PGDATA directory [/pgdata/{major_version}/data]: /pgdata/0{major_version}/data
Enter security administrator names (comma-separated):sec_admin,sec_admin_backup
Enter new security admin password for user "sec_admin":
Enter it again:
Enter new security admin password for user "sec_admin_backup":
Enter it again:
Ожидаемый результат:
Protection mechanism is initialized.
syncing data to disk
Подключение TDE#
Внимание!
Пропустите действия в этом разделе, если не планируется подключение защиты конфигурации.
Выполните шаги:
Измените значение параметра
is_tde_onнаonна сервере VAULT, нажав кнопку Create new version:
Выполните шаги:
Укажите значение параметра
secure_configв файле динамических параметров для standalone и кластерной конфигурации:sudo su - kmadmin_pg vim /etc/postgres/kms_dynamic_params.cfgИзмените значение параметра
secure_configнаoff:secure_config = offОжидаемый результат:
ls -la /etc/postgres/kms_dynamic_params.cfg secure_config = offУкажите значение параметра
is_tde_onв конфигурационном файле:sudo su - postgres # Для конфигурации standalone vim /pgdata/postgresql.conf # Для кластерной конфигурации vim /etc/pangolin-manager/postgres.ymlИзмените значение параметра
is_tde_onнаon:# Для конфигурации standalone is_tde_on = on # Для кластерной конфигурации is_tde_on: onОжидаемый результат:
Для standalone-конфигурации:
cat /pgdata/postgresql.conf | grep is_tde_on is_tde_on = onДля cluster-конфигурации:
cat /etc/pangolin-manager/postgres.yml | grep is_tde_on is_tde_on: on
Подключение защиты конфигурации#
Для подключения защиты конфигурации измените значение параметра secure_config на on на сервере VAULT, нажав кнопку Create new version:

Общие завершающие действия#
Включите БД:
Если конфигурация standalone:
sudo su - postgres /usr/pangolin/bin/pg_ctl start -D /pgdata/0{major_version}/dataОжидаемый результат:
done server startedЕсли конфигурация кластерная, действие сначала производится на мастере, затем на реплике:
sudo su - postgres sudo systemctl start pangolin-managerОжидаемый результат:
sudo su - postgres list + Cluster: clustername (7258206222218039502) ----+--------------+---------+----+-----------+ | Member | Host | Role | State | TL | Lag in MB | +---------------------+--------------------------+--------------+---------+----+-----------+ | <IP-адрес> | <IP-адрес>:<Порт> | Sync Standby | running | 2 | 0 | | <IP-адрес> | <IP-адрес>:<Порт> | Leader | running | 2 | | +---------------------+--------------------------+--------------+---------+----+-----------+