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

Обновление бинарных файлов

Важно

Актуально для СУБД Pangolin версии 6.x.x.

Примечание

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

Ручное обновление

Чтобы выполнить обновление бинарных файлов Pangolin с использованием скрипта:

  1. Убедитесь, что на стенде:

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

  3. Из дистрибутива скопируйте rpm-файл файл platform-v-pangolin-<Версия Pangolin>-<Версия ОС>.rpm Pangolin на узлы кластера.

  4. Проверьте наличие утилиты перешифрования в директории /etc/postgres на узлах Pangolin. Если файлы утилиты перешифрования есть, то скопируйте их из дистрибутива pangolin-auth-reencrypt в каталог /etc/postgres с правами root:root 755.

  5. Выполните команду для замены бинарных файлов от суперпользователя на узлах с Pangolin:

    sudo yum install platform-v-pangolin-dbms-<Версия Pangolin>-<Версия ОС>.rpm
  6. Удалите старый каталог, затем создайте на него символьные ссылки:

    sudo rm -rf /usr/pangolin-{version-from}
    sudo ln -sf /usr/pangolin-{version-to} /usr/pangolin-{version-from}
  7. Выполните перезапуск Pangolin (restart) в зависимости от типа установки с помощью сервиса postgresql.service или patronictl.

  8. Проверьте работоспособность Pangolin.

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

Руководство по автоматическому обновлению бинарных файлов Pangolin:

  1. Проверьте, что на стенде:

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

  3. Скопируйте RPM-файл Pangolin и бинарный файл утилиты pangolin-auth-reencrypt в папку installer/scripts_external/pangolin_update_binary_script/roles/update_binary_script/files.

  4. Настройте узлы в installer/scripts_external/pangolin_update_binary_script/inventories.

  5. Ознакомьтесь с переменными по умолчанию в файле 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 # язык интерфейса ОС
  6. Перейдите в каталог 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