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

Введение

В рамках темы будут рассмотрены:

  • контроль целостности конфигурации и объектов БД;
  • реализация контроля целостности объектов БД;
  • функции для контроля целостности;
  • параметры настройки для контроля целостности;

Контроль целостности конфигурации и объектов БД​

Безопасная эксплуатация СУБД требует исключения следующих несанкционированных действий:

  • произвольного изменения кода хранимых функций и процедур;
  • изменения настроек конфигурации экземпляров СУБД и кластера Pangolin в целом;
  • модификации внешних файлов, необходимых для работы приложения, причем как исполняемых, так и иных.

Оригинальный PostgreSQL не предоставляет штатных механизмов защиты от указанных выше опасностей. Поэтому в СУБД Pangolin реализовано специальное решение для контроля целостности (то есть, соответствию необходимому для нормальной эксплуатации состоянию):

  • конфигурации системы управления базами данных;
  • настроек параметров баз данных;
  • хранимых функций и процедур;
  • внешних исполняемых файлов;
  • иных внешних файлов.

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

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

Реализация контроля целостности объектов БД​

При первом запуске экземпляра создаются специальные файлы, в которых хранятся описания объектов баз данных и внешних файлов:

[student@srv1 ~]$ sudo -iu postgres ls -l /pgdata/06/data/pg_integrity/
total 8
-rw------- 1 postgres postgres 26 May 11 2025 integrity_files.json
-rw------- 1 postgres postgres 26 May 11 2025 integrity_relations.json

Администратор задает список объектов и файлов, за целостностью которых необходимо следить (защищаемые объекты и файлы).

Для защищаемых объектов и файлов вычисляются контрольные суммы по алгоритму SHA256. Эти данные записываются в упомянутые выше специальные файлы (назовем их контрольными). Сохраненные контрольные суммы предназначения для выявления изменения защищаемых объектов и файлов.

Контрольные файлы могут быть удалены, но при повторном старте СУБД они будут созданы заново. Естественно, в результате удаления контрольных файлов будут удалены и контрольные суммы защищаемых объектов. Поэтому контрольные суммы защищаемых файлов в таком случае необходимо будет вычислить снова.

При запуске СУБД Pangolin стартует специальный процесс IntCheckLauncher:

[student@srv1 ~]$ ps f -C postgres
PID TTY STAT TIME COMMAND
153828 ? S 0:14 /usr/pangolin-6.7/bin/postgres -D /pgdata/06/data/ --config-file=/pgdata/06/data/postgresql.conf --listen_addresses=0.0.0.0 --port=5433 --cluster_name=Pobeda --wal_level
153831 ? Ss 0:00 \_ postgres: Pobeda: logger
153832 ? Ss 0:00 \_ postgres: Pobeda: checkpointer
153833 ? Ss 4:02 \_ postgres: Pobeda: wal backup writer
153834 ? Ss 0:05 \_ postgres: Pobeda: background writer
153836 ? Ss 0:00 \_ postgres: Pobeda: idle sessions terminator
153837 ? Ss 0:00 \_ postgres: Pobeda: integrity check launcher
...

В примере процесс с PID=153837 — integrity check launcher.

Если в момент старта процесса IntCheckLauncher контрольные файлы не обнаруживаются, они создаются заново. В процессе работы СУБД IntCheckLauncher либо по команде администратора, либо периодически в соответствии с настройками параметров, запускает процессы IntCheckWorker, которые и выполняют проверки контрольных сумм.

Если процесс IntCheckWorker обнаруживает несовпадение контрольной суммы или вообще защищаемый объект отсутствует, то работы СУБД блокируется. При этом в разделяемой памяти экземпляра устанавливается специальный флаг.

Снятие блокировки требует повторной проверки контрольных сумм. Блокировка снимается, если:

  • для измененного объекта или файла пересчитана контрольная сумма;
  • удаленный объект или файл восстановлен с исходной контрольной суммой;
  • полностью восстановлены контрольные файлы;
  • произведена повторная проверка, если возникло "зависание" процессов IntCheckLauncher или IntCheckWorker.

Функции для контроля целостности​

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

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

  • pg_integrity_check() — осуществляет полную проверку целостности;
  • select pg_integrity_add_catalog() — вычисляет контрольные суммы для объектов БД и записывает их в контрольный файл;
  • select pg_integrity_add_file() — вычисляет контрольные суммы для внешних файлов и добавляет их в контрольный файл.

Параметры настройки для контроля целостности​

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

Также имеется два параметра, связанные с ожиданиями:

  • integrity_check_wait — время ожидания завершения работы IntCheckWorker;
  • integrity_check_select_wait — время, в течении которого IntCheckLauncher ожидает завершения работы всех процессов IntCheckWorker.
student=> \dconfig integrity*
List of configuration parameters
Parameter | Value
-----------------------------+-------
integrity_check_delay | 1d
integrity_check_select_wait | 10s
integrity_check_wait | 5s
(3 rows)