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

Утилиты засекречивания и хранения параметров подключения

В СУБД Pangolin реализован механизм защищенного хранения параметров подключения к базе данных (логинов, паролей и сопутствующих параметров). Механизм предназначен для исключения хранения паролей в открытом виде в конфигурационных файлах и для снижения риска их компрометации.

Защищенное хранилище представляет собой файл с параметрами подключения, сохраненными в засекреченном виде.

Особенности механизма:

  • параметры подключения не хранятся в открытом виде;
  • ключи кодирования уникальны в рамках узла;
  • ключи не сохраняются в явном виде, а вычисляются в процессе работы;
  • доступ к хранилищу ограничен системным пользователем postgres.

Утилиты, выполняющие автоматизированное подключение к БД, получают параметры подключения из защищенного хранилища и используют их для установления соединения.

Для управления хранилищем и засекречивания параметров подключения используется набор специализированных утилит:

  • pg_auth_config — утилита засекречивания/хранения параметров подключения к БД;
  • pg_auth_password — утилита засекречивания паролей. Позволяет получить пароль в засекреченном виде после ввода исходного пароля;
  • pangolin_password_hash - утилита для получения хеш-сумм паролей для заполнения пользовательского конфигурационного файла;
  • pangolin-auth-reencrypt – утилита перекодирования паролей, которая используется для восстановления работоспособности узла кластера при смене параметров сервера.

При работе с расширением oracle_fdw пароль пользователя oracle вносится в хранилище паролей, но для того, чтобы этот пароль проверялся при вызове команды: pg_auth_config check, необходимо в поле appnames добавлять значение oracle_fdw. Аналогично утилита работает с паролем для расширения tds_fdw, для использования правильного драйвера при проверке необходимо в поле appnames добавлять значение tds_fdw.

Внимание!

Ключи, используемые при засекречивании паролей, уникальны для сервера. Они вычисляемые и нигде не хранятся.

Как следствие, пароли в засекреченном виде и файл хранилища:

  • применимы только в рамках сервера, где выполнялось кодирование;
  • уникальные/свои для каждого узла кластера.

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

Внимание!

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

Внимание!

Необходимо добавить в конфигурационный параметр session_preload_libraries secret_dump для загрузки библиотеки secret_dump.so при старте бэкенда, что бы происходило маскирование аргументов функции установки и получения пароля. Если не добавить secret_dump в session_preload_libraries, то может произойти раскрытие пароля.

Утилита засекречивания и хранения параметров подключения к БД (pg_auth_config)

Сведения

Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.

Утилиты, выполняющие автоматизированное подключение к БД, выполняют получение параметров подключения из защищенного хранилища для дальнейшего подключения к БД.

Утилита pg_auth_config располагается в каталоге $PGHOME/bin и доступна только владельцу (postgres), при добавлении записей формирует засекреченное хранилище, которое хранится в файле /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg. Ключи, используемые при кодировании, уникальны в рамках узла. Они не хранятся, а вычисляются в процессе. Также возможно добавление нескольких записей одной командой через разделитель «,».

примечание

В качестве ключа засекречивания используется фраза, конструируемая из параметров:

  • парольная фраза – CPU manufacturer ID CPU, CPU stepping, CPU model, CPU family, CPU feature flags, список MAC и IP-адресов постоянных сетевых интерфейсов;
  • соль – тип credentials, machineId из /etc/machine-id, UUID корневой файловой системы, домен для использования credentials (сейчас POSTGRESQL - для засекречивания конфигурационных файлов компонент отказоустойчивого кластера или KMS - для засекречивания параметров доступа к KMS).

Алгоритм определяется сконфигурированным плагином засекречивания (по умолчанию AES-256). Хранилище может быть рассекречено только на узле, где было создано. Оно автоматически формируется на этапе установки дистрибутива СУБД Pangolin.

Параметры

Запуск утилиты pg_auth_config без параметров и опций отображает параметры использования:

pg_auth_config - view and edit encrypted postgres credentials
Usage:
pg_auth_config show | add | remove | check | reset | edit [options...]
Options:
--host [-h] host (add only: hosts delimited by ",") for which password will be used
--json [-j] show in json format
--port [-p] port (add only: ports delimited by ",") for which password will be used
--user [-U] user name for which password will be used
--database-all [-D] specify all database mark (must be before --database if both)
--database [-d] database (add only: databases delimited by ",") for which password will be used
--all [-a] check only: database (databases delimited by ",") for the 'all' lines during check, use "-" to ignore
--skip-confirm [-s] manual input without confirmation
--roles [-r] list of roles (delimited by ",") for which password usage is allowed, e.g. "u1,u2"
--appnames [-n] list of application names (delimited by ",") for which password usage is allowed, e.g. "pg_cron,postgres_fdw"
--check-role [-R] check only: role for which password usage permission will be checked (presence in list of roles)
--check-appname [-N] check only: application name for which password usage permission will be checked (presence in list of application names)
--help show this help, then exit

Pangolin product version information:
--product_version prints product name and version
--product_build_info prints product build number, date and hash
--product_component_hash prints component hash string

The 'pg_auth_config' utility is used to securely save password information
for internal Pangolin utilities
Using corresponding host, port, database tuples if multiple provided
the concept is simular to .pgpass, except this utility encrypts password information
Report bugs to <pangolin@sbertech.ru>.

Параметры host и port необходимы для того, чтобы пароль нельзя было использовать для подключения к произвольным БД, в том числе к модифицированным версиям postgres, показывающим, с каким паролем пыталось произойти подключение. Запись в хранилище можно перезаписать только целиком. Например, нельзя поменять отдельно только host. Для добавления множества записей одной командой количество host, port, database, написанных через разделитель , должно совпадать:

Также в качестве аргумента можно передать список ролей roles (разделенных ,) или список имен приложений appnames (разделенных ,), для которых разрешено использование пароля.

add

Команда add добавляет в хранилище пароль пользователя name. По умолчанию утилита дважды просит ввести пароль. Передача пароля через командную строку отсутствует.

Внимание!

В момент добавления пароля в хранилище его корректность не проверяется (не проводится сверка с паролем, хранящимся в БД).

Пример использования:

$ pg_auth_config add -h 127.0.0.1 -p 5433 -d postgres -U test --roles="test,test2" --appnames="app1,app2"
enter password:
****
confirm password:
****

Опция --skip-confirm позволяет не запрашивать второго ввода пароля. Данную опцию рекомендуется использовать в автоматизированных системах, когда ввод пароля автоматизирован.

$ pg_auth_config add -h 127.0.0.1 -p 5432 -d postgres -U test --skip-confirm

enter password:
****
confirm password:
****

Через разделитель , можно добавить несколько записей одной командой:

$ pg_auth_config add -h <IP-Address>,<IP-Address> -p 5432,1234 -U postgres -d database,dabatase1 --roles="test,test2" --appnames="app1,app2"

show

Команда show выводит в консоль содержимое хранилища (за исключением паролей).

Пример использования:

$ pg_auth_config show

| host | port | database | username | roles | appnames |
|---------------------------------------------------------------------------------|
| localhost | 5433 | postgres | patroni | | |
| localhost | 5433 |replication | patroni | | |
| <hostname> | 5433 | postgres | patroni | | |
| <hostname> | 5433 |replication | patroni | | |
| <hostname> | 5433 | database | user | | |
| <hostname> | 5433 | database | user1 | | |

Команда show позволяет выборочно выводить в консоль данные, используя конкретные параметры подключения: host, port, database или user.

Пример использования:

  • Пример просмотра данных с параметрами host и port:

    $ pg_auth_config show -h 127.0.0.1 -p 5433

    | host | port | database | username | roles | appnames |
    |-----------------------------------------------------------------------|
    | 127.0.0.1 | 5433 | postgres |backup_user | | |
  • Пример просмотра данных с параметром database:

    $ pg_auth_config show -d replication

    | host | port | database | username | roles | appnames |
    |-------------------------------------------------------------------------------|
    | localhost | 5433 |replication | patroni | | |
    | srv-1-1 | 5433 |replication | patroni | | |
    | srv-1-2 | 5433 |replication | patroni | | |

Команда show также может использоваться вместе с опцией --json.

Пример использования:

$ pg_auth_config show --json

{
"records" :
[
{
"appnames" : [],
"database" : "database",
"host" : {IP-Address},
"port" : {Порт},
"roles" : [],
"username" : "postgres"
},
{
"appnames" : [],
"database" : "dabatase",
"host" : {IP-Address},
"port" : {Порт},
"roles" : [],
"username" : "postgres"
}
]
}

check

Команда check проверяет актуальность данных в хранилище с данными БД. При подключении к БД используются параметры подключения из хранилища.

Пример использования:

$ pg_auth_config check

Connection settings for host: "localhost", port {Порт}, database "postgres", user "patroni" are OK
Connection settings for host: "localhost", port {Порт}, database "replication", user "patroni" are OK
Connection settings for host: "srv-1-1", port {Порт}, database "postgres", user "patroni" are OK
Connection settings for host: "srv-1-1", port {Порт}, database "replication", user "patroni" are OK
Could not connect with host: "srv-1-1", port {Порт}, database "postgres", user "test"...

Сообщение «Connection settings for host...» говорит о пройденной успешной проверке.

Сообщение «Could not connect with host:...» говорит о неуспешной проверке.

Если не удалось установить соединение с сервером по причине «исчерпан лимит подключений», формируется соответствующее сообщение с подсказкой: too many clients, try again.

Команда check позволяет выборочно проверять актуальность данных, используя конкретные параметры подключения: host, port, database или user.

Пример использования:

  • Пример проверки данных с параметрами host и port:

    $ pg_auth_config check -h 127.0.0.1 -p 5433

    Connection settings for host: "127.0.0.1", port "5433", database "postgres", user "backup_user" are OK
  • Пример проверки данных с параметром database:

    $ pg_auth_config check -d replication

    Connection settings for host: "localhost", port "5433", database "replication", user "patroni" are OK
    Connection settings for host: "srv-1-1", port "5433", database "replication", user "patroni" are OK
    Connection settings for host: "srv-1-2", port "5433", database "replication", user "patroni" are OK
  • Пример проверки данных с параметром user:

    $ pg_auth_config check -U patroni

    Connection settings for host: "localhost", port "5433", database "postgres", user "patroni" are OK
    Connection settings for host: "localhost", port "5433", database "replication", user "patroni" are OK
    Connection settings for host: "srv-1-1", port "5433", database "postgres", user "patroni" are OK
    Connection settings for host: "srv-1-1", port "5433", database "replication", user "patroni" are OK
    Connection settings for host: "srv-1-2", port "5433", database "postgres", user "patroni" are OK
    Connection settings for host: "srv-1-2", port "5433", database "replication", user "patroni" are OK
  • Пример проверки данных с параметрами host, port, database, user:

    $ pg_auth_config check -h 127.0.0.1 -p 5433 -d replication -U patroni

    Connection settings for host: "127.0.0.1", port "5433", database "replication", user "patroni" are OK

Во всех режимах работы утилиты проверяется введенное значения порта. Значение порта должно находиться в диапазоне от 1 до 65535 (включительно).

Внимание!

Для того, чтобы данная команда использовала правильный драйвер при проверке пароля для oracle_fdw или tds_fdw, необходимо чтобы в поле appnames была добавлена соответствующая запись (oracle_fdw или tds_fdw).

remove

Команда remove удаляет запись, связанную с host, port, database, user. Команда выводит запрос на подтверждение операции удаления.

Пример использования:

$ pg_auth_config remove -h srv-1-1 -p 5433 -U user -d database

Do you want to remove auth record? (yes/no)?:
yes
Going to remove auth record for user: "user", host: "srv-1-1", port: "5433", database: "database"
record removed

reset

Команда reset очищает хранилище. Команда выводит запрос на подтверждение очистки хранилища. После выполнения команды файл /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg переименовывается в /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg.reset. Утилита не имеет команды для восстановления файла. Для восстановления необходимо самостоятельно переименовать файл /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg.reset в /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg.

Пример использования:

  • Очистка хранилища:

    $ pg_auth_config reset

    Do you want to reset auth config? (yes/no)?:
    yes
    Auth config was reset
  • Просмотр содержимого хранилища после очистки:

    $ pg_auth_config show

    Cannot load auth config (file is not found)
  • Восстановление файла хранилища:

    $ mv /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg.reset /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg
  • Просмотр содержимого хранилища после восстановления:

    $ pg_auth_config show

    | host | port | database | username | roles | appnames |
    |--------------------------------------------------------------------------------|
    | localhost | 5433 | postgres | patroni | | |
    | localhost | 5433 |replication | patroni | | |
    | srv-1-1 | 5433 | postgres | patroni | | |
    | srv-1-1 | 5433 |replication | patroni | | |
    | srv-1-2 | 5433 | postgres | patroni | | |
    | srv-1-2 | 5433 |replication | patroni | | |

edit

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

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

--host [-h] — имя хоста
--port [-p] — номер порта
--user [-U] — имя пользователя
--database [-d] — название базы данных

Пример запуска утилиты в режиме редактирования (поиск по ключу: имя пользователя patroni, название базы данных postgres):

$ pg_auth_config edit -U patroni -d postgres

