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

Задание 1: Защита системного каталога pg_proc

По итогам выполнения данной лабораторной работы вы научитесь:

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

Инфраструктура подсистемы целостности​

  1. Проверьте наличие каталога pg_integrity в каталоге данных после запуска:

    [student@srv1 ~]$ sudo -u postgres ls -l /pgdata/06/data/pg_integrity
    total 8
    -rw------- 1 postgres postgres 26 ... integrity_files.json
    -rw------- 1 postgres postgres 26 ... integrity_relations.json
  2. Изучите содержимое файлов:

    [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 под защиту​

  1. Создайте тестовую функцию от имени пользователя student:

    [student@srv1 ~]$ psql -h srv1 -p 5433
    student=> CREATE FUNCTION vcheras() RETURNS timestamp AS $$
    SELECT now() - '1 day'::interval;
    $$ LANGUAGE SQL;

    Проверьте создание и атрибуты:

    student=> \df vcheras
    student=> SELECT proname, prosecdef FROM pg_proc WHERE proname = 'vcheras';

    Ожидаемый результат: поле prosecdef равно f (false).

  2. В отдельном терминале запустите мониторинг журнала сообщений (от пользователя postgres):

    [student@srv1 ~]$ sudo -u postgres tail -f $(cut -d' ' -f2 /pgdata/06/data/current_logfiles) -n 20
  3. В сеансе суперпользователя поставьте системный каталог pg_proc под защиту:

    postgres=# SELECT pg_integrity_add_catalog('student', 'pg_catalog.pg_proc');

    Ожидаемый результат: функция возвращает t, а в журнале появляется запись Relation hash successfully added "student" "pg_catalog.pg_proc".

  4. Проверьте изменение файла integrity_relations.json:

    [student@srv1 ~]$ sudo -u postgres cat /pgdata/06/data/pg_integrity/integrity_relations.json

    Ожидаемый результат: в файле появился блок с хешем для отношения pg_catalog.pg_proc в базе student.

  5. Измените атрибут безопасности функции (например, на SECURITY DEFINER) от пользователя student:

    student=> ALTER FUNCTION vcheras() SECURITY DEFINER;

    Проверьте изменение:

    student=> SELECT proname, prosecdef FROM pg_proc WHERE proname = 'vcheras';

    Ожидаемый результат: prosecdef стал t. Сеанс student при этом остается активным.

  6. Убедитесь, что сеанс пользователя пока не прерван:

student=> SELECT pg_backend_pid();

Ожидаемый результат: номер PID, например 177759.

Проверка целостности​

  1. Выполните проверку целостности от суперпользователя:

    postgres=# SELECT pg_integrity_check();

    Ожидаемый результат: f (false), так как хеш изменился после изменения функции.

  2. Наблюдайте за журналом сообщений: появятся предупреждения о различии хеша и принудительное завершение сеанса student.

    Ожидаемые строки в логе:

    WARNING: The hash is different for the catalog object: pg_catalog.pg_proc
    WARNING: Disconnect proc pid 177759 roleId 16390 rolename student
    FATAL: terminating connection due to administrator command
  3. Попробуйте выполнить любую команду в сеансе student – соединение будет разорвано.

Восстановление целостности​

  1. Повторно добавьте каталог под защиту (это пересчитает хеш на текущее состояние) от суперпользователя:

    postgres=# SELECT pg_integrity_add_catalog('student', 'pg_catalog.pg_proc');
  2. Выполните проверку целостности:

    postgres=# SELECT pg_integrity_check();

    Ожидаемый результат: t.

  3. Убедитесь, что сеанс 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

Выберите все верные утверждения: