Введение
В рамках темы будут рассмотрены:
- контроль целостности конфигурации и объектов БД;
- реализация контроля целостности объектов БД;
- функции для контроля целостности;
- параметры настройки для контроля целостности;
Контроль целостности конфигурации и объектов БД
Безопасная эксплуатация СУБД требует исключения следующих несанкционированных действий:
- произвольного изменения кода хранимых функций и процедур;
- изменения настроек конфигурации экземпляров СУБД и кластера 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)