При этом, если:

  • не задано ни одного поля, то работа утилиты завершится, и будет выведено предупреждение:

    At least one field must be defined: host, port, username, database
  • записи, соответствующие ключу поиска, не найдены, то работа утилиты завершится, и будет выведено предупреждение:

    Nothing to update: records not found
  • записи, соответствующие ключу поиска, найдены, то утилита перейдет в интерактивный режим ввода новых значений. Например, предложение на ввод новых значений для поля port (номер порта):

    enter port or leave empty to skip update:
    примечание

    Ввод нового пароля будет запрошен, если ключ поиска содержит имя пользователя.

    Если новые значения получены, то утилита выведет список обновляемых записей. Пример обновления двух записей:

    Going to update 2 records:

    | host | port | database | username | roles | appnames |
    |----------------------------------------------------------------------------|
    | 127.0.0.1 |9000 -> 9001 | somedb1 |user1 -> user4 | | |
    | 127.0.0.2 |9000 -> 9001 | somedb1 |user1 -> user4 | | |

    В случае, если при запуске не указан ключ -s (--skip-confirm), то будет запрошено подтверждение операции редактирования записей.

    Do you want to update auth records? (yes/no)?:

    Для продолжения требуется ввести:

    • «y» или «yes» — для подтверждения операции редактирования;
    • «n» или «no» — для отмены операции редактирования.
  • не ввести ни одного нового значения для запрашиваемых полей, то работа утилиты завершится, и будет выведено предупреждение:

    Nothing to update: no new values provided
  • новые значения совпадают со старыми (например, найдена одна запись), то работа утилиты завершится, и будет выведено предупреждение:

    Nothing to update: new values for the records are the same as the old ones
  • в процессе обновления полей возникают дублирующие друг друга записи, то такие записи будут удалены.

    примечание

    Если записи дублируют друг друга, то сохраняется первая запись в списке.

    Для удаляемых записей будет указан признак «< rm» в конце записи. Пример удаления двух дублирующих записей (обновляется поле «название базы данных», уже существуют записи,совпадающие с обновляемыми):

    Going to update 2 records:

    | host | port | database | username | roles | appnames |
    |---------------------------------------------------------------------------------------------|
    | localhost | 5433 |replication -> postgres | patroni | | | < rm
    | srv-0-153 | 5433 |replication -> postgres | patroni | | | < rm

Доработка хранилища паролей для обеспечения безопасного взаимодействия с расширением postgres_fdw

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

В рамках данной доработки произведена реализация опциональных параметров утилиты pg_auth_config: --roles, --appnames. Они позволяют явно указать, какие пользователи и какие приложения могут использовать заданный пароль. Главной задачей здесь является не допустить использование записей из хранилища, непредназначенных для этого приложения. Это обеспечивает дополнительный уровень безопасности.

примечание

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

Дополнительно в вывод команды show утилиты, при использовании данных параметров, реализованы одноименные колонки. Пример вывода:

$ pg_auth_config show

| host | port | database | username | roles | appnames |
|----------------------|-------------------------------------|-----------------------------------------------|
| localhost | 5433 | postgres | postgres | postgres,patroni | pangolin-manager |
| localhost | 5433 |replication | postgres | | |
| 127.0.0.1 | 5433 | postgres | postgres | | |
| 127.0.0.1 | 5433 |replication | postgres | | |

Обработка значения универсального имени БД --database-all

При разборе файла /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg, введена специальная обработка значения универсального имени БД (--database-all). Сопоставление данных аутентификации выполняется следующим образом:

  1. Просматривается весь файл enc_utils_auth_settings.cfg до момента полного совпадения всех ключей (включая имя БД). При обнаружении используются данные аутентификации из найденной строки.
  2. Если требуемые данные не найдены — ищется подходящий вариант с универсальным именем БД. При обнаружении используются данные найденной строки.
  3. Если в предыдущих пунктах данные не найдены — отказ доступа из-за отсутствия данных аутентификации.

Получение данных аутентификации унифицировано для всех доступных интерфейсов. Универсальное имя БД отображается как all.

Примеры:

  1. Добавление записи:

    $ pg_auth_config add -p 5433 --database-all --user profile_tuz -h 127.0.0.1
    --database-all requested (specify any DB)

    Enter password:
    ***
    Confirm password:
    ***
    Going to add auth record for user: "profile_tuz", host: "127.0.0.1", port: "5433", database: "*** all ***"
    New record added

    В таблицу данных аутентификации будет добавлена запись:

    $ pg_auth_config show

    | host | port | database | username | roles | appnames |
    |------------------------------------------------------------------------|
    | 127.0.0.1 | 5433 |*** all *** |profile_tuz | | |
  2. Изменение записи типа all:

    $ pg_auth_config edit -h 127.0.0.1 --database-all -U profile_tuz
    --database-all requested (specify any DB)

    Enter port or leave empty to skip update:
    5434
    Enter host or leave empty to skip update:

    Enter username or leave empty to skip update:

    Enter database or leave empty to skip update:
    db9
    Enter password or leave empty to skip update:

    Enter roles or leave empty to skip update:

    Enter appnames or leave empty to skip update:

    Going to update 1 records:

    | host | port | database | username | roles | appnames |
    |---------------------------------------------------------------------------------|
    | 127.0.0.1 |5433 -> 5434 |*** all *** -> db9 |profile_tuz | | |

    Do you want to update auth records? (yes/no)?:
    y

    Запись изменена:

    $ pg_auth_config show

    | host | port | database | username | roles | appnames |
    |-----------------------------------------------------------------------|
    | 127.0.0.1 | 5434 | db9 |profile_tuz |
  3. Изменение обычной записи на тип all:

    $ pg_auth_config edit -h 127.0.0.1 --database-all -d db9 -U profile_tuz
    --database-all requested (specify any DB)

    Enter port or leave empty to skip update:

    Enter host or leave empty to skip update:

    Enter username or leave empty to skip update:

    Enter database or leave empty to skip update:

    Enter password or leave empty to skip update:

    Enter roles or leave empty to skip update:

    Enter appnames or leave empty to skip update:

    Going to update 1 records:

    | host | port | database | username | roles | appnames |
    |-------------------------------------------------------------------------------|
    | 127.0.0.1 | 5434 |db9 -> *** all *** |profile_tuz | | |

    Do you want to update auth records? (yes/no)?:
    y

    Запись изменена:

    $ pg_auth_config show

    | host | port | database | username | roles | appnames |
    |------------------------------------------------------------------------|
    | 127.0.0.1 | 5434 |*** all *** |profile_tuz | | |

Специфика работы команды check с универсальными именами БД

В отличие от строк с обычными именами (не типа all), которые сопоставляются на предмет полного совпадения, работа команды check с универсальными именами включает в себя:

  1. Подключение к БД template1 с данными авторизации из строки — если подключение неуспешно, выводится сообщение Cannot connect to template database for 'all' database specified., а также возвращается значение exit_code=1.
  2. Получение списка доступных БД на сервере — если получение списка неудачно, выводится сообщение Cannot get DB list for 'all' database specified. и возвращается значение exit_code=1.
  3. Подключение ко всем БД, полученным на предыдущем шаге, кроме БД, для которых есть отдельные данные авторизации с явным указанием имени БД.

В ходе выполнения первых двух шагов обработка списка не прерывается.

Для обработки случаев, когда получение списка БД невозможно (например, при отсутствии у пользователя прав для подключения к template1), есть возможность задать имена БД для проверки непосредственно параметром:

pg_auth_config check --all db1,db2

При таких сценариях проверяются все строки из таблицы аутентификации, но для строк с отметкой all будет выполняться проверка подключения только к db1 и db2 (без попыток доступа к template1 и без получения фактического списка БД).

Дополнительно предлагается вариант игнорирования проверки универсальных строк (database=all):

pg_auth_config check --all -

При такой установке параметра строки с отметкой all проверяться не будут.

Функция добавления пароля в засекреченное хранилище

Возможны ситуации когда администратору АС требуется завести задание в pg_cron. Для выполнения задания, pg_cron должен подключаться к БД, используя параметры подключения из засекреченного хранилища. Засекреченное хранилище должно содержать запись для выполнения задания pg_cron. Администратор АС не может использовать утилиту pg_auth_config для самостоятельного добавления записи в засекреченное хранилище и не может раскрыть пароль администратору БД, чтобы последний добавил запись. Для решения данной ситуации в Pangolin добавлена функция - add_auth_record_to_storage.

Подробное описание функции в документе «Справочная информация», раздел «Функция засекречивания и хранения параметров подключения».

Доработка функции add_auth_record_to_storage

В рамках функциональности «Доработка хранилища паролей для обеспечения безопасного взаимодействия с расширениями и внешними утилитами» была произведена доработка пользовательской функции add_auth_record_to_storage.

Реализована перегруженная версия функции, которая позволяет добавлять записи в хранилище с указанием дополнительных опций (roles, appnames). Для сохранения обратной совместимости предусмотрены параметры по умолчанию, поэтому можно использовать как расширенный, так и прежний вариант вызова.

Пример вызова функции:

SELECT add_auth_record_to_storage('127.0.0.1', 5433, 'db_name', 'user', 'password');

add_auth_record_to_storage
----------------------------

(1 row)

Пример использования:

SELECT add_auth_record_to_storage('127.0.0.1', 5433, 'db_name', 'user', 'password', 'role1,role2', 'appname1,appname2');

add_auth_record_to_storage
----------------------------

(1 row)

Текущий синтаксис функции:

add_auth_record_to_storage(host text,
port integer,
db_name text,
user text,
password text,
roles text[] DEFAULT '{}',
appnames text[] DEFAULT '{}');

Утилиты и расширения, использующие аутентификационные данные из засекреченного хранилища

Утилиты и расширения, использующие аутентификационные данные из засекреченного хранилища, перечислены в таблице ниже.

Наименование утилиты, расширенияСпособ использованияЦель использования
pg_profile, pg_cronПодключение ко всем пользовательским базам и БД postgres, а также подключение к узлу localhost для функционирования pg_cron. Для функционирования расширения по расписанию пароль ТУЗ profile_tuz сохраняется в защищенном хранилище (на обоих узлах) для подключения ко всем пользовательским базам и БД postgresАнализ производительности БД
dblinkИспользуются доработанные функции dblink для подключения к БД с паролем из защищенного хранилищаПодключение к другим БД PostgreSQL из базы данных
oracle_fdwРабота с таблицами в подключенной БД Oracle как с собственными таблицами в БД Pangolin. Расширение oracle_fdw предполагает обязательное сохранение пароля БД Oracle при создании user mapping, в Pangolin данное расширение доработано и использует pg_auth_config для хранения параметров подключения к БД OracleВозможность взаимодействия с Oracle server
tds_fdwРасширение tds_fdw предполагает сохранение login/password от сторонней БД при создании сопоставления пользователей. В Pangolin данное расширение доработано и использует pg_auth_config для хранения параметров подключения к БД MSSQL, SybaseВозможность link в MSSQL, Sybase
pg_probackupАвтоматическое подключение при снятии резервной копииСнятие резервной копии, получение WAL-файлов
pangolin-manager (patroni)Автоматическое подключение при репликацииРепликация между узлами кластера

Описание процессов использования утилиты pg_auth_config

Процесс добавления пароля (параметров подключения к БД) в засекреченное хранилище

Не имеет значения с какого узла кластера начинать изменение пароля. Файл конфигурации созданный на одном узле, например на лидере, не может быть рассекречен на реплике и наоборот.

  1. Выполняется проверка сотрудником сопровождения либо автоматически при первичной инсталляции Pangolin: будет настраиваться standalone или cluster. В случае типа конфигурации: standalone - переход к шагу 2, cluster - переход к шагу 3.

  2. Выполняется добавление параметров подключения к БД в засекреченное хранилище через утилиту pg_auth_config на standalone:

    • вызывается утилита с параметрами подключения к БД: pg_auth_config add --h <host> – p <port> --U <user> --d <dbname>;
    • вводится пароль пользователя;
    • в результате параметры подключения добавлены в засекреченное хранилище.
  3. Выполняется добавление параметров подключения к БД в засекреченное хранилище через утилиту pg_auth_config на cluster:

    • вызывается утилита с параметрами подключения к БД: pg_auth_config add --h <host> – p <port> --U <user> --d <dbname> на первом узле кластера;
    • вводится пароль пользователя;
    • в результате параметры подключения добавлены в засекреченное хранилище на первом узле кластера;
    • вызывается утилита с параметрами подключения к БД: pg_auth_config add --h <host> – p <port> --U <user> --d <dbname> на втором узле кластера;
    • вводится пароль пользователя;
    • в результате параметры подключения добавлены в засекреченное хранилище на втором узле кластера.
  4. В случае ручного добавления параметров подключения к БД рекомендуется выполнить проверку актуальности данных в засекреченном хранилище на корректность введенных паролей командой pg_auth_config check.

Процесс добавления пароля (параметров подключения к БД) в засекреченное хранилище Администратором АС

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

  1. Выполняется проверка администратором АС: будет настраиваться standalone или cluster. В случае типа конфигурации: standalone — переход к шагу 2, cluster — переход к шагу 3.

  2. Выполняется добавление параметров подключения к БД в засекреченное хранилище с помощью функции add_auth_record_to_storage на standalone:

    • вызывается функция add_auth_record_to_storage с указанием параметров подключения, например:

      SELECT  add_auth_record_to_storage('127.0.0.1', 5433, 'db_name', 'user', 'password');

      В результате параметры подключения добавлены в засекреченное хранилище.

  3. Выполняется добавление параметров подключения к БД в засекреченное хранилище через утилиту pg_auth_config на cluster:

    • вызывается функция add_auth_record_to_storage с указанием параметров подключения на первом узле кластера, например:

      SELECT  add_auth_record_to_storage('127.0.0.1', 5433, 'db_name', 'user', 'password');

      В результате параметры подключения добавлены в засекреченное хранилище на первом узле кластера;

    • вызывается функция add_auth_record_to_storage с указанием параметров подключения на втором узле кластера, например:

      SELECT  add_auth_record_to_storage('127.0.0.1', 5433, 'db_name', 'user', 'password');

      В результате параметры подключения добавлены в засекреченное хранилище на втором узле кластера.

  4. Рекомендуется выполнить проверку актуальности данных в засекреченном хранилище на корректность введенных паролей командой pg_auth_config check.

Аутентификация утилит через засекреченный пароль

В момент, когда утилита, используя функции libpq, подключится к БД, произойдет чтение и рассекречивание файла с конфигурацией, поиск пароля.

Пароль ищется по ключу: <host>#<port>#<db>#<user>.

В случае, если заданы roles и/или appnames произойдет сверка пользователя и имени приложения.

  1. Устанавливается старт подключения утилиты к БД, создается сессия в БД.
  2. Из конфигурации утилиты вычитываются параметры подключения к БД: host, port, db, user.
  3. Выполняется проверка имени роли и имени приложения на соответствие полям roles и appnames.
  4. Происходит рассекречивание файла /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg с паролями для подключения.
  5. Происходит поиск пароля по полученным параметрам подключения по ключу host#port#db#user#.
  6. В случае успешного рассекречивания найденного пароля выполняется подключение к БД с передачей хеша пароля, происходит авторизация по паролю в БД.
  7. В случае отсутствия файла /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg или невозможности его рассекретить, в лог журнала формируется сообщение с типом WARNING.
  8. В случае, если пароль не найден, в лог журнала формируется сообщение с типом WARNING.

