Задание 1: Защита системного каталога pg_proc
По итогам выполнения данной лабораторной работы вы научитесь:
- настраивать экземпляр СУБД Pangolin для интеграции с подсистемой контроля целостности;
- защищать системный каталог
pg_proc; - проверять целостность защищаемых объектов;
- анализировать последствия нарушений и выполнять восстановление контроля.
Инфраструктура подсистемы целостности
-
Проверьте наличие каталога
pg_integrityв каталоге данных после запуска:[student@srv1 ~]$ sudo -u postgres ls -l /pgdata/06/data/pg_integritytotal 8-rw------- 1 postgres postgres 26 ... integrity_files.json-rw------- 1 postgres postgres 26 ... integrity_relations.json -
Изучите содержимое файлов:
[student@srv1 ~]$ sudo -u postgres cat /pgdata/06/data/pg_integrity/integrity_relations.json[student@srv1 ~]$ sudo -u postgres cat /pgdata/06/data/pg_integrity/integrity_files.jsonОжидаемый результат: оба файла содержат
{ "integrity" : null }.
Постановка pg_proc под защиту
-
Создайте тестовую функцию от имени пользователя
student:[student@srv1 ~]$ psql -h srv1 -p 5433student=> CREATE FUNCTION vcheras() RETURNS timestamp AS $$SELECT now() - '1 day'::interval;$$ LANGUAGE SQL;Проверьте создание и атрибуты:
student=> \df vcherasstudent=> SELECT proname, prosecdef FROM pg_proc WHERE proname = 'vcheras';Ожидаемый результат: поле
prosecdefравноf(false). -
В отдельном терминале запустите мониторинг журнала сообщений (от пользователя
postgres):[student@srv1 ~]$ sudo -u postgres tail -f $(cut -d' ' -f2 /pgdata/06/data/current_logfiles) -n 20 -
В сеансе суперпользователя поставьте системный каталог
pg_procпод защиту:postgres=# SELECT pg_integrity_add_catalog('student', 'pg_catalog.pg_proc');Ожидаемый результат: функция возвращает
t, а в журнале появляется записьRelation hash successfully added "student" "pg_catalog.pg_proc". -
Проверьте изменение файла
integrity_relations.json:[student@srv1 ~]$ sudo -u postgres cat /pgdata/06/data/pg_integrity/integrity_relations.jsonОжидаемый результат: в файле появился блок с хешем для отношения
pg_catalog.pg_procв базеstudent. -
Измените атрибут безопасности функции (например, на
SECURITY DEFINER) от пользователяstudent:student=> ALTER FUNCTION vcheras() SECURITY DEFINER;Проверьте изменение:
student=> SELECT proname, prosecdef FROM pg_proc WHERE proname = 'vcheras';Ожидаемый результат:
prosecdefсталt. Сеансstudentпри этом остается активным. -
Убедитесь, что сеанс пользователя пока не прерван:
student=> SELECT pg_backend_pid();
Ожидаемый результат: номер PID, например 177759.
Проверка целостности
-
Выполните проверку целостности от суперпользователя:
postgres=# SELECT pg_integrity_check();Ожидаемый результат:
f(false), так как хеш изменился после изменения функции. -
Наблюдайте за журналом сообщений: появятся предупреждения о различии хеша и принудительное завершение сеанса
student.Ожидаемые строки в логе:
WARNING: The hash is different for the catalog object: pg_catalog.pg_procWARNING: Disconnect proc pid 177759 roleId 16390 rolename studentFATAL: terminating connection due to administrator command -
Попробуйте выполнить любую команду в сеансе
student– соединение будет разорвано.
Восстановление целостности
-
Повторно добавьте каталог под защиту (это пересчитает хеш на текущее состояние) от суперпользователя:
postgres=# SELECT pg_integrity_add_catalog('student', 'pg_catalog.pg_proc'); -
Выполните проверку целостности:
postgres=# SELECT pg_integrity_check();Ожидаемый результат:
t. -
Убедитесь, что сеанс
studentможно открыть снова:[student@srv1 ~]$ psql -h srv1 -p 5433Выполните запрос:
student=> SELECT pg_backend_pid();Ожидаемый результат: новый PID, соединение активно.
Подведем итоги
Вопрос 1
Вопрос 1: Изменения каких типов объектов отслеживаются при включенной защите pg_proc?
Вопрос 2
Вопрос 2: Посмотрите на следующие сообщения:
2026-02-01 19:18:12.750 MSK [22704] WARNING: The hash is different for the catalog object: pg_catalog.pg_proc
2026-02-01 19:18:12.750 MSK [22704] WARNING: Disconnect proc pid 22463 roleId 16388 rolename student
2026-02-01 19:18:12.751 MSK [22463] FATAL: terminating connection due to administrator command
Выберите все верные утверждения: