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

СЗИ. Установка\подключение

Автоматическое подключение СЗИ с помощью 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 в локальную конфигурацию не включены.

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

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

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

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

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

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

      ansible-playbook playbook_configure_ist.yaml -i inventories/cluster/hosts.ini --flush-cache -vv

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

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

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

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

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

    pg_ctl -D /pgdata/0{major_version}/data start
  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 и 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 |
    +---------------------+--------------------------+---------+---------+----+-----------+

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

Примечание:

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

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

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

    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
  2. Создайте файлы для хранения статических и динамических параметров. В кластерной конфигурации повторите это действие на реплике:

    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 часа, мм – минута, СС – секунда.
  3. Сгенерируйте ключи с помощью утилиты 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: {хеш}
  4. Заполните файл со статическими параметрами. В кластерной конфигурации повторите это действие на реплике:

    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 = {хеш}
  5. Зашифруйте файл со статическими параметрами. В кластерной конфигурации повторите это действие на реплике:

    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
  6. Создайте файл с динамическими параметрами. В кластерной конфигурации повторите это действие на реплике:

    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 +=
  7. Переопределите символьную ссылку плагина на заменитель. В кластерной конфигурации повторите это действие на реплике.

    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

Внимание!

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

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

  1. Укажите значение параметра 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
  2. Укажите значение параметра 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

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

  1. Выполните аутентификацию пользователя на сервере Vault. Для аутентификации используйте клиентский токен:

    Аутентификация в Vault

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

    Создание секрета

  3. Выполните следующие действия:

    • В поле Path for this secret (2) укажите путь к параметру: postgresql/<CLUSTER_ID>/postgresql/<param>, где:

      • CLUSTER_ID - имя кластера. Должно быть уникальным для каждого кластера;
      • param - наименование параметра, например, secure_config.
    • В поле Version data (3, 4) укажите имя параметра - value, значение - off.

    • Сохраните, нажав кнопку Save (5).

      Параметры секрета

  4. Повторите действие по созданию остальных параметров из списка:

    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

Внимание!

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

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

  1. Измените значение параметра is_tde_on на on на сервере VAULT, нажав кнопку Create new version:

    Изменение параметра is_tde_on

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

  1. Укажите значение параметра 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
  2. Укажите значение параметра 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:

Изменение параметра secure_config

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

  1. Включите БД:

    • Если конфигурация 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 | |
      +---------------------+--------------------------+--------------+---------+----+-----------+