Примеры использования

Настройка хранилища паролей для пользователя patroni

В данном разделе производится настройка хранилища паролей для пользователя patroni компонента Pangolin Manager.

Если текущий пароль неизвестен, то задается новый пароль в БД на мастере, а затем он записывается в хранилища паролей на мастере и реплике. Если текущий пароль patroni известен – достаточно выполнить только запись пароля в хранилище паролей на мастере и реплике.

примечание

Хранилище паролей (файл /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg) создается автоматически при использовании утилиты засекречивания/хранения параметров подключения к БД.

Пользователь patroni используется, как служебный пользователь кластера Pangolin, использующийся, в частности, для репликации (детали можно найти в /etc/pangolin-manager/postgres.yml).

Изменение пароля

Действие выполняется на основном узле.

Чтобы изменить пароль на основном узле, выполните:

ALTER USER "patroni" WITH ENCRYPTED PASSWORD '<patroni_pass>';
Запись пароля для пользователя patroni в хранилище паролей

Действие выполняется на основном узле и реплике.

Выполните запись пароля в хранилище паролей (в случае существования записей для пользователя patroni, они будут обновлены):

sudo su - postgres
pg_auth_config show

pg_auth_config add -s -h localhost -p 5433 -U patroni -d postgres
pg_auth_config add -s -h localhost -p 5433 -U patroni -d replication
pg_auth_config add -s -h {master_host} -p 5433 -U patroni -d postgres
pg_auth_config add -s -h {master_host} -p 5433 -U patroni -d replication
pg_auth_config add -s -h {replica_host} -p 5433 -U patroni -d postgres
pg_auth_config add -s -h {replica_host} -p 5433 -U patroni -d replication
pg_auth_config add -s -h {master_ip} -p 5433 -U patroni -d postgres
pg_auth_config add -s -h {master_ip} -p 5433 -U patroni -d replication
pg_auth_config add -s -h {replica_ip} -p 5433 -U patroni -d postgres
pg_auth_config add -s -h {replica_ip} -p 5433 -U patroni -d replication

Альтернативный вариант команды, где можно перечислить параметры через запятую (запрос пароля будет для каждой записи):

pg_auth_config  add -s -h localhost,localhost,{master_host},{master_host},{replica_host},{replica_host},{master_ip},{master_ip},{replica_ip},{replica_ip} -p 5433,5433,5433,5433,5433,5433,5433,5433,5433,5433 -d postgres,replication,postgres,replication,postgres,replication,postgres,replication,postgres,replication -U patroni

Проверьте, что записи в хранилище корректны и не возникает ошибок:

pg_auth_config check

Настройка хранилища паролей для пользователя backup_user

В данном разделе производится настройка хранилища паролей для пользователя backup_user.

Если текущий пароль backup_user неизвестен, то задается новый пароль, а затем он записывается в хранилище паролей на основном узле и реплике. Если текущий пароль backup_user известен – достаточно выполнить только запись пароля в хранилище паролей.

Изменение пароля

Действие выполняется на основном узле.

Чтобы изменить пароль на основном узле, выполните:

ALTER USER "backup_user" WITH PASSWORD '{backup_user_pass}';
Запись пароля для пользователя backup_user в хранилище паролей

Действие выполняется на основном узле и реплике.

Выполните запись пароля в хранилище паролей (в случае существования записей для пользователя backup_user, они будут обновлены):

sudo su - postgres
pg_auth_config show

pg_auth_config add -s -h {master_host} -p 5433 -U backup_user -d postgres
pg_auth_config add -s -h {replica_host} -p 5433 -U backup_user -d postgres
pg_auth_config add -s -h {master_ip} -p 5433 -U backup_user -d postgres
pg_auth_config add -s -h {replica_ip} -p 5433 -U backup_user -d postgres
pg_auth_config add -s -h localhost -p 5433 -U backup_user -d postgres
pg_auth_config add -s -h 127.0.0.1 -p 5433 -U backup_user -d postgres

Альтернативный вариант команды, где можно перечислить параметры через запятую (запрос пароля будет для каждой записи):

pg_auth_config  add -s -h {master_host},{replica_host},{master_ip},{replica_ip},localhost,127.0.0.1 -p 5433,5433,5433,5433,5433,5433 -d postgres,postgres,postgres,postgres,postgres,postgres -U backup_user

Проверьте, что записи в хранилище корректны и не возникает ошибок:

pg_auth_config check

Настройка хранилища паролей для пользователя profile_tuz

В данном разделе производится настройка хранилища паролей для пользователя profile_tuz.

Если текущий пароль profile_tuz неизвестен, то задается новый пароль в БД на мастере, а затем он записывается в хранилище паролей на мастере и реплике. Если текущий пароль profile_tuz известен – достаточно выполнить запись пароля в хранилище паролей на мастере и реплике.

Изменение пароля

Действие выполняется на основном узле.

Измените пароль в СУБД на основном узле:

ALTER USER "profile_tuz" WITH PASSWORD '{profile_tuz_pass}';

Запись пароля для пользователя profile_tuz в хранилище паролей

Действие выполняется на основном узле и реплике.

Выполните запись пароля в хранилище паролей (в случае существования записей для пользователя profile_tuz, они будут обновлены):

sudo su - postgres
pg_auth_config show

pg_auth_config add -s -h localhost -p 5433 -U profile_tuz -d postgres
pg_auth_config add -s -h localhost -p 5433 -U profile_tuz -d "First_db"
pg_auth_config add -s -h {master_host} -p 5433 -U profile_tuz -d postgres
pg_auth_config add -s -h {master_host} -p 5433 -U profile_tuz -d "First_db"
pg_auth_config add -s -h {replica_host} -p 5433 -U profile_tuz -d postgres
pg_auth_config add -s -h {replica_host} -p 5433 -U profile_tuz -d "First_db"

Альтернативный вариант команды, где можно перечислить параметры через запятую (запрос пароля будет для каждой записи):

pg_auth_config  add -s -h localhost,localhost,{master_host},{master_host},{replica_host},{replica_host} -p 5433,5433,5433,5433,5433,5433 -d postgres,"First_db",postgres,"First_db",postgres,"First_db" -U profile_tuz

Проверьте, что записи в хранилище корректны и не возникает ошибок:

pg_auth_config check

Установка пароля для пользователя kmadmin_pg

Действие выполняется на основном узле и реплике.

Если на основном узле существует пользователь kmadmin_pg, то следует установить пароль на реплике соответственно:

sudo su - {username}
sudo passwd kmadmin_pg

Утилита засекречивания паролей, представленных в открытом виде (pg_auth_password)

Сведения

Функциональность доступна только для редакций Enterprise и Enterprise для ERP-систем.

Для исключения хранения паролей в открытом виде и предотвращения компрометации паролей командой развития Pangolin разработана утилита для засекречивания паролей pg_auth_password. Утилита pg_auth_password располагается в каталоге /opt/pangolin-auth-password/bin, доступна только владельцу (postgres).

Установка утилиты pg_auth_password

Для установки утилиты pg_auth_password выполните команду установки поставляемого rpm/deb-пакета из дистрибутива в каталоге utilities/:

примечание

При выборе автоматизированной установки СУБД утилита будет установлена автоматически.

sudo dnf install pangolin-auth-password-{product_version}-{OS}.x86_64.rpm

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

sudo dnf install pangolin-auth-password-8.2.0-sberlinux9.x86_64.rpm

Утилита pg_auth_password выполняет только одно действие — засекречивание паролей.

На вход утилита pg_auth_password принимает пароль, результат выполнения выводится в консоль. Засекреченный пароль используется в конфигурационных файлах.

Формат засекреченного пароля:

$enc$<encrypted_password_in_base64>

Где:

  • $enc$ — признак засекреченного пароля;
  • <encrypted_password_in_base64> — засекреченный пароль в формате base64.

Засекреченный пароль используется:

  • Pangolin Manager для выполнения запросов по REST API и взаимодействия с etcd (прописывается в конфигурации Pangolin Manager);
  • postgres для выполнения ldap binding (прописывается в LDAP записи pg_hba.conf файла).

Параметры использования

Запуск утилиты pg_auth_passwordс опцией --help отображает параметры использования:

$ /opt/pangolin-auth-password/bin/pg_auth_password --help
Утилита 'pg_auth_password' предназначена для засекречивания пароля.

Использование:
/opt/pangolin-auth-password/bin/pg_auth_password enc [OPTION]

Опции:
-s, --skip-confirm ручной ввод без подтверждения
-W, --password <password> пароль вводится в качестве аргумента
-t, --trim возвращает пароль без нулевого конечного байта

Другие опции:
-V, --version вывод информации о версии
-h, --help вывод справки

Информация о версии продукта Pangolin:
--product_version выводит название и версию продукта
--product_build_info выводит номер, дату и хеш сборки продукта
--product_component_hash выводит хеш-строку компонента
Внимание!

Для работы других опций и информации о версии продукта Pangolin ввод enc -t не требуется:

$ /opt/pangolin-auth-password/bin/pg_auth_password -v

Утилита имеет одну команду enc -t и несколько опций (--skip-confirm, --password <password>), которые упрощают действия по засекречиванию пароля.

  • enc -t — команда засекречивает пароль, который может быть введен или передан в виде аргумента. По умолчанию утилита дважды просит ввести пароль. Результат выводится в консоль.

    Пример использования:

    $ /opt/pangolin-auth-password/bin/pg_auth_password enc -t

    enter password:
    **********************
    enter password:
    **********************
    $enc${hash}

Использование утилиты с опциями:

  • --skip-confirm / -s: подтверждение пароля не требуется. Данную опцию рекомендуется использовать в автоматизированных системах, когда ввод пароля автоматизирован.

    Пример использования:

    $ /opt/pangolin-auth-password/bin/pg_auth_password enc -t -s

    enter password:
    ***************
    $enc${hash}

    либо:

    /opt/pangolin-auth-password/bin/pg_auth_password enc -t --skip-confirm

    enter password:
    ***************
    $enc${hash}
  • --password / -W: пароль передается в виде аргумента. При указании данной опции — запрос пароля из консоли не производится.

    Пример использования:

    $ /opt/pangolin-auth-password/bin/pg_auth_password enc -t -W test

    $enc${hash}

    либо:

    $ /opt/pangolin-auth-password/bin/pg_auth_password enc -t --password test

    $enc${hash}

Описание процессов использования утилиты pg_auth_password

Процесс добавления засекреченного пароля в конфигурационный файл

Примечание

Параметры хранятся в файле в зависимости от типа конфигурации сервера: в файле$PGDATA/pg_hba.conf, либо в файле /etc/pangolin-manager/postgres.yml в секции pg_hba в случае кластерной конфигурации.

  1. Выполняется проверка сотрудником сопровождения либо автоматически при первичной инсталляции Pangolin: будет настраиваться standalone или cluster. В случае типа конфигурации:

    • standalone — переход к шагу 2;
    • cluster — переход к шагу 3.
  2. Выполняется формирование засекреченного пароля через утилиту pg_auth_password на standalone:

    • вызывается утилита /opt/pangolin-auth-password/bin/pg_auth_password enc -t;
    • вводится пароль для получения его в засекреченном виде;
    • полученный засекреченный пароль в формате base64 копируется и вносится для нужного пользователя в конфигурационный файл путем редактирования;
    • для вступления в силу выполняется перечитывание конфигурации командой reload.
  3. Выполняется формирование засекреченного пароля через утилиту pg_auth_password на первом узле кластера:

    • вызывается утилита /opt/pangolin-auth-password/bin/pg_auth_password enc -t на первом узле кластера;
    • вводится пароль для получения его в засекреченном виде;
    • полученный засекреченный пароль в формате base64 копируется и вносится для нужного пользователя в конфигурационный файл путем редактирования;
    • для вступления в силу выполняется перечитывание конфигурации командой reload.
  4. Выполняется формирование засекреченного пароля через утилиту pg_auth_password на втором узле кластера:

    • вызывается утилита /opt/pangolin-auth-password/bin/pg_auth_password enc -t на втором узле кластера;
    • вводится пароль для получения его в засекреченном виде;
    • полученный засекреченный пароль в формате base64 копируется и вносится для нужного пользователя в конфигурационный файл путем редактирования;
    • для вступления в силу выполняется перечитывание конфигурации командой reload.

Аутентификация пользователя, использующего засекреченный пароль от ТУЗ для подключения к LDAP/AD

Процесс аутентификации пользователя, использующего засекреченный пароль от УЗ для подключения к LDAP/AD, происходит по следующему алгоритму:

  1. Устанавливается подключение пользователя к БД, создается сессия в БД.
  2. Вычитываются параметры для подключения к LDAP/AD из конфигурационного файла.
  3. Анализируются поля ldapbindpasswd: является ли пароль засекреченным или пароль представлен в открытом виде.
  4. Если пароль засекречен, то происходит его рассекречивание и аутентификация с LDAP/AD.
  5. В случае, если пароль представлен в открытом виде, то выполняется аутентификация с LDAP/AD.
  6. Происходит анализ результата аутентификации с LDAP/AD.
  7. Если аутентификация пройдена, то выполняется подключение пользователя к БД.
  8. Если аутентификация не пройдена, то выполняется разрыв соединения с клиентом.

Включение/отключение функциональности засекречивания паролей

Новая функциональность позволяет развернуть СУБД Pangolin без засекреченного хранилища.

Описание решения

Реализация решения в части инсталлятора

В скриптах развертывания и обновления создание засекреченного хранилища и засекречивание паролей в конфигурационных файлах (postgres.yml и pg_hba.conf) определено под условие, которое контролируется параметром auth_encrypt в пользовательском конфигурационном файле. Значение по умолчанию: true.

