Обновление бинарных файлов
Актуально для СУБД Pangolin версии 6.x.x.
Скрипт обновления бинарных файлов pangolin_update_binary_script
используется для применения исправлений и доработок в рамках одной мажорной версии.
Ручное обновление
Чтобы выполнить обновление бинарных файлов Pangolin с использованием скрипта:
-
Убедитесь, что на стенде:
- нет задержки репликации на узлах кластера Pangolin;
- Pangolin работоспособный (есть доступ в базу данных);
- отключен мониторинг (фоновых процессов и мониторинг статуса репликации) на время выполнения обновления бинарных файлов;
- отсутствует активное резервное копирование.
-
Скачайте и распакуйте дистрибутив.
-
Из дистрибутива скопируйте rpm-файл файл
platform-v-pangolin-<Версия Pangolin>-<Версия ОС>.rpm
Pangolin на узлы кластера. -
Проверьте наличие утилиты перекодирования в директории
/etc/postgres
на узлах Pangolin. Если файлы утилиты перекодирования есть, то скопируйте их из дистрибутиваpangolin-auth-reencrypt
в каталог/etc/postgres
с правамиroot:root 755
. -
Выполните команду для замены бинарных файлов от суперпользователя на узлах с Pangolin:
sudo yum install platform-v-pangolin-dbms-<Версия Pangolin>-<Версия ОС>.rpm
-
Удалите старый каталог, затем создайте на него символьные ссылки:
sudo rm -rf /usr/pangolin-{version-from}
sudo ln -sf /usr/pangolin-{version-to} /usr/pangolin-{version-from} -
Выполните перезапуск Pangolin (restart) в зависимости от типа установки с помощью сервиса
postgresql.service
илиpatronictl
. -
Проверьте работоспособность Pangolin.
Автоматическое обновление
Руководство по автоматическому обновлению бинарных файлов Pangolin:
-
Проверьте, что на стенде:
- нет задержки репликации на узлах кластера Pangolin;
- Pangolin работоспособный (есть доступ в базу данных);
- отключен мониторинг (фоновых процессов и мониторинг статуса репликации) на время выполнения обновления бинарных файлов;
- отсутствует активное резервное копирование.
-
Скачайте и распакуйте дистрибутив.
-
Скопируйте RPM-файл Pangolin и бинарный файл утилиты
pangolin-auth-reencrypt
в папкуinstaller/scripts_external/pangolin_update_binary_script/roles/update_binary_script/files
. -
Настройте узлы в
installer/scripts_external/pangolin_update_binary_script/inventories
. -
Ознакомьтесь с переменными по умолчанию в файле
scripts_external/pangolin_update_binary_script/playbook_update_binary.yaml
и при необходимости скорректируйте их:- PG_PORT: 5433 #порт postgresql
- REMOTE_TMP: /home/postgres/update_binary_cache_dir #временная директория для хранения rpm на время выполнения скрипта
- RPM_NAME: platform-v-pangolin-dbms-<Версия Pangolin>-<Версия ОС>.rpm #имя rpm-файла
- PGHOME: /usr/pangolin-{version-from} #расположение нового pghome
- PGHOME_OLD: /usr/pangolin-{version-to} #расположение старого pghome
- patroni_conf_dir: /etc/patroni #расположение конфигурационных файлов patroni
- clustername: clustername #имя кластера
- patronictl_path: /usr/patroni/patroni_venv/bin/patronictl #расположение patronictl
- patroni_wait_seconds: 15 #задержка после выполнения команд restart/switchover
- LANG: en_US.UTF-8 # язык интерфейса ОС
- LC_ALL: en_US.UTF-8 # язык интерфейса ОС -
Перейдите в каталог
installer/scripts_external/pangolin_update_binary_script
и запустите playbook:
-
для решения standalone:
ansible-playbook playbook_update_binary.yaml \
-i inventories/standalone/hosts.ini -t standalone \
--flush-cache -vv \
--ssh-extra-args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' -vv -
для кластерной конфигурации:
ansible-playbook playbook_update_binary.yaml \
-i inventories/cluster/hosts.ini -t cluster \
--flush-cache -vv \
--ssh-extra-args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' -vv
Проверки и информационные сообщения процесса обновления
Проверка пароля через параметр postgres_db_pass
Пароль исходной БД должен совпадать с паролем, переданным в пользовательский конфигурационный файл через параметр postgres_db_pass
. В случае несовпадения в лог будет выведена ошибка, блокирующая дальнейшее обновление:
FAIL__Пароль от суперпользователя postgres в пользовательском конфигурационном файле не совпадает с текущим паролем в БД. Скорректируйте значение параметра 'postgres_db_pass' в пользовательском конфигурационном файле.__FAIL
Проверка засекречивания параметра postgres_db_pass
Значение параметра postgres_db_pass
не должно быть в виде scram-sha-256 или md5. Если пароль для УЗ postgres передан не в засекреченном с помощью ansible-vault
виде, то выводится ошибка, блокирующая дальнейшее выполнение сценария:
"FAIL__Пароль от суперпользователя postgres не должен быть задан в виде хеша 'SCRAM-SHA-256' или 'md5'.__FAIL"
В случае успешного прохождения проверки будет выведено:
"INFO__Проверка пароля от суперпользователя postgres завершилась успешно.__INFO"
Проверки для определения наличия СЗИ
К проверкам для определения наличия СЗИ в процессе обновления относятся:
- проверка включенной защиты конфигурации (
SHOW secure_config
); - проверка включенного TDE (
SELECT check_tde_is_on()
); - проверка включенной защиты от привилегированных пользователей (
SELECT COUNT(1) FROM pg_catalog.pr_object WHERE datoid = 0 AND objoid = 0 AND objkind = 0
).
Добавление новых параметров в локальный конфигурационный файл контролируется файлом diff.txt
в скриптах развертывания/обновления. Данная доработка будет применяться к обновлению всех стендов независимо от наличия подключенных СЗИ; изменения коснулись только конфигурационных файлов СУБД (postgres.yml, postgresql.conf
).
Пароль передается в момент инициализации, перед этим он переводится в хеш SCRAM-SHA-256. Строка запуска выглядит так:
# Установка
{{ PGHOME }}/bin/initdb -D {{ PGDATA }} -k -A scram-sha-256 --pwfile {{ postgres_pass }} --locale {{ locale }} --update-authid
# Обновление
{{ PGHOME }}/bin/initdb -D {{ PGDATA }} -k -A scram-sha-256 --pwfile {{ postgres_pass }} -E {{ old_postgres_encoding.query_result[0].server_encoding }} --update-authid --lc-collate {{ old_postgres_locale.settings.lc_collate.setting }} --lc-ctype {{ old_postgres_locale.settings.lc_ctype.setting }} --lc-messages {{ old_postgres_locale.settings.lc_messages.setting }} --lc-monetary {{ old_postgres_locale.settings.lc_monetary.setting }} --lc-numeric {{ old_postgres_locale.settings.lc_numeric.setting }} --lc-time {{ old_postgres_locale.settings.lc_time.setting }}
Значение параметра postgres_db_pass
, отвечающего за проверку пароля, передаваемого в пользовательском конфигурационном файле, не должно быть в виде scram-sha-256 или md5.
Пароль суперпользователя (postgres
) считывается в интерактивном режиме, а сам процесс миграции осуществляется с помощью SCRAM-SHA-256
. Пароль будет считываться из параметра postgres_db_pass
(старое название postgres_db_scram_pass
) конфигурационного файла в засекреченном ansible vault
-виде.
Пароль исходной БД должен совпадать с паролем переданным в пользовательский конфигурационный файл через параметр postgres_db_pass
. В случае несовпадения, продолжить процесс обновления будет невозможно.
Утилита secret_storage_client
Утилита secret_storage_client
служит для проверки наличия конфигурационных параметров СУБД Pangolin и их значений в хранилище секретов:
$ secret_storage_client -?
Usage:
./secret_storage_client <option>...
Options:
--help [-?] this help
--plugins-dir-path [-d] path to directory containing plugins
--plugin-log-level [-l] plugin log level [DEBUG, LOG, INFO, NOTICE, WARNING (default), ERROR, FATAL, PANIC]
--config use config file (/etc/postgres/enc_connection_settings.cfg) with settings
to connect to Secret storage [default]
--interactive [-i] run in interactive mode
--cluster [-c] cluster ID
--host [-h] domain name or ip address of Secret storage
--port [-p] secret storage server port
--protocol secret storage protocol [http (1), default: https (2)]
--prefix [-x] secrets path prefix [default: kv]
--suffix [-s] secrets path suffix [default: empty]
--namespace [-n] secrets namespace [default: empty]
--type [-t] auth type [userpass (1), approle (2)]
--auth [-a] auth point [default: empty]
--id [-u] login or role ID
--root-ca [-r] file or folder with root certificate to check Secret storage server
--skip-confirm [-k] input secret without confirmation
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 './secret_storage_client' utility is used to read secrets from Secret storage
Утилита поддерживает следующие варианты ввода параметров для подключения к хранилищу секретов:
- Чтение параметров из файла
/etc/postgres/enc_connection_settings.cfg
(аргумент--config
). Данный способ используется, если файл предварительно был создан утилитойsetup_kms_credentials
. - Интерактивный ввод параметров (аргумент
--interactive
). - Если параметр отсутствует в аргументах, то будет запрошен ввод его значения. Ввод пароля или secretID осуществляется только интерактивно (аргумент
--interactive
).
Утилита возвращает список значений всех защищаемых конфигурационных параметров, поддерживаемых СУБД Pangolin, в формате:
имя параметра|||вариант защиты|||статус параметра|||значение:::имя параметра|||вариант защиты параметра|||статус параметра|||значение
В приведенном выше формате варианту защиты может соответствовать одно из значений:
VST_ONLY_VAULT
- параметру присваивается значение, полученное из хранилища секретов. В случае его отсутствия применяется значение по умолчанию для этого параметра;VST_STRICT_VAULT
- для параметра допустимо применение значения, полученного только из хранилища секретов;VST_EITHER
- параметру присваивается значение, полученное из хранилища секретов. В случае его отсутствия применяется значение из конфигурационного файлаpostgresql.conf
;VST_BOTH
- значение параметра в хранилище секретов должно совпадать со значением в конфигурационном файлеpostgresql.conf
. В случае отсутствия параметра в одном из источников применяется значение по умолчанию для этого параметра.
Статус параметра может быть установлен как:
present
- присутствует в хранилище секретов;absent
- отсутствует в хранилище секретов;null
- присутствует в хранилище секретов, но значение не указано.
Ниже приведен пример:
secure_config|||VST_ONLY_VAULT|||present|||off:::password_encryption|||VST_ONLY_VAULT|||absent|||:::ssl|||VST_ONLY_VAULT|||present|||on:::allowed_servers|||VST_ONLY_VAULT|||absent|||:::ssl_ca_file|||VST_ONLY_VAULT|||absent|||:::ssl_ca_path|||VST_ONLY_VAULT|||absent|||:::ssl_cert_file|||VST_ONLY_VAULT|||absent|||:::ssl_crl_file|||VST_ONLY_VAULT|||absent|||:::ssl_crl_dir|||VST_ONLY_VAULT|||present|||/pg_ssl/crl/test/server:::ssl_key_file|||VST_ONLY_VAULT|||absent|||:::ssl_ciphers|||VST_ONLY_VAULT|||absent|||:::ssl_prefer_server_ciphers|||VST_ONLY_VAULT|||absent|||:::ssl_ecdh_curve|||VST_ONLY_VAULT|||absent|||:::ssl_dh_params_file|||VST_ONLY_VAULT|||absent|||:::ssl_passphrase_command|||VST_BOTH|||absent|||:::serverssl.pkcs12_config_path|||VST_ONLY_VAULT|||present|||/pg_ssl/server.p12.cfg:::pg_ident_conf|||VST_BOTH|||absent|||:::is_tde_on|||VST_ONLY_VAULT|||null|||:::password_policies_enable|||VST_ONLY_VAULT|||absent|||:::password_policy.deny_default|||VST_ONLY_VAULT|||absent|||:::password_policy.reuse_time|||VST_ONLY_VAULT|||absent|||:::password_policy.in_history|||VST_ONLY_VAULT|||absent|||:::password_policy.max_age|||VST_ONLY_VAULT|||absent|||:::password_policy.min_age|||VST_ONLY_VAULT|||absent|||:::password_policy.grace_login_limit|||VST_ONLY_VAULT|||absent|||:::password_policy.grace_login_time_limit|||VST_ONLY_VAULT|||absent|||:::password_policy.expire_warning|||VST_ONLY_VAULT|||absent|||:::password_policy.lockout|||VST_ONLY_VAULT|||absent|||:::password_policy.lockout_duration|||VST_ONLY_VAULT|||absent|||:::password_policy.max_failure|||VST_ONLY_VAULT|||absent|||:::password_policy.failure_count_interval|||VST_ONLY_VAULT|||absent|||:::password_policy.check_syntax|||VST_ONLY_VAULT|||absent|||:::password_policy.min_length|||VST_ONLY_VAULT|||absent|||:::password_policy.illegal_values|||VST_ONLY_VAULT|||absent|||:::password_policy.alpha_numeric|||VST_ONLY_VAULT|||absent|||:::password_policy.min_alpha_chars|||VST_ONLY_VAULT|||absent|||:::password_policy.min_special_chars|||VST_ONLY_VAULT|||absent|||:::password_policy.min_uppercase|||VST_ONLY_VAULT|||absent|||:::password_policy.min_lowercase|||VST_ONLY_VAULT|||absent|||:::password_policy.max_rpt_chars|||VST_ONLY_VAULT|||absent|||:::password_policy.track_login|||VST_ONLY_VAULT|||absent|||:::password_policy.max_inactivity|||VST_ONLY_VAULT|||absent|||:::password_policy.use_password_strength_estimator|||VST_ONLY_VAULT|||absent|||:::password_policy.password_strength_estimator_score|||VST_ONLY_VAULT|||absent|||:::password_policy.custom_function|||VST_ONLY_VAULT|||absent|||:::password_policy.allow_hashed_password|||VST_ONLY_VAULT|||absent|||:::psql_encrypt_password|||VST_ONLY_VAULT|||absent|||:::encrypt_new_tablespaces|||VST_ONLY_VAULT|||absent|||:::test_vst_both_restart_only|||VST_BOTH|||absent|||:::password_policy.transport_password_mark_automatic|||VST_ONLY_VAULT|||absent|||:::password_policy.transport_password_life_time|||VST_ONLY_VAULT|||absent|||:::performance_insights.masking|||VST_ONLY_VAULT|||absent|||:::masking_mode|||VST_ONLY_VAULT|||absent|||:::enabled_extra_auth_methods|||VST_ONLY_VAULT|||present|||trust,cert:::enabled_sec_admin_extra_auth_methods|||VST_ONLY_VAULT|||present|||trust