СЗИ. Установка и подключение
Автоматическое подключение СЗИ с помощью 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.
Ручное подключение СЗИ с локальным файловым хранением секретов
Общие подготовительные действия
Выключите БД на время ручного подключения СЗИ:
-
Если конфигурация без pangolin-manager:
sudo su - postgres
/usr/pangolin/bin/pg_ctl stop -D /pgdata/0{major_version}/dataОжидаемый результат:
waiting for server to shut down....
done
server stopped -
Если конфигурация c pangolin-manager:
sudo su - postgres
sudo systemctl stop pangolin-managerДействие сначала производится на реплике, затем на мастере (во избежание переключения).
Ожидаемый результат:
sudo su - postgres
list
+ Cluster: clustername ({cluster_id}) -----------+---------+---------+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+---------------------+--------------------------+---------+---------+----+-----------+
| <Адрес> | <Адрес>:<Порт> | Replica | stopped | | unknown |
| <Адрес> | <Адрес>:<Порт> | Replica | stopped | | unknown |
+---------------------+--------------------------+---------+---------+----+-----------+
Локальное конфигурирование
Пропустите этот раздел, если требуется подключение только защиты от привилегированных пользователей.
Выполните шаги:
-
Создайте файлы для хранения статических и динамических параметров. В кластерной конфигурации повторите это действие на реплике:
sudo su
touch /etc/pangolin-security-utilities/kms_dynamic_params.cfg
touch /etc/pangolin-security-utilities/kms_static_params.cfg
chown kmadmin_pg:kmadmin_pg /etc/pangolin-security-utilities/kms_dynamic_params.cfg
chown kmadmin_pg:kmadmin_pg /etc/pangolin-security-utilities/kms_static_params.cfgОжидаемый результат:
ls -la /etc/pangolin-security-utilities
-rw-r--r-- 1 kmadmin_pg kmadmin_pg 0 Mar 26 08:54 kms_dynamic_params.cfg
-rw-r--r-- 1 kmadmin_pg kmadmin_pg 0 Mar 26 08:54 kms_static_params.cfgФайл со статическими параметрами имеет простой текстовый формат, каждая строка содержит пару: <имя ключа> = <значение для данного ключа>. Файл может содержать следующие параметры:
- ключ
actual_master_key
– метка актуального мастер-ключа; wal_key
– значение ключа засекречивания WAL кластера;master_key_value_<timestamp>
– значение мастер-ключа,<timestamp>
– дата и время в формате ГГГГММДД_ЧЧммСС, где ГГГГ – год, ММ – месяц, ДД – день, ЧЧ – час в формате 24 часа, мм – минута, СС – секунда.
- ключ
-
Сгенерируйте 2 ключа (
master_key
иwal_key
) с помощью утилиты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: {хеш} -
Заполните файл со статическими параметрами, укажите
master_key
иwal_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 += -
Настройте подключение к KMS. Для этого запустите утилиту
setup_kms_credentials
для настройки соединения с KMS (сначала на 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 successfullyOptions:
--purpose [-s] Secret storage target { certs, secrets }, default = secrets
--format [-f] Output format {json, table} in show mode, default = table
--cluster [-c] Cluster id
--host [-h] Domain name or ip address of Secret storage or several delimeted with ","
--port [-p] Secret storage server port or several delimeted with ","
--protocol [-l] Secret storage protocol { http (1), https (2) }, default = https
--prefix [-x] Secrets path prefix, default = kv
--suffix [-u] Secrets path suffix, default = empty, default value if provided without argument
--namespace [-n] Secrets namespace, default = empty
--type [-t] Auth type { userpass (1), approle (2) }
--auth [-a] Auth point, default = empty
--id [-i] Login or role id
--root-ca [-r] File or folder with root certificate to check Secret storage server, default value if provided without argument
--skip-confirm Secret's input, edit/delete record without confirmation
--index Record's index for edit/delete mode
--plain Plain output
--no-check Do not check credentials
--debug Show debug messages in show mode
--help This help- в интерактивном режиме:
$ /opt/pangolin-security-utilities/bin/setup_kms_credentials
-
Заполните необходимые параметры (в зависимости от версии некоторые поля могут отсутствовать).
-
Выберите домен KMS, нажав 1:
Choose credentials domain:
1. KMS <-
2. Pangolin
1- Укажите имя своего кластера
CLUSTER_ID
в KMS:
Enter Pangolin cluster ID:
clustername <-Следующие параметры при работе с заменителем значения не имеют, можно указать как в примерах ниже.
- Укажите файл или директорию с корневым центром сертификации:
Enter root CA folder or file or leave empty:
/pg_ssl <-- Укажите
suffix
для доступа к хранилищу:
Enter suffix or leave empty:
postgresql <-- Укажите IP-адрес KMS (Secret storage):
Enter IP address or Domain Name of Secret storage:
<IP-адрес> <-- Укажите порт KMS:
Enter port:
port <-- Выберите протокол
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:
Credentials check ок
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-rw-r-- 1 kmadmin_pg kmadmin_pg 176 Nov 3 06:49 enc_connection_settings.cfg -
Переопределите символьную ссылку плагина на заменитель. В кластерной конфигурации повторите это действие на реплике.
sudo su - postgres
rm /usr/pangolin/lib/libconnector_plugin.so
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
в файле динамических параметров. В кластерной конфигурации повторите это действие на реплике:sudo su - kmadmin_pg
ls -la /etc/pangolin-security-utilities/kms_dynamic_params.cfgОжидаемый результат:
secure_config = off
-
Укажите значение параметра
is_tde_on
в конфигурационном файле. В кластерной конфигурации повторите действие на реплике:sudo su - postgres
# Для конфигурации без pangolin-manager
vim $PGDATA/postgresql.conf
# Для конфигурации c pangolin-manager
vim /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
Ожидаемый результат:
ls -la /etc/pangolin-security-utilities/kms_dynamic_params.cfg
secure_config = on
Общие завершающие действия
Включите БД:
-
Если конфигурация без pangolin-manager:
sudo su - postgres
/usr/pangolin/bin/pg_ctl start -D /pgdata/0{major_version}/dataОжидаемый результат:
done
server started -
Если конфигурация c pangolin-manager. Действие сначала производится на мастере, затем на реплике:
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-адрес> | <IP-адрес>:<Порт> | Sync Standby | running | 2 | 0 |
| <IP-адрес> | <IP-адрес>:<Порт> | Leader | running | 2 | |
+---------------------+--------------------------+--------------+---------+----+-----------+Ожидаемый результат в логе БД:
LOG: The initialization of KMS substitute completed successfully.
Проверка успешного включения функциональности
Для проверки успешного включения функциональностей воспользуйтесь следующими командами:
-
включение защиты параметров:
=# SELECT current_setting('secure_config') AS secure_config;
┌───────────────┐
│ secure_config │
├───────────────┤
│ on │
└───────────────┘
(1 row) -
успешное включение защиты данных от привилегированных пользователей:
=# SELECT check_admin_protect_is_on();
check_admin_protect_is_on
---------------------------
t
(1 row) -
успешное включение TDE:
=# SELECT * FROM check_tde_is_on();
check_tde_is_on
-----------------
t
(1 row)
Ручное подключение СЗИ с KMS HashiCorp Vault
В скриптах развертывания/обновления также реализован внешний скрипт по автоматическому подключению СЗИ.
Общие подготовительные действия
Выключите БД на время ручного подключения СЗИ:
-
Если конфигурация без pangolin-manager:
sudo su - postgres
/usr/pangolin/bin/pg_ctl stop -D /pgdata/0{major_version}/dataОжидаемый результат:
waiting for server to shut down....
done
server stopped -
Если конфигурация c pangolin-manager, действие сначала производится на реплике, затем на мастере:
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-адрес> | <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
в файле динамических параметров. В кластерной конфигурации повторите это действие на реплике: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
# Для конфигурации без pangolin-manager
vim /pgdata/postgresql.conf
# Для конфигурации c pangolin-manager
vim /etc/pangolin-manager/postgres.ymlИзмените значение параметра
is_tde_on
наon
:# Для конфигурации без pangolin-manager
is_tde_on = on
# Для конфигурации c pangolin-manager
is_tde_on: onОжидаемый результат:
- Для конфигурации без pangolin-manager:
cat /pgdata/postgresql.conf | grep is_tde_on
is_tde_on = on- Для конфигурации c pangolin-manager:
cat /etc/pangolin-manager/postgres.yml | grep is_tde_on
is_tde_on: on
Подключение защиты конфигурации
Для подключения защиты конфигурации измените значение параметра secure_config
на on
на сервере VAULT, нажав кнопку Create new version:
Общие завершающие действия
-
Включите БД:
-
Если конфигурация без pangolin-manager:
sudo su - postgres
/usr/pangolin/bin/pg_ctl start -D /pgdata/0{major_version}/dataОжидаемый результат:
done
server started -
Если конфигурация c pangolin-manager, действие сначала производится на мастере, затем на реплике:
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-адрес> | <IP-адрес>:<Порт> | Sync Standby | running | 2 | 0 |
| <IP-адрес> | <IP-адрес>:<Порт> | Leader | running | 2 | |
+---------------------+--------------------------+--------------+---------+----+-----------+
-