В конфигурационный файл Pangolin Manager (postgres.yml) добавлены следующие параметры:

  • postgresql.pgpass - путь к файлу со строкой подключения, если засекреченное хранилище отсутствует. Значение по умолчанию: /home/postgres/.pgpass.

     postgres.yml
    postgresql:
    pgpass: "{{ PGUSERHOME }}/.pgpass"
  • postgresql.authentication.replication.password - пароль суперпользователя для репликации. Значение по умолчанию: patroni_password.

    postgres.yml
    postgresql:
    authentication:
    replication:
    password: '{{ patroni_user_pass }}'
  • postgresql.authentication.superuser.password - пароль для суперпользователя. Значение по умолчанию: patroni_password.

    postgres.yml
    postgresql:
    authentication:
    superuser:
    password: '{{ patroni_user_pass }}'

Внесены изменения в конфигурацию службы pangolin_reencrypt. Блок о enc_utils_auth_settings.cfg не будет записан, если файл не был найден.

Реализована возможность задать индивидуальный пароль для пользователя patroni в пользовательском конфигурационном файле. Регулируется параметром patroni_password(опциональный). Если пароль не задан, будет сгенерирован случайный.

В процессе обновления была реализована проверка на наличие засекреченного хранилища. При наличии файла /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg параметр auth_encrypt выставляется в true.

Реализация решения в части Pangolin Manager

Pangolin Manager автоматически создает файл .pgpass, если засекреченное хранилище паролей отсутствует. Создание файла происходит, если не проинициализирован контекст (отсутствует плагин засекречивания) или отсутствует файл /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg. Данные о том, где создать файл Pangolin Manager определяет из конфигурационного файла postgres.yml, секция postgresql.pgpass.

Скорректирована запись в логе Pangolin Manager при работе без засекреченного хранилища. Сообщение лога «using password from encrypted store for ...» заменено на «using password from the config for ...».

Утилита pg_auth_config создает файл /etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg только при добавлении записи в файл (аргумент add). Если файл не существовал, аргументы remove, show, check и edit создавали файл нулевого размера. Логика работы этих команд изменена. При отсутствии файла они будут выдавать ошибку \x1B[0mCannot load auth config (file is not found), где \x1B[0m - спец. цветовой символ (белый).

Ограничения

Ограничения в работе службы pangolin_reencrypt

  1. Отсутствие файла или пароля внутри файла, которые прописаны в конфигурации службы pangolin_reencrypt, приведет к ошибке в работе перекодирования. Поэтому служба включается в процессе инсталляции только тогда, когда auth_encrypt: true и auth_reencrypt: true.
  2. Перед стартом инсталляции нельзя задать перечень ролей, пароли которых будут включены в засекречивание или блоки конфигурационных файлов, содержащие пароли, которые нужно засекретить.

Включение функциональности

Автоматическая установка

Значение true для параметра auth_encrypt позволит включить использование решения.

Автоматическое обновление

Реализация решения в обновлении не предусмотрена. Включить функциональность засекречивания нельзя, если на исходном стенде ее не было.

Ручное включение

Примечание

Действия производятся на ранее установленном стенде без засекреченного хранилища паролей.

Процесс включения засекреченного хранилища можно условно разделить на два этапа:

  • перевод незасекреченных паролей в конфигурационных файлах postgres.yml и pg_hba.conf в засекреченный вид с помощью утилиты засекречивания паролей pg_auth_password:

    1. Для стенда в кластерной конфигурации засекретьте пароли следующих секций в файле postgres.yml:

      postgres.yml
      restapi:
      authentication:
      username: patroniyml
      password: <patroniyml_pass>
      etcd:
      username: patronietcd
      password: <patronietcd_pass>
      postgresql:
      pg_hba:
      ldapbindpasswd="{{ ldap_pass }}"
    2. Действие по засекречиванию нужно производить поочередно на каждом узле. Произведите засекречивание паролей на лидере:

      {{ patroniyml_pass }}
      sudo su - postgres
      /opt/pangolin-auth-password/bin/pg_auth_password enc -t

      Ожидаемый результат:

      enter password:
      ***************************
      enter password:
      ***************************
      $enc${hash}
      {{ patronietcd_pass }}
      sudo su - postgres
      /opt/pangolin-auth-password/bin/pg_auth_password enc -t

      Ожидаемый результат:

      enter password:
      ***************************
      enter password:
      ***************************
      $enc${hash}
      {{ ldap_pass }}
      sudo su - postgres
      /opt/pangolin-auth-password/bin/pg_auth_password enc -t

      Ожидаемый результат:

      enter password:
      ***************************
      enter password:
      ***************************
      $enc${hash}
    3. Замените открытые пароли на лидере на полученный результат засекречивания:

      Ожидаемый результат:

      postgres.yml

      restapi:
      authentication:
      username: patroniyml
      password: <password_example>
      etcd:
      username: patronietcd
      password: <password_example>
      postgresql:
      pg_hba:
      ldapbindpasswd="$enc${hash}"
    4. Перечитайте конфигурацию на лидере:

      sudo su - postgres
      reload

      Ожидаемый результат:

      + Cluster: clustername (7205282150766022368) ------+--------------+---------+----+-----------+
      | Member | Host | Role | State | TL | Lag in MB |
      +----------------------+---------------------------+--------------+---------+----+-----------+
      | srv-0-172 | srv-0-172:5433 | Leader | running | 2 | |
      | srv-0-182 | srv-0-182:5433 | Sync Standby | running | 2 | 0 |
      +----------------------+---------------------------+--------------+---------+----+-----------+
      Are you sure you want to reload members srv-0-182, srv-0-172? [y/N]: y
      Reload request received for member srv-0-182 and will be processed within 10 seconds
      Reload request received for member srv-0-172 and will be processed within 10 seconds
    5. Произведите действия с пункта 2 по 4 на реплике.

  • создание засекреченного хранилища паролей с помощью утилиты pg_auth_config:

    1. Для корректной работы компонента Pangolin Manager добавьте следующие строки в хранилище с помощью утилиты pg_auth_config, где -h - хост, для которого будет использоваться пароль, -p - порт, для которого будет использоваться пароль, -U - имя пользователя, для которого будет использоваться пароль, -d - база данных, для которой будет использоваться пароль. Действие нужно произвести на обоих узлах:

      sudo su - postgres
      pg_auth_config add -s -h localhost -p 5433 -U patroni -d postgres

      Ожидаемый результат:

      Enter password:
      *******************
      Going to add auth record for user: "patroni", host: "localhost", port: "5433", database: "postgres"
      New record added
      sudo su - postgres
      pg_auth_config add -s -h localhost -p 5433 -U patroni -d replication

      Ожидаемый результат:

      Enter password:
      *******************
      Going to add auth record for user: "patroni", host: "localhost", port: "5433", database: "replication"
      New record added
      sudo su - postgres
      pg_auth_config add -s -h srv-0-172 -p 5433 -U patroni -d postgres

      Ожидаемый результат:

      Enter password:
      *******************
      Going to add auth record for user: "patroni", host: "srv-0-172", port: "5433", database: "postgres"
      New record added
      sudo su - postgres
      pg_auth_config add -s -h srv-0-172 -p 5433 -U patroni -d replication

      Ожидаемый результат:

      Enter password:
      *******************
      Going to add auth record for user: "patroni", host: "srv-0-172", port: "5433", database: "replication"
      New record added
      sudo su - postgres
      pg_auth_config add -s -h srv-0-182 -p 5433 -U patroni -d postgres

      Ожидаемый результат:

      Enter password:
      *******************
      Going to add auth record for user: "patroni", host: "srv-0-182", port: "5433", database: "postgres"
      New record added
      sudo su - postgres
      pg_auth_config add -s -h srv-0-182 -p 5433 -U patroni -d replication

      Ожидаемый результат:

      Enter password:
      *******************
      Going to add auth record for user: "patroni", host: "srv-0-182", port: "5433", database: "replication"
      New record added
    2. Проверьте работоспособность хранилища паролей:

      sudo su - postgres
      pg_auth_config check

      Ожидаемый результат:

      Connection settings for host: "localhost", port "5433", database "postgres", user "patroni" are OK
      Connection settings for host: "localhost", port "5433", database "replication", user "patroni" are OK
      Connection settings for host: "srv-0-172", port "5433", database "postgres", user "patroni" are OK
      Connection settings for host: "srv-0-172", port "5433", database "replication", user "patroni" are OK
      Connection settings for host: "srv-0-182", port "5433", database "postgres", user "patroni" are OK
      Connection settings for host: "srv-0-182", port "5433", database "replication", user "patroni" are OK
    3. Удалите из конфигурационного файла Pangolin Manager следующие параметры: postgresql.pgpass: /home/postgres/.pgpass, postgresql.authentication.replication.password: '<password>', postgresql.authentication.superuser.password: '<password>'.

    4. Удалите файл /home/postgres/.pgpass на обоих узлах.

    5. Перечитайте конфигурацию и перезапустите сервер на лидере:

      sudo su - postgres
      reload

      Ожидаемый результат:

      + Cluster: clustername (7205282150766022368) ------+--------------+---------+----+-----------+
      | Member | Host | Role | State | TL | Lag in MB |
      +----------------------+---------------------------+--------------+---------+----+-----------+
      | srv-0-172 | srv-0-172:5433 | Leader | running | 2 | |
      | srv-0-182 | srv-0-182:5433 | Sync Standby | running | 2 | 0 |
      +----------------------+---------------------------+--------------+---------+----+-----------+
      Are you sure you want to reload members srv-0-182, srv-0-172? [y/N]: y
      Reload request received for member srv-0-182 and will be processed within 10 seconds
      Reload request received for member srv-0-172 and will be processed within 10 seconds
      sudo su - postgres
      restart --force

      Ожидаемый результат:

      + Cluster: clustername (7205282150766022368) ------+--------------+---------+----+-----------+
      | Member | Host | Role | State | TL | Lag in MB |
      +----------------------+---------------------------+--------------+---------+----+-----------+
      | srv-0-172 | srv-0-172:5433 | Leader | running | 2 | |
      | srv-0-182 | srv-0-182:5433 | Sync Standby | running | 2 | 0 |
      +----------------------+---------------------------+--------------+---------+----+-----------+
      Success: restart on member srv-0-172
      Success: restart on member srv-0-182
    6. Аналогичным образом производится добавление паролей для других пользователей БД в засекреченное хранилище паролей.

    7. Подключите службу перекодирования на обоих узлах:

      sudo su
      systemctl start pangolin_reencrypt@postgres.service
      systemctl status pangolin_reencrypt@postgres.service

      Ожидаемый результат:

       ● pangolin_reencrypt@postgres.service - Runners Pangolin reencrypt service (postgres)
      Loaded: loaded (/usr/lib/systemd/system/pangolin_reencrypt@.service; enabled; vendor preset: disabled)
      Active: active (running) since Tue 2023-01-31 11:30:43 MSK; 5h 48min ago
      Process: 3316 ExecStartPost=/bin/sleep 1 (code=exited, status=0/SUCCESS)
      Process: 3311 ExecStart=/opt/pangolin-common/bin/pangolin-auth-reencrypt -l2 -d (code=exited, status=0/SUCCESS)
      Process: 3310 ExecStartPre=/bin/chmod g+rw /opt/pangolin-auth-reencrypt/pg-sync-data (code=exited, status=0/SUCCESS)
      Process: 3305 ExecStartPre=/bin/chown postgres:kmadmin_pg /opt/pangolin-auth-reencrypt/pg-sync-data (code=exited, status=0/SUCCESS)
      Process: 3303 ExecStartPre=/bin/mkdir -p /opt/pangolin-auth-reencrypt/pg-sync-data (code=exited, status=0/SUCCESS)
      Main PID: 3315 (pg_auth_reencry)
      CGroup: /system.slice/system-pangolin_reencrypt.slice/pangolin_reencrypt@postgres.service
      └─3315 /opt/pangolin-common/bin/pangolin-auth-reencrypt -l2 -d

      Jan 31 11:30:42 srv-0-172 systemd[1]: Starting Runners Pangolin reencrypt service (postgres)...
      Jan 31 11:30:42 srv-0-172 pangolin-auth-reencrypt[3315]: Reencrypt daemon was started for postgres
      Jan 31 11:30:42 srv-0-172 pangolin-auth-reencrypt[3315]: Load configuration /etc/pangolin-auth-encryption/enc_util.cfg ok
      Jan 31 11:30:43 srv-0-172 systemd[1]: Started Runners Pangolin reencrypt service (postgres).
      Jan 31 11:30:47 srv-0-172 pangolin-auth-reencrypt[3315]: Start saving current encrypting params
      Jan 31 11:30:47 srv-0-172 pangolin-auth-reencrypt[3315]: Saving current encrypting params ok

Отключение функциональности

Автоматическая установка

Значение false для параметра auth_encrypt позволит отключить использование решения.

Автоматическое обновление

Отключение решения для стендов с засекреченным хранилищем не предусмотрено.

Ручное отключение

примечание

Действия производятся на ранее установленном стенде с засекреченным хранилищем паролей.

Также необходимо заранее знать пароли пользователей БД, которые находятся в засекреченном хранилище паролей.

Произвести выключение засекреченного хранилища можно следующим образом:

  1. Создайте файл /home/postgres/.pgpass на реплике, назначьте права 0600 и владельца/группу postgres:

    sudo su - postgres
    mkdir /home/postgres/.pgpass
    chown postgres:postgres /home/postgres/.pgpass
    chmod 0600 /home/postgres/.pgpass
    ls -la /home/postgres/.pgpass

    Ожидаемый результат:

    -rw------- 1 postgres postgres 2152 Mar  1 17:40 .pgpass
  2. Добавьте строку подключения в файл /home/postgres/.pgpass для пользователя patroni:

    echo "srv-0-172:5433:*:patroni:TestPassword{passwotd}" > /home/postgres/.pgpass
  3. Получите список серверов расширения pg_profile, если оно используется:

    SELECT pgse_profile.show_servers();

    Ожидаемый результат:

                                show_servers
    ----------------------------------------------------------------------------
    (master,"dbname=First_db host=srv-0-172 port=5433 user=profile_tuz",t,)
    (replica,"dbname=First_db host=srv-0-182 port=5433 user=profile_tuz",t,)
    (2 rows)
  4. Скорректируйте строки подключения/добавьте параметр password ко всем существующим серверам, полученным на предыдущем шаге, в расширении pg_profile, если используется:

    sudo su - postgres
    psql
    SELECT pgse_profile.set_server_connstr('master', 'dbname=First_db host=srv-0-172 user port=5433 user=profile_tuz password=password');
    SELECT pgse_profile.set_server_connstr('replica', 'dbname=First_db host=srv-0-182 user port=5433 user=profile_tuz password=password');

    Ожидаемый результат:

     set_server_connstr
    --------------------
    1
    (1 row)
  5. Скорректируйте конфигурационный файл Pangolin Manager, добавив следующие параметры: postgresql.pgpass: /home/postgres/.pgpass, postgresql.authentication.replication.password: '<password>', postgresql.authentication.superuser.password: '<password>' на обоих узлах.

  6. Остановите службу перекодирования на обоих узлах:

    sudo su
    systemctl stop pangolin_reencrypt@postgres.service
    systemctl status pangolin_reencrypt@postgres.service

    Ожидаемый результат:

    ● pangolin_reencrypt@postgres.service - Runners Pangolin reencrypt service (postgres)
    Loaded: loaded (/usr/lib/systemd/system/pangolin_reencrypt@.service; disabled; vendor preset: disabled)
    Active: inactive (dead)

    Feb 06 12:51:21 srv-1-7 systemd[1]: [/usr/lib/systemd/system/pangolin_reencrypt@.service:19] Unknown lvalue 'TimeoutStopFailureMode' in section 'Service'
    Feb 06 16:22:28 srv-1-7 systemd[1]: [/usr/lib/systemd/system/pangolin_reencrypt@.service:19] Unknown lvalue 'TimeoutStopFailureMode' in section 'Service'
  7. Удалите все записи из засекреченного хранилища паролей на обоих узлах:

    sudo su - postgres
    pg_auth_config reset
    pg_auth_config show

    Ожидаемый результат:

    Cannot load auth config (file is not found)
  8. Перечитайте конфигурацию и перезапустите сервер на лидере:

    sudo su - postgres
    reload

    Ожидаемый результат:

    + Cluster: clustername (7205282150766022368) ------+--------------+---------+----+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +----------------------+---------------------------+--------------+---------+----+-----------+
    | srv-0-172 | srv-0-172:5433 | Leader | running | 2 | |
    | srv-0-182 | srv-0-182:5433 | Sync Standby | running | 2 | 0 |
    +----------------------+---------------------------+--------------+---------+----+-----------+
    Are you sure you want to reload members srv-0-182, srv-0-172? [y/N]: y
    Reload request received for member srv-0-182 and will be processed within 10 seconds
    Reload request received for member srv-0-172 and will be processed within 10 seconds
    sudo su - postgres
    restart --force

    Ожидаемый результат:

    + Cluster: clustername (7205282150766022368) ------+--------------+---------+----+-----------+
    | Member | Host | Role | State | TL | Lag in MB |
    +----------------------+---------------------------+--------------+---------+----+-----------+
    | srv-0-172 | srv-0-172:5433 | Leader | running | 2 | |
    | srv-0-182 | srv-0-182:5433 | Sync Standby | running | 2 | 0 |
    +----------------------+---------------------------+--------------+---------+----+-----------|
    Success: restart on member srv-0-172
    Success: restart on member srv-0-182

Получение хеш-сумм паролей для заполнения пользовательского конфигурационного файла Pangolin

Утилита pangolin_password_hash расчета хеш-суммы в формате ядра PostgreSQL предназначена для вычисления хеш-суммы переданной в нее текстовой строки. Она применяется для получения хеш-сумм в сценариях автоматизации, таких как заполнение пользовательского конфигурационного файла инсталлятора, содержащего имена учетных записей и их пароли, включая хеш-суммы форматов scram-sha-256 и md5. Это обеспечивает предотвращение записи паролей в открытом виде в логи СУБД при создании пользователей.

Установка

Утилита pangolin_password_hash поставляется в виде rpm/deb-пакета и работает на любой платформе, где есть Python.

Утилита расположена в директории utilities/ дистрибутива продукта и не попадает в финальную инсталляцию кластера при автоматизированном развертывании. Для использования утилиты необходимо установить поставляемый rpm/deb-пакет вручную:

sudo dnf install pangolin-password-hash-{product_version}-{OS}.x86_64.rpm
Подсказка

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

sudo dnf -y install ~/distributive/utilities/pangolin-password-hash-1.1.0-sberlinux9.x86_64.rpm

Управление

Утилита принимает на вход следующие параметры (в случае, если параметр не задан, используется значение по умолчанию):

  • -h, --help - выводит справку по использованию утилиты;
  • -t TYPE, --type TYPE - тип вычисляемого хеша. Возможные варианты: scram-sha-256, md5, linux-sha-512 (значение по умолчанию - scram-sha-256);
  • -P PASSWORD, --password PASSWORD - параметр password (пароль, для которого вычисляется хеш-сумма). Если не задан, утилита запросит интерактивно;
  • -U USERNAME, --username USERNAME - параметр username (необходим для вычисления хеша md5 или sha-512). Если не задан и необходим (тип вычисляемого хеша md5 или sha-512), утилита запросит интерактивно.

Примеры использования утилиты pangolin_password_hash

  • Вычисление хеша scram-sha-256 (пароль можно как передать параметром, так и ввести в ответ на запрос утилиты):

    $ python3 pangolin_password_hash.py -t scram-sha-256 -P password
    SCRAM-SHA-256$4096:{hash}
    $ python3 pangolin_password_hash.py -t scram-sha-256
    Password:
    SCRAM-SHA-256$4096:{hash}
  • Вычисление хеша md5 (пароль можно как передать параметром, так и ввести в ответ на запрос утилиты, для расчета md5 в СУБД также используется имя пользователя):

    $ python3 pangolin_password_hash.py -t md5 -P password -U user
    {hash}
    $ python3 pangolin_password_hash.py -t md5
    Password:
    Username:
    {hash}
    $ python3 pangolin_password_hash.py -t md5 -P 'password' -U 'user'
    {hash}
  • Вычисление хеша sha-512 (для заведения пользователей Linux пароль можно как передать параметром, так и ввести в ответ на запрос утилиты):

    $ python3 pangolin_password_hash.py -t linux-sha-512 -P password -U postgres
    postgres:{hash}
    $ python3 pangolin_password_hash.py -t linux-sha-512
    Password:
    Username:
    postgres:{hash}
    $ python3 pangolin_password_hash.py -t linux-sha-512 -P 'password' -U 'postgres'
    postgres:{hash}

В случае использования в пароле специальных символов их можно экранировать символом \. В случае, если необходимо передать сам символ \, он экранируется аналогично \\. При вводе пароля по запросу утилиты символы передаются как символы и в маскировании не нуждаются. Пример (на примере md5, поскольку данный метод будет давать всегда одинаковую хеш-сумму):

# qwerty'
# admin
$ python3 pangolin_password_hash.py -t md5
Password:
Username:
{hash}
# При передаче пароля параметром любой символ можно экранировать обратным слэшем
$ python3 pangolin_password_hash.py -t md5 -U admin -P qwerty\'
{hash}
$ python3 pangolin_password_hash.py -t md5 -U admin -P \q\w\e\r\t\y\'
{hash}
# Обратный слэш тоже можно экранировать
$ python3 pangolin_password_hash.py -t md5 -U admin -P \\qwerty\'
{hash}

Утилита перекодирования параметров подключения к БД (pangolin-auth-reencrypt)

Утилита pangolin-auth-reencrypt предназначена для повторного перекодирования параметров подключения к БД и других засекреченных данных, если изменились характеристики хоста, от которых зависит ключ, используемый для кодирования.

Начиная с версии 4.4.0 в СУБД Pangolin поддерживается хранение паролей в конфигурационных файлах в засекреченном виде, а также использование засекреченного хранилища параметров подключения для внутренних компонентов системы. Ключ, используемый для засекречивания, вычисляется на основе характеристик оборудования и сетевых интерфейсов хоста. Такой ключ уникален в пределах конкретного сервера, не хранится на диске и не переносится на другой узел.

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

Для решения этой задачи используется утилита pangolin-auth-reencrypt, расположенная по пути /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt. Начиная с версии 5.2.1 утилита может работать как Linux-демон: после запуска она не завершает работу, а периодически проверяет характеристики хоста и при необходимости автоматически перекодирует указанные в конфигурации файлы.

Внимание!

Создание резервных копий файлов утилиты в системе резервирования копий (СРК) требует обновления спецификации СРК. Обновление спецификации СРК возможно для новых установок. В процессе обновления стенда спецификации СРК не обновляются.

Принцип работы

Скрипты автоматизации создают одну или несколько новых служб systemd (зависит от конфигурации кластера) для запуска и отслеживания состояния демона утилиты.

В автоматическом режиме утилита в процессе работы создает файл enc_params.cfg + '.' + 'имя_пользователя' в каталоге /etc/pangolin-auth-reencrypt/<uname>. Файл создается с правами доступа -rw------- и от имени владельца, под которым был запущен демон. Содержимое файла засекречено. Утилита используется для хранения текущих параметров сервера. Изменение параметров сервера детектируется на основе данного файла.

Службы systemd запускают демонов утилиты перекодирования при старте ОС, которые периодически (с периодом 5 секунд) проверяют параметры сервера и, если они поменялись, обновляют файлы с засекреченной информацией. В зависимости от конфигурации на диске шифруются файлы, принадлежащие Администраторам СУБД (postgres) и Администраторам безопасности (kmadmin_pg). Демон утилиты перешифрования должен быть запущен от имени каждого владельца шифрованных файлов.

Список файлов для разных пользователей определяется конфигурацией утилиты (тег owner, смотрите ниже «Конфигурационный файл утилиты»).

Для управления демоном утилиты служба создает каталог pangolin-auth-reencrypt, где демон создает файл pangolin-auth-reencrypt-<uname>, содержащий идентификатор процесса pid. Примеры путей, где может находиться каталог pangolin-auth-reencrypt:

  • для системных unit-файлов:

    /var/run/pangolin-auth-reencrypt/postgres.pid
  • для пользовательских unit-файлов:

    /var/run/user/%U/pangolin-auth-reencrypt/postgres.pid

    Где %U — идентификатор пользователя.

По наличию и дате модификации файла <username>.done Pangolin Manager и сервер БД определяют, что проверка характеристик хоста и, при необходимости, перекодирование завершены, и можно продолжать запуск.

Установка утилиты pangolin-auth-reencrypt

примечание

При установке СУБД Pangolin с помощью скриптов автоматизации утилита pangolin-auth-reencrypt устанавливается автоматически.

Установите rpm/deb-пакет компонента pangolin-auth-reencrypt из поставляемого дистрибутива в каталоге utilities/:

sudo dnf install pangolin-auth-reencrypt-{product_version}-{OS}.x86_64.rpm

Пример команды:

sudo dnf install -y ./pangolin-auth-reencrypt-8.2.0-sberlinux9.x86_64.rpm

Конфигурирование утилиты

После установки rpm/deb-пакета актуализируйте конфигурационный файл enc_util.cfg согласно шаблону ниже. Файл enc_util.cfg находится по пути /etc/pangolin-auth-reencrypt/.

При использовании системных unit-файлов:

  1. Актуализируйте unit-файл с запуском демона pangolin-auth-reencrypt в systemd (смотрите ниже «Шаблон системного unit-файла для утилиты перекодирования»):

    • имя службы pangolin-auth-reencrypt@<uname>.service;
    • служба запускается от пользователя, переданного с помощью параметра (пример: pangolin-auth-reencrypt@postgres.service);
    • служба должна создавать каталог /var/run/pangolin-auth-reencrypt для pid файла(ов). Владелец postgres или kmadmin_pg, группа pangolin_users, права 770;
    • служба должна запускать утилиту перекодирования паролей /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt;
    • служба должна автоматически запускаться при каждой загрузке Linux и в случае сбоев (Restart=on-failure).
  2. Обновите конфигурацию служб:

    sudo systemctl daemon-reload
  3. Запустите и включите службу на автозапуск:

    sudo systemctl enable --now pangolin-auth-reencrypt@<имя_пользователя>.service

При использовании пользовательских unit-файлов (например, от имени postgres):

  1. Создайте файл pangolin-auth-reencrypt.service в директории (смотрите ниже «Шаблон пользовательского unit-файла для утилиты перекодирования»):

    /home/postgres/.config/systemd/user/
  2. Под пользователем, обладающим правами root, выполните команду loginctl enable-linger для всех пользователей, от имени которых предполагается запуск пользовательских служб:

    sudo loginctl enable-linger postgres
    sudo loginctl enable-linger kmadmin_pg
  3. Добавьте в файл ~/.bash_profile для соответствующих пользователей следующие переменные окружения:

    export XDG_RUNTIME_DIR=/run/user/$(id -u)
    export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
  4. Обновите конфигурацию пользовательских служб:

    systemctl --user daemon-reload
  5. Запустите службу и включите автозапуск:

    systemctl --user enable --now pangolin-auth-reencrypt
примечание

Если при запуске возникает ошибка загрузки плагина засекречивания («Load encryption plugin failed»), укажите явно путь к /opt/pangolin-dbms-server/lib или /opt/pangolin-manager/lib в случае отсутствуя СУБД (к примеру узел арбитра), установив переменную окружения PG_PLUGINS_PATH перед запуском, например:

  • для системных unit-файлов:

    PG_PLUGINS_PATH=/opt/pangolin-dbms-server/lib /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l3 -d -L /opt/pangolin-auth-reencrypt/log -n test.log -p /var/run/pangolin-auth-reencrypt/postgres.pid
  • для пользовательских unit-файлов:

    PG_PLUGINS_PATH=/opt/pangolin-dbms-server/lib /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l3 -d -L /opt/pangolin-auth-reencrypt/log -n test.log -p /var/run/user/%U/pangolin-auth-reencrypt/postgres.pid

    Где %U — идентификатор пользователя.

Настройка синхронизации со стартом БД

Синхронизация запуска утилиты pangolin-auth-reencrypt и сервера базы данных нужна для того, чтобы сервер БД не начинал запуск до тех пор, пока утилита не завершит проверку характеристик хоста и, при необходимости, перекодирование файлов.

Сервер базы данных и связанные с ним компоненты Pangolin при запуске используют сохраненные параметры подключения, пароли и другие засекреченные данные. Эти данные были перекодированы с использованием ключа, вычисленного из характеристик текущего хоста.

Если характеристики хоста изменились, ранее засекреченные данные могут перестать рассекречиваться. До тех пор пока утилита pangolin-auth-reencrypt не завершит проверку характеристик и, при необходимости, перекодирование, запуск БД и связанных сервисов может происходить с невалидными параметрами. Это способно привести к ошибкам чтения конфигурации, ошибкам аутентификации внутренних компонентов и сбоям запуска сервисов.

Поэтому, при включенной синхронизации, сервер БД до начала полноценного запуска ожидает появления новых файлов <username>.done, чтобы дата их создания была после времени загрузки ОС (при этом используется /proc/uptime – доступ к нему является требованием). Также проверки этих файлов осуществляет Pangolin Manager и не стартует БД в течение тайм-аута. Только после этого приходит подтверждение, что утилита успешно завершила обработку.

Механизм синхронизации настраивается с двух сторон:

  • на стороне утилиты pangolin-auth-reencrypt;
  • на стороне сервера базы данных.

Синхронизация считается включенной только в том случае, если настройки выполнены на обеих сторонах.

Настройка на стороне утилиты

Чтобы утилита создавала файлы готовности, она должна быть запущена с параметрами:

--done-dir=/opt/pangolin-auth-reencrypt/pg-sync-data

Параметры указываются в системном unit-файле systemd (pangolin-auth-reencrypt.service) в соответствии с шаблоном.

После успешной обработки в каталоге /opt/pangolin-auth-reencrypt/pg-sync-data/ создаются файлы postgres.done и kmadmin_pg.done.

Файл postgres.done создается в стандартной конфигурации. Файл kmadmin_pg.done дополнительно создается, если перекодирование выполняется также для файлов пользователя kmadmin_pg.

Пример запуска демона с включенной синхронизацией:

/opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt \
-l2 -d \
-p /var/run/pangolin-auth-reencrypt/pangolin-auth-reencrypt-postgres.pid \
-L /pgerrorlogs/08/pangolin-auth-reencrypt \
-n pangolin-auth-reencrypt-postgres-%Y-%m-%d_%H%M%S.log \
--done-dir=/opt/pangolin-auth-reencrypt/pg-sync-data
Внимание!

Каталог /opt/pangolin-auth-reencrypt/pg-sync-data необходимо создать с правами для пользователей под которыми работают демоны утилиты перешифрования (postgres и kmadmin_pg). Также можно использовать другой подходящий каталог.

Настройка на стороне сервера базы данных

Чтобы сервер БД ожидал завершения перекодирования, необходимо указать:

  • reencrypt.monitored_files – список файлов <username>.done, за которыми должен следить сервер;

  • reencrypt.wait_timeout – время ожидания появления файлов <username>.done в секундах. По истечении этого времени выполняется старт сервера БД, независимо от успешности проверки перекодирования.

    Если требуется неограниченное ожидание, установите:

    reencrypt.wait_timeout = -1

Для одиночных экземпляров настройка выполняется в файле postgresql.conf:

reencrypt.monitored_files = '/opt/pangolin-auth-reencrypt/pg-sync-data/postgres.done,/opt/pangolin-auth-reencrypt/pg-sync-data/kmadmin_pg.done'
reencrypt.wait_timeout = 30

Если в конфигурации используется только пользователь postgres, достаточно указать один файл:

reencrypt.monitored_files = '/opt/pangolin-auth-reencrypt/pg-sync-data/postgres.done'
reencrypt.wait_timeout = 30

Для узлов master и replica в файле postgres.yml:

postgresql:
parameters:
reencrypt.monitored_files: '/opt/pangolin-auth-reencrypt/pg-sync-data/postgres.done,/opt/pangolin-auth-reencrypt/pg-sync-data/kmadmin_pg.done'
reencrypt.wait_timeout: 30

Для узла arbiter в разделе pangolin_dcs файла postgres.yml:

pangolin_dcs:
reencrypt.monitored_files: '/opt/pangolin-auth-reencrypt/pg-sync-data/postgres.done,/opt/pangolin-auth-reencrypt/pg-sync-data/kmadmin_pg.done'
reencrypt.wait_timeout: 30
Включение и отключение синхронизации
Внимание!

Необходимо обеспечить права на чтение на файл /proc/uptime для пользователя, под которым запускается служба сервера базы данных.

Синхронизация на стороне утилиты pangolin-auth-reencrypt включается, если при запуске указан параметр --done-dir. Если параметр --done-dir не указан, синхронизация на стороне утилиты отключена.

Синхронизация на стороне сервера базы данных включается, если задан параметр reencrypt.monitored_files. Если параметр reencrypt.monitored_files не задан, синхронизация на стороне сервера базы данных отключена.

Параметр reencrypt.wait_timeout не включает синхронизацию сам по себе, а только задает время ожидания файлов готовности <username>.done.

Синхронизация запуска утилиты pangolin-auth-reencrypt и сервера базы данных считается включенной только в том случае, если она настроена и на стороне утилиты, и на стороне сервера базы данных.

В кластерной конфигурации в механизме синхронизации старта участвует также pangolin-manager. При запуске базы данных pangolin-manager проверяет наличие и временные метки файлов <username>.done, а также ожидает истечения интервала, заданного параметром reencrypt.wait_timeout.

Если по истечении времени ожидания база данных не запускается, это означает, что запуск не был выполнен со стороны pangolin-manager. В этом случае для определения причины необходимо анализировать журнал pangolin-manager.

Назначение привилегий на <username>.done файлы

Чтобы <username>.done файлы имели отличные от заданных по умолчанию привилегии, при запуске службы pangolin-auth-reencrypt укажите параметр --done-privileges=<file_mode_mask:owner:group>.

Пример запуска:

/opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l2 -d -p /var/run/user/984/pangolin-auth-reencrypt/pangolin-auth-reencrypt-postgres.pid -L /pgerrorlogs/08/pangolin-auth-reencrypt -n pangolin-auth-reencrypt-postgres-%Y-%m-%d_%H%M%S.log --done-dir=/opt/pangolin-auth-reencrypt/pg-sync-data --done-privileges=666:postgres:postgres

Привилегии на файлы задаются строго через знак : (двоеточие). Также возможно частичное задание отдельных привилегий:

  • Настройка только маски прав доступа:

     /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l2 -d -p /var/run/user/984/pangolin-auth-reencrypt/pangolin-auth-reencrypt-postgres.pid -L /pgerrorlogs/08/pangolin-auth-reencrypt -n pangolin-auth-reencrypt-postgres-%Y-%m-%d_%H%M%S.log --done-dir=/opt/pangolin-auth-reencrypt/pg-sync-data --done-privileges=600
  • Настройка маски прав доступа и владельца:

    /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l2 -d -p /var/run/user/984/pangolin-auth-reencrypt/pangolin-auth-reencrypt-postgres.pid -L /pgerrorlogs/08/pangolin-auth-reencrypt -n pangolin-auth-reencrypt-postgres-%Y-%m-%d_%H%M%S.log --done-dir=/opt/pangolin-auth-reencrypt/pg-sync-data --done-privileges=755:postgres
  • Настройка владельца и группы:

    /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l2 -d -p /var/run/user/984/pangolin-auth-reencrypt/pangolin-auth-reencrypt-postgres.pid -L /pgerrorlogs/08/pangolin-auth-reencrypt -n pangolin-auth-reencrypt-postgres-%Y-%m-%d_%H%M%S.log --done-dir=/opt/pangolin-auth-reencrypt/pg-sync-data --done-privileges=:postgres:pangolin_users
примечание

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

Если какая-то из привилегий не указана, то ее значение выставляется равным значению по умолчанию.

Значения по умолчанию:

  • file_mode_mask = 0644;
  • owner = <file_creator>;
  • group = <file_creator>.

Если не удалось изменить владельца или группу файла из-за отсутствия прав или по какой-либо другой причине, то на файл назначаются следующие привилегии:

  • file_mode_mask = 0660;
  • owner = <file_creator>;
  • group = <file_creator_primary_group>.

Это сделано для того, чтобы только создатель и только участники основной группы создателя файла могли видеть, изменять, удалять файл.

примечание

Привилегии так же можно назначить через параметр --log-chmod. Пример:

--log-chmod=0644 -P /var/tmp -O 0640:postgres:pangolin_users

Синтаксис запуска утилиты

Запуск утилиты осуществляется с указанием полного пути:

/opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt [OPTION]

Чтобы вызывать утилиту без полного пути, добавьте каталог /opt/pangolin-auth-reencrypt/bin/ в переменную окружения $PATH:

  • Временное добавление (на время текущей сессии):

    export PATH="/opt/pangolin-auth-reencrypt/bin:$PATH"
  • Постоянное добавление (для всех новых сессий):

    Добавьте строку в конец файла ~/.bashrc (для bash) или ~/.zshrc (для zsh):

    export PATH="/opt/pangolin-auth-reencrypt/bin:$PATH"

    Затем примените изменения:

    source ~/.bashrc

После этого вызов утилиты выглядит так:

pangolin-auth-reencrypt [OPTION]

Параметры запуска утилиты

Для утилиты pangolin-auth-reencrypt существуют следующие опциональные параметры запуска:

-c --conf=CONFIG_FILE

Задает файл конфигурации утилиты, который требуется проверить на наличие ошибок. Утилита проверит файл на наличие ошибок и завершит работу с кодом 0, если конфигурация не содержит ошибок, и 1, если указанный файл невалиден.

Параметр может быть комбинирован с параметром -l, при этом будет выведено диагностическое сообщение о результате проверки конфигурации.

Если задан параметр -c, то параметры -f -r -s будут проигнорированы. Рекомендуется проверить конфигурационный файл на наличие ошибок в процессе обновления файла /etc/pangolin-auth-reencrypt/enc_util.cfg, который используется утилитой при перекодировании (смотрите «Конфигурационный файл»).

-l, --log[=LOG_LEVEL]

Задает уровень логирования: 1 — только ошибки, 2 — выполнение команд (по умолчанию), 3 — полный лог. Совместим со всеми остальными параметрами.

-L, --log-dir=LOG_DIR_PATH

Задает каталог, в котором будут храниться файлы логов. Совместим со всеми параметрами.

примечание

Ключ работает только в сочетании с ключом -l. Если каталог не существует, он будет создан. Логирование будет производиться в файл. Поддерживает ротацию логов.

--log-dir-chmod=LOG_DIR_PATH

Права доступа (chmod) для каталога логов. Значение по умолчанию — 0750.

--log-chmod=LOG_CHMOD

Права доступа (chmod) для лог-файлов. Значение по умолчанию — 0600.

-m --max-log-files=COUNT

Ограничивает количество хранимых логов. Совместим со всеми параметрами.

примечание

Если значение равно нулю, отключает автоматическое удаление логов.

Значение по умолчанию — 100.

-n --log-name=LOG_NAME

Задает шаблон имени файла лога. Совместим со всеми параметрами.

примечание

Значение по умолчанию — pangolin-auth-reencrypt-%Y-%m-%d_%H-%M-%S.

Ключ работает только в сочетании с ключом - L.

-z --max-log-size=SIZE

Устанавливает максимальный размер лог-файла в килобайтах перед его ротацией. Совместим со всеми параметрами.

примечание

Значение по умолчанию — 100МБ.

Минимальное допустимое значение: 50 КБ, при значении менее 50 КБ запуск утилиты завершится ошибкой.

Реальный размер файла может быть немного больше заданного, так как утилита проверяет размер файла каждые 200 строк и датирует после того, как файл превысит заданное.

-f --force

Запускает утилиту в режиме игнорирования ошибок. Совместим со всеми параметрами.

Если указан параметр -c, параметр -f учитываться не будет.

-r, --roll[=ENCRYPTED_FILE]

Запускает утилиту в режиме отката операции перекодирования. Может задавать файл, для которого требуется применить процесс отката. Если файл не задан, то процесс отката перекодирования применяется ко всем файлам, указанным в конфигурации утилиты. Совместим со всеми параметрами.

Если указан параметр -c, параметр -r учитываться не будет.

-s, --stable

Запрещает обновление/создание файла с параметрами сервера, учитывается только в режиме перекодирования. Используется при запуске утилиты для файлов с засекреченной информацией, принадлежащих разным пользователям.

примечание

Параметр -s, --stable необходимо указывать при первых запусках утилиты. Порядок вызовов утилиты имеет значение, поскольку при последнем вызове (без параметра -s) будет создан файл с параметрами сервера, принадлежащий пользователю на момент вызова.

-e, --enc=ENCRYPTED_FILE

Задает отдельный файл для перекодирования, который должен быть описан в конфигурации утилиты. Если этот параметр задан — перекодирование осуществляется только для данного файла, остальные файлы из конфигурации не перекодируются.

-d, --daemon

Запускает утилиту в виде службы Linux (демона) для непрерывного отслеживания изменений параметров сервера (проверка изменения происходит с периодом 5 секунд).

-p, --pid-file=PID_FILE

Указывает путь к PID-файлу, отличный от значения по умолчанию.

примечание

Если файл не существует, он будет создан.

Флаг работает только совместно с параметром -d/—daemon, при отсутствии ключа -d/—daemon утилита не запускается.

-P, --done-dir=DONE_DIR_PATH

Указывает путь к каталогу, в котором будут храниться файлы <username>.done.

-O, --done-privileges=PRIVILEGES

Задает параметры для команд chmod и chown, применяемые к файлам <username>.done. Формат: <mode>:<owner>:<group>, где <mode> применяется командой chmod, а <owner>:<group> — командой chown. Значение по умолчанию — 0644:<file_creator>:<file_creator>, где <file_creator> — пользователь ОС, от имени которого создается файл.

-V, --version

Показывает версию продукта и утилиты.

-?, --help

Выводит справочную информацию по параметрам запуска, затем завершается.

к сведению

Параметр -O используется только при указании параметра -P.

Ключи -d, -c (проверка конфигурации), -e (перекодирование отдельного файла), -r (откат операции перекодирования) несовместимы: если используются два и более ключа, то утилита не запускается.

Запуск утилиты pangolin-auth-reencrypt с опцией --help отображает параметры запуска:

$ /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt --help

/opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt reencrypts files by generated key.

Usage:
/opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt [OPTION]...

Options:
-l, --log[=LOG_LEVEL] switch on log [1-show only errors; 2-show execution log; 3-show debug/full log (default)]
-L, --log-dir=LOG_DIR_PATH specify the path to the directory where logs will be stored
--log-dir-chmod=LOG_DIR_PATH parameters for chmod for dir logs default 0750
-n, --log-name=LOG_NAME specify the template log file name, maximum 63 symbols, default pangolin-auth-reencrypt-%Y-%m-%d_%H-%M-%S
--log-chmod=LOG_CHMOD parameters for chmod for file logs default 0600
-m, --max-log-files=COUNT limit the number of log files to keep (0 for unlimited)
-z, --max-log-size=SIZE maximum size of a log file in kilobytes before it gets rotated
-f, --force switch on force mode (skip errors)
-s, --stable do not update encrypting parameters (/etc/pangolin-auth-reencrypt/postgres/enc_params.cfg.postgres)
-d, --daemon start reencryption daemon
-c, --conf=CONFIG_FILE check configuration file, then exit
-e, --enc=ENCRYPTED_FILE reencrypt one file
-p, --pid-file=PID_FILE create pid file at a specific path (used only in daemon mode, default path /var/run/pangolin-auth-reencrypt/postgres/pangolin-auth-reencrypt<uname>. pid)
-r, --roll[=ENCRYPTED_FILE] rollback encryption
-P, --done-dir=DONE_DIR_PATH specify the path to the directory where done files will be stored
-O, --done-privileges=PRIVILEGES parameters for chmod and chown for done files, default "0644:<file_creator>:<file_creator>",
used only together with -P (--done-dir) parameter
-V, --version output version information, then exit
-?, --help show this help, then exit

Конфигурационный файл утилиты

При установке утилиты создается конфигурационный файл enc_util.cfg с правами -r--r----- и владельцем postgres:pangolin_users, который расположен в каталоге /etc/pangolin-auth-reencrypt.

Конфигурационный файл хранится в формате JSON. Файлы с засекреченными параметрами подключения к БД задаются ключом files.

Для каждого файла указывается:

  • имя, через ключ name. Если указано неполное имя файла, то поиск файла происходит в каталоге, определенном через переменную окружения PGDATA;

  • владелец файла, через ключ owner. Утилита проверяет пользователя, который ее запустил: если в конфигурации утилиты для файла указан другой владелец, то утилита пропускает этот файл;

  • домен кодирования, через ключ domain. В случае, если файл засекречивается полностью, то кроме имени и владельца требуется указать домен через ключ domain, для которого производится засекречивание. Когда требуется засекретить отдельные пароли в файлах, то с помощью ключа secrets указывается массив с описанием метода поиска пароля в файле. Метод поиска задается с помощью ключей:

    • type — указывает тип поиска;

    • name — указывает идентификатор пароля.

      примечание

      Если в type установлено значение «tag» — файл разбирается по формату yml. Поиск пароля происходит по тегам, указанным в поле name в порядке записи (теги разделены символом '/').

      Если в type установлено значение «text», то поиск пароля в файле происходит по строке name=<password>.

Для файла или отдельного пароля в файле можно указать логический признак опциональности через ключ opt. Если признак задан и равен true, то отсутствие файла на диске или отсутствие пароля внутри файла не приводит к ошибкам в работе утилиты. Если признак не задан или задан и равен false, то отсутствие файла или отсутствие пароля внутри файла приведет к ошибкам в работе утилиты, при условии, что утилита запущена без параметра -f (смотрите «Параметры запуска утилиты»).

Шаблон конфигурации утилиты перекодирования

{
"files": [
// файл 1: включается, если на кластере активирован tde или admin_protection
{
"name": "{{ KMS_CONFIG }}",
"owner": "kmadmin_pg",
"domain": "kms"
},

// файл 2: включается, если на кластере активирован tde или admin_protection
{
"name": "{{ KMS_CERT_CONFIG }}",
"owner": "kmadmin_pg",
"domain": "kms"
},

// файл 3: включается, если включено засекречивание соединений
{
"name": "{{ SERVER_P12_CONFIG }}",
"owner": "postgres",
"secrets": [
{
"type": "json",
"name": "passphrase",
"domain": "postgres"
}
]
},

// файл 4: включается, если используется PgBouncer с засекречиванием
{
"name": "{{ PGBOUNCER_P12_CONFIG }}",
"owner": "postgres",
"secrets": [
{
"type": "json",
"name": "passphrase",
"domain": "postgres"
}
]
},

// файл 5: включается, если используется Patroni с засекречиванием
{
"name": "{{ PATRONI_P12_CONFIG }}",
"owner": "postgres",
"secrets": [
{
"type": "json",
"name": "passphrase",
"domain": "postgres"
}
]
},

// файл 6: включается на всех конфигурациях
{
"name": "{{ pg_encrypt_cfg }}",
"owner": "postgres",
"domain": "postgres"
},

// файл 7: включается для конфигураций с Pangolin Manager
{
"name": "/etc/pangolin-manager/postgres.yml",
"owner": "postgres",
"secrets": [
{
"type": "tag",
"name": "restapi/authentication/password",
"domain": "postgres"
},
{
"type": "tag",
"name": "etcd/password",
"domain": "postgres"
},
{
"type": "text",
"name": "ldapbindpasswd",
"domain": "postgres"
}
]
},

// файл 8: включается для конфигураций standalone
{
"name": "pg_hba.conf",
"owner": "postgres",
"secrets": [
{
"type": "text",
"name": "ldapbindpasswd",
"domain": "postgres"
}
]
},

// файл 9: включается, если используется экспорт дампов с tde (ключ для рассекречивания дампа)
{
"name": "{{ SECRET_DUMP_KEY }}",
"owner": "kmadmin_pg",
"domain": "postgres"
}
]
}
Примечание

// — начало комментариев, которые необходимо удалить перед записью конфигурации на диск. Если условие в комментарии не выполняется, то вместе с комментарием нужно удалить описание файла, следующее за ним.

Пример конфигурационного файла

Пример конфигурационного файла утилиты:

{
"files" :
[
{
"name" : "/etc/pangolin-security-utilities/enc_connection_settings.cfg",
"owner" : "kmadmin_pg",
"opt" : true,
"domain" : "kms"
},
{
"name" : "/etc/pangolin-security-utilities/enc_connection_settings_cert.cfg",
"owner" : "kmadmin_pg",
"opt" : true,
"domain" : "kms"
},
{
"name" : "/pg_ssl/intermediate/server.p12.cfg",
"owner" : "postgres",
"opt" : true,
"secrets" :
[
{
"type" : "json",
"name" : "passphrase",
"domain" : "postgres",
"opt" : true
}
]
},
{
"name" : "/pg_ssl/intermediate/pgbouncer_server.p12.cfg",
"owner" : "postgres",
"opt" : true,
"secrets" :
[
{
"type" : "json",
"name" : "passphrase",
"domain" : "postgres",
"opt" : true
}
]
},
{
"name" : "/pg_ssl/intermediate/patroni_server.p12.cfg",
"owner" : "postgres",
"opt" : true,
"secrets" :
[
{
"type" : "json",
"name" : "passphrase",
"domain" : "postgres",
"opt" : true
}
]
},
{
"name" : "/etc/pangolin-auth-encryption/enc_utils_auth_settings.cfg",
"owner" : "postgres",
"opt" : true,
"domain" : "postgres"
},
{
"name" : "/etc/pangolin-manager/postgres.yml",
"owner" : "postgres",
"opt" : true,
"secrets" :
[
{
"type" : "tag",
"name" : "restapi/authentication/password",
"domain" : "postgres",
"opt" : true
},
{
"type" : "tag",
"name" : "etcd/password",
"domain" : "postgres",
"opt" : true
},
{
"type" : "text",
"name" : "ldapbindpasswd",
"domain" : "postgres",
"opt" : true
}
]
},
{
"name" : "pg_hba.conf",
"owner" : "postgres",
"opt" : true,
"secrets" :
[
{
"type" : "text",
"name" : "ldapbindpasswd",
"domain" : "postgres",
"opt" : true
}
]
},
{
"name" : "/etc/pangolin-security-utilities/secret_dump_key.bin",
"owner" : "kmadmin_pg",
"opt" : true,
"domain" : "postgres"
}
]
}

Шаблон системного unit-файла systemd для утилиты перекодирования

примечание

При запуске на узле арбитра укажите путь PG_PLUGINS_PATH=/opt/pangolin-manager/lib.

[Unit]
Description=Runners Pangolin reencrypt service (%i)
After=syslog.target network.target network-online.target

[Service]
Type=forking
User=%i
Group=%i

Environment="PG_LICENSE_PATH=/opt/pangolin-license"
Environment="PGDATA=<path>/data"
Environment="PG_PLUGINS_PATH=/opt/pangolin-dbms-server/lib"
PermissionsStartOnly=true

ExecStartPre=/bin/mkdir -p /var/run/pangolin-auth-reencrypt
ExecStartPre=/bin/chown -R postgres:pangolin_users /var/run/pangolin-auth-reencrypt
ExecStartPre=/bin/chmod -R 770 /var/run/pangolin-auth-reencrypt

ExecStartPost=/bin/sleep 1

TimeoutSec=5
ExecStart=/opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l2 -d -p /var/run/pangolin-auth-reencrypt/pangolin-auth-reencrypt-%i.pid -L /pgerrorlogs/0<base_version>/pangolin-auth-reencrypt -n pangolin-auth-reencrypt-%i-%%Y-%%m-%%d_%%H%%M%%S.log

PIDFile=/var/run/pangolin-auth-reencrypt/pangolin-auth-reencrypt-%i.pid
Restart=on-failure

[Install]
WantedBy=multi-user.target
Примечание

Параметры для заполнения:

  • <path> — домашняя директория Pangolin;
  • %i — имя пользователя;
  • <base_version> базовая версия Pangolin (текущая: 8).

Шаблон пользовательского unit-файла systemd для утилиты перекодирования

Примечание

При запуске на узле арбитра укажите путьPG_PLUGINS_PATH=/opt/pangolin-manager/lib.

[Unit]
Description=Runners Pangolin reencrypt service (%i)
After=syslog.target network.target network-online.target

[Service]
Type=forking

# Подстановка общих переменных
Environment="PG_LICENSE_PATH=/opt/pangolin-license"
Environment="PGDATA=/pgdata/data/data"
Environment="PG_PLUGINS_PATH=/opt/pangolin-dbms-server/lib"
PermissionsStartOnly=true

ExecStartPre=/bin/mkdir -p /var/run/user/%U/pangolin-auth-reencrypt
ExecStartPre=/bin/chown %i:%i /var/run/user/%U/pangolin-auth-reencrypt
ExecStartPre=/bin/chmod 770 /var/run/user/%U/pangolin-auth-reencrypt
ExecStartPost=/bin/sleep 1

TimeoutSec=5
ExecStart=/opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l2 -d -p /var/run/user/%U/pangolin-auth-reencrypt/pangolin-auth-reencrypt-%i.pid -L /pgerrorlogs/0<base_version>/pangolin-auth-reencrypt -n pangolin-auth-reencrypt-%i-%%Y-%%m-%%d_%%H%%M%%S.log

PIDFile=/var/run/user/%U/pangolin-auth-reencrypt/pangolin-auth-reencrypt-%i.pid
Restart=on-failure

[Install]
WantedBy=default.target
Примечание

Параметры для заполнения:

  • %i — имя пользователя;
  • %U — идентификатор пользователя;
  • <base_version> базовая версия Pangolin (текущая: 8).

Включение и выключение функциональности

к сведению

Функциональность синхронизации запуска службы pangolin-auth-reencrypt и сервера базы данных можно включать или отключать, а также тайм-аут ожидания перекодирования, который задается для службы базы данных, можно выставить в неограниченное время.

Чтобы включить функциональность синхронизации запуска службы pangolin-auth-reencrypt и сервера базы данных, необходимо произвести следующие настройки на обеих сторонах взаимодействия:

  • На стороне службы pangolin-auth-reencrypt:

    При запуске службы необходимо указать параметр --done-dir=<путь для сохранения <username>.done файлов>.

    Пример запуска:

    /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l2 -d -p /var/run/user/984/pangolin-auth-reencrypt/pangolin-auth-reencrypt-postgres.pid -L pgerrorlogs/06/pangolin-auth-reencrypt -n pangolin-auth-reencrypt-postgres-%%Y-%%m-%%d_%%H%%M%%S.log --done-dir=/var/run/pangolin_reencrypt
    Внимание!

    Проверьте наличие необходимых прав (на чтение и на запись) в директорию, заданную с помощью параметра --done-dir для пользователя, от которого запускается служба pangolin-auth-reencrypt.

  • На стороне службы сервера базы данных:

    В конфигурационном файле сервера базы данных задайте имена отслеживаемых файлов через параметр reencrypt.monitored_files, например, reencrypt.monitored_files = '/var/run/pangolin-auth-reencrypt/postgres.done'.

    Также можно задать интервал ожидания службой сервера базы данных окончания перекодирования данных службой pangolin-auth-reencrypt, например, reencrypt.wait_timeout = 15.

    Чтобы служба сервера базы данных бесконечно ждала окончания перекодирования данных службой pangolin-auth-reencrypt, установите параметр reencrypt.wait_timeout = -1.

Назначение привилегий на &lt;username>.done файлы

к сведению

Доступно назначить привилегии на <username>.done файлы.

Чтобы <username>.done файлы имели отличные от заданных по умолчанию привилегии, при запуске службы pangolin-auth-reencrypt укажите параметр --done-privileges=<file_mode_mask:owner:group>.

Пример запуска:

/opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l2 -d -p /var/run/user/984/pangolin-auth-reencrypt/pangolin-auth-reencrypt-postgres.pid -L pgerrorlogs/06/pangolin-auth-reencrypt -n pangolin-auth-reencrypt-postgres-%%Y-%%m-%%d_%%H%%M%%S.log --done-dir=/var/run/pangolin_reencrypt --done-privileges=666:postgres:postgres

Привилегии на файлы задаются строго через знак : (двоеточие). Также возможно частичное задание отдельных привилегий:

  • Настройка только маски прав доступа:

     /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l2 -d -p /var/run/user/984/pangolin-auth-reencrypt/pangolin-auth-reencrypt-postgres.pid -L /pgerrorlogs/06/pangolin-auth-reencrypt -n pangolin-auth-reencrypt-postgres-%%Y-%%m-%%d_%%H%%M%%S.log --done-dir=/var/run/pangolin_reencrypt --done-privileges=600
  • Настройка маски прав доступа и владельца:

    /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l2 -d -p /var/run/user/984/pangolin-auth-reencrypt/pangolin-auth-reencrypt-postgres.pid -L /pgerrorlogs/06/pangolin-auth-reencrypt -n pangolin-auth-reencrypt-postgres-%%Y-%%m-%%d_%%H%%M%%S.log --done-dir=/var/run/pangolin_reencrypt --done-privileges=755:postgres
  • Настройка владельца и группы:

    /opt/pangolin-auth-reencrypt/bin/pangolin-auth-reencrypt -l2 -d -p /var/run/user/984/pangolin-auth-reencrypt/pangolin-auth-reencrypt-postgres.pid -L /pgerrorlogs/06/pangolin-auth-reencrypt -n pangolin-auth-reencrypt-postgres-%%Y-%%m-%%d_%%H%%M%%S.log --done-dir=/var/run/pangolin_reencrypt --done-privileges=:postgres:pangolin_users
примечание

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

Если какая-то из привилегий не указана, то ее значение выставляется равным значению по умолчанию.

Значения по умолчанию:

  • file_mode_mask = 0644;
  • owner = <file_creator>;
  • group = <file_creator>.

Если не удалось изменить владельца или группу файла из-за отсутствия прав или по какой-либо другой причине, то на файл назначаются следующие привилегии:

  • file_mode_mask = 0660;
  • owner = <file_creator>;
  • group = <file_creator_primary_group>.

Это сделано для того, чтобы только создатель и только участники основной группы создателя файла могли видеть, изменять, удалять файл.

Управление службой утилиты

Управлять утилитой pangolin-auth-reencrypt, запущенной в виде службы, можно с помощью следующих сигналов Linux:

  • SIGTERM - отправка запроса на завершение работы;
  • SIGUSR1 - отправка запроса на внеочередную проверку параметров сервера;
  • SIGRTMIN - отправка запроса на проверку параметров (формируется таймером с периодом 5 секунд).

Режим игнорирования ошибок

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

В режиме игнорирования ошибок возникновение ошибки в процессе перекодирования/отката перекодирования файлов не приводит к остановке работы утилиты, последовательно предпринимаются попытки перекодировать/восстановить все файлы, указанные в файле конфигурации.

Режим отката операции перекодирования

Перед началом процесса перекодирования утилита создает резервные копии файла с параметрами сервера и файлов с засекреченными параметрами подключения к БД. Резервная копия создается в том же каталоге, где и исходный файл. Имя резервной копии файла формируется по принципу: .original_name_with_extension.bak (пример для файла enc_params.cfg: .enc_params.cfg.bak).

В режиме отката операции перекодирования утилита возвращает файлы в исходное состояние на основании резервных копий.

Код завершения работы утилиты

В случае успеха утилита возвращает 0. Если работа утилиты завершилась с ошибкой — утилита возвращает код ошибки. Возможные коды возврата утилиты:

  • 0 — операция перекодирования, откат операции перекодирования завершились с успехом (файл конфигурации не содержит ошибок для параметра -c);
  • 1 — ошибка в файле конфигурации утилиты;
  • 2 — работа завершена с ошибкой (подробности указаны в логе).

Отключение функциональности утилиты

Для отключения функциональности:

  1. Остановите одну или несколько служб systemd в Linux, запускающие демон утилиты.

    Системные unit-файлы:

    sudo systemctl stop pangolin-auth-reencrypt@<имя_пользователя>.service

    Пользовательские unit-файлы (без sudo, от имени соответствующего пользователя):

    systemctl --user stop pangolin-auth-reencrypt@<имя_пользователя>.service
  2. Переведите состояние служб в disable.

    Системные unit-файлы:

    sudo systemctl disable --now pangolin-auth-reencrypt@<имя_пользователя>.service

    Пользовательские unit-файлы:

    systemctl --user disable --now pangolin-auth-reencrypt@<имя_пользователя>.service

    Если демон утилиты запущен вручную, то требуется отправить процессу демона сигнал SIGTERM, для этого:

    1. Определите идентификаторы процессов демона:

      ps aux | grep -i pangolin-auth-reencrypt
    2. Для всех найденных процессов демона отправьте сигнал:

      kill -SIGTERM <pid>

      Где <pid> — найденный идентификатор процесса демона.

Лог утилиты

Утилита формирует лог в стандартный поток вывода Linux. Журнал (log) содержит информацию о процессе работы утилиты. Журнал (log) утилиты может быть перенаправлен в файл средствами ОС. Включение журналирования задается параметром -l или --log. По умолчанию утилита выводит сообщения только в случае ошибок.

В режиме работы демона записи (log) переводятся в системный журнал Linux syslog. В этом режиме дополнительно в записи журнала поступает информация о результате инициализации демона. В случае успешного запуска демона утилиты в логе появится строка Reencrypt daemon was started for <uname>.

В утилите предусмотрена возможность задать уровни логирования:

  • 1 (-l1 или --log=1) — показывает только ошибки;
  • 2 (-l2 или --log=2) — показывает записи (log) по перекодированию данных и ошибки;
  • 3 (-l3 или --log=3) — показывает лог по проверке параметров сервера, перекодированию данных и ошибки.

По умолчанию (без указания уровня: -l или --log) используется 2 уровень логирования.

примечание

Для режима демона рекомендуется запускать утилиту с уровнем лога не выше 2, чтобы в системный журнал попадали только ключевые моменты работы.

Сообщения системного журнала

Логи на стороне службы pangolin-auth-reencrypt:

  • Ошибка в конфигурационном файле:

    2022-06-06 17:33:52.870752130 [18572] ERROR: Configuration file content (json) error: /etc/pangolin-auth-reencrypt/enc_util.cfg
    2022-06-06 17:33:52.870818918 [18572] LOG: Load configuration /etc/pangolin-auth-reencrypt/enc_util.cfg FAIL
  • Запуск утилиты первый раз:

    2022-06-06 17:29:33.914889769 [18200] LOG: Load configuration /etc/pangolin-auth-reencrypt  enc_util.cfg ok
    2022-06-06 17:29:33.916778674 [18200] LOG: Start saving current encrypting params
    2022-06-06 17:29:33.923238749 [18200] LOG: Saving current encrypting params ok
  • Повторный запуск утилиты при неизменных параметрах сервера:

    2022-06-06 17:29:46.226502410 [18264] LOG: Load configuration /etc/pangolin-auth-reencrypt  enc_util.cfg ok
    2022-06-06 17:29:46.228432243 [18264] LOG: Check encrypting params in file
    2022-06-06 17:29:46.234465754 [18264] LOG: Encrypting params in file are equal to the current
  • Значение file_mode_mask на <username>.done файл задано некорректно:

    ERROR: The parameter responsible for done file creation mode was passed incorrectly: 0600asd, using defaults: 0644
  • <username>.done файл невозможно создать:

    ERROR: Create file failed: /var/run/reencrypt/postgres.done
  • Изменение привилегий на <username>.done файл завершилось неудачей (в лог пишется детальное сообщение об операции):

    • Неудачная попытка изменить владельца файла:

      ERROR: Change failed: 0600, postgres:root for /var/run/reencrypt/postgres.done because of error: failed to set file owner
    • Неудачная попытка назначить несуществующую группу:

      ERROR: Change failed: 0600, postgres:invalid_group for /var/run/reencrypt/postgres.done because of error: failed to get group information
    • Неудачная попытка назначить несуществующего пользователя:

      ERROR: Change failed: 0600, invalid_user:postgres for /var/run/reencrypt/postgres.done, error details: failed to get user information
    • Неудачная попытка изменить атрибут file_mode_mask:

      ERROR: Change failed: 0644, postgres:postgres for /var/run/reencrypt/postgres.done, error details: file not set default permission
примечание

В кластерной конфигурации в механизме синхронизации старта участвует также pangolin-manager. При запуске базы данных pangolin-manager проверяет наличие и временные метки файлов <username>.done, а также ожидает истечения интервала, заданного параметром reencrypt.wait_timeout.

Если база данных не запускается в рамках этого сценария, необходимо анализировать не только журнал сервера базы данных, но и журнал pangolin-manager, так как именно в нем могут содержаться подробности причины, по которой запуск не был выполнен.

Логи на стороне службы сервера базы данных:

  • Если синхронизация запуска утилиты pangolin-auth-reencrypt и сервера базы данных включена, то при старте сервера БД в лог по умолчанию записываются сообщения уровня LOG, свидетельствующие о начале и завершении ожидания файлов готовности <username>.done:

    LOG: Start checking pangolin-auth-reencrypt service
    LOG: End checking pangolin-auth-reencrypt service
  • Если загрузка сервера приостановлена и в логе отображается последнее сообщение вида:

    LOG: Start checking pangolin-auth-reencrypt service

    То для просмотра расширенной информации и определения возможных ошибок конфигурации сервера базы данных или службы pangolin-auth-reencrypt переключите параметр log_min_messages сервера в значение DEBUG1. После перезапуска службы в логе можно будет увидеть детальное сообщение вида:

    LOG: Start checking pangolin-auth-reencrypt service
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 1 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 2 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 3 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 4 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 5 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 6 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 7 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 8 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 9 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 10 second(s) from 10...
    DEBUG: Skip waiting of Pangolin-auth-reencrypt service. Continue PostgresSQL startup...
    LOG: End checking pangolin-auth-reencrypt service

    Чтобы в вывод добавить значения параметров reencrypt.monitored_files и reencrypt.wait_timeout, переключите параметр log_min_messages сервера в значение DEBUG2. После перезапуска службы в логе можно будет увидеть детальное сообщение вида:

    LOG: Start checking pangolin-auth-reencrypt service
    DEBUG: Pangolin-auth-reencrypt service: wait_timeout - 10 seconds
    DEBUG: Pangolin-auth-reencrypt service: Done file - /opt/pangolin-auth-reencrypt/pg-sync-data/postgres.done
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 1 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 2 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 3 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 4 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 5 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 6 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 7 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 8 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 9 second(s) from 10...
    DEBUG: Pangolin-auth-reencrypt service is not processed yet after startup. Waiting 10 second(s) from 10...
    DEBUG: Skip waiting of Pangolin-auth-reencrypt service. Continue PostgresSQL startup...
    LOG: End checking pangolin-auth-reencrypt service

Синхронизация запуска утилиты и сервера базы данных

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

Конфигурация standalone

Для одиночных экземпляров серверов баз данных настройка выполняется в файле postgresql.conf.

Необходимо сконфигурировать два параметра:

  • reencrypt.monitored_files — путь к файлам <uname>.done, которые утилита перекодирования создает при своей работе после удачного перекодирования;
  • reencrypt.wait_timeout — тайм-аут в секундах, в течение которого база данных будет ожидать появления файлов <uname>.done, создаваемых утилитой перекодирования.

Пример конфигурации:

reencrypt.monitored_files = '/opt/pangolin-auth-reencrypt/pg-sync-data/postgres.done,/opt/pangolin-auth-reencrypt/pg-sync-data/kmadmin_pg.done'
reencrypt.wait_timeout = 30

В случае обнаружения сервером баз данных сконфигурированных <uname>.done файлов или по истечении времени тайм-аута запуск сервера будет продолжен.

Конфигурация cluster

Для кластеров настройка проводится аналогичным образом, однако используется файл конфигурации postgres.yml. Для арбитра, параметры находятся в разделе pandolin_dcs файла.

Необходимо сконфигурировать два параметра:

  • reencrypt.monitored_files — путь к файлам <uname>.done, которые утилита перекодирования создает при своей работе после удачного перекодирования;
  • reencrypt.wait_timeout — тайм-аут в секундах, в течение которого база данных будет ожидать появления файлов <uname>.done, создаваемых утилитой перекодирования.

Местоположение файлов с расширением .done зависит от способа развертывания сервиса перекодирования pangolin-auth-reencrypt. Стандартный путь до готового файла выглядит так:

/opt/pangolin-auth-reencrypt/pg-sync-data/<username>.done

Где <username> соответствует имени пользователя, запустившего процесс перекодирования, например, postgres или kmadmin_pg.

Пример конфигурации:

  • Для узлов мастер и реплика:

    # ...
    postgresql:
    # ...
    parameters:
    # ...
    reencrypt.monitored_files = '/opt/pangolin-auth-reencrypt/pg-sync-data/postgres.done,/opt/pangolin-auth-reencrypt/pg-sync-data/kmadmin_pg.done'
    reencrypt.wait_timeout = 30
  • Для узла арбитр:

    # ...
    pangolin_dcs:
    # ...
    reencrypt.monitored_files = '/opt/pangolin-auth-reencrypt/pg-sync-data/postgres.done,/opt/pangolin-auth-reencrypt/pg-sync-data/kmadmin_pg.done'
    reencrypt.wait_timeout = 30

В случае обнаружения каждым узлом кластера (мастер, реплика, арбитр) сконфигурированных <uname>.done файлов или по истечении времени тайм-аута запуск будет продолжен. Перекодирование выполняется на компонентах независимо.