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

Задание 2: Защита внешнего файла

В этом задании мы включим проверку целостности внешнего файла и проверим работу защиты.

Примечание

Для удобства рекомендуем открыть на сервере три отдельных терминала, распределив задачи следующим образом:

  • Терминал 1: для мониторинга логов.
  • Терминал 2: для работы от имени системного пользователя postgres.
  • Терминал 3: для действий от имени пользователя student.

Включение защиты внешнего файла​

Пока никакой файл не находится под защитой. В сеансе суперпользователя проверим содержимое json файла с контрольной суммой для защищаемых файлов:

postgres=# \! cat $PGDATA/pg_integrity/integrity_files.json
{
"integrity" : null
}

Поставим под защиту конфигурационный файл postgres.yml:

postgres=# SELECT pg_integrity_add_file('/etc/pangolin-manager/postgres.yml');
pg_integrity_add_file
-----------------------
t
(1 row)

Проверим:

postgres=# \! cat $PGDATA/pg_integrity/integrity_files.json
{
"integrity" : [
{
"hash" : "0d018b7401a9277cd0cc38174584795fb5301310964b7b1522aac95330c85b50",
"name" : "/etc/pangolin-manager/postgres.yml",
"type" : "file"
}
]
}

Проверку защиты​

Пока в файле postgres.yml ничего не менялось. Проверим его целостность:

postgres=# SELECT pg_integrity_check();
pg_integrity_check
--------------------
t
(1 row)

Поменяем в файле какую-либо настройку:

[postgres@srv1 ~]$ vi /etc/pangolin-manager/postgres.yml
work_mem: 20MB

Получим PID серверного процесса, обслуживающего сессию student:

student=> SELECT pg_backend_pid();
pg_backend_pid
----------------
178796
(1 row)

Снова проверим целостность файла:

[postgres@dbp1 data]$ psql
psql (15.5)
Type "help" for help.
postgres=# SELECT pg_integrity_check();
pg_integrity_check
--------------------
f
(1 row)

В журнал сообщений записано следующее:

[postgres@srv1 data]$ tail -f `cut -d' ' -f2 $PGDATA/current_logfiles` -n 20
...
2026-09-23 14:35:52 MSK [178806]: [1-1] app=integrity check worker,user=,db=,client=[bgworker],type=integrity check worker WARNING: The hash is different object: /etc/pangolin-manager/postgres.yml
2026-09-23 14:35:52 MSK [178806]: [2-1] app=integrity check worker,user=,db=,client=[bgworker],type=integrity check worker WARNING: Disconnect proc pid 178796 roleId 16390 rolename student
2026-09-23 14:35:52 MSK [178796]: [5-1] app=psql,user=student,db=student,client=<IP-Address1>,type=client backend FATAL: terminating connection due to administrator command
...

Сеанс student сброшен:

student=> SELECT pg_backend_pid();
FATAL: terminating connection due to administrator command
SSL connection has been closed unexpectedly
The connection to the server was lost. Attempting reset: Failed.
The connection to the server was lost. Attempting reset: Failed.
!?>

Добавим под наблюдение измененную версию файла:

postgres=# SELECT pg_integrity_add_file('/etc/pangolin-manager/postgres.yml');
pg_integrity_add_file
-----------------------
t
(1 row)
postgres=# SELECT pg_integrity_check();
pg_integrity_check
--------------------
t
(1 row)

Контрольная сумма, поменялась:

postgres=# \! cat $PGDATA/pg_integrity/integrity_files.json
{
"integrity" : [
{
"hash" : "cf00dcaff8eb6cc6f584ff3ba7d128b00c9d3db218dfb021b41db51e6bdb48bd",
"name" : "/etc/pangolin-manager/postgres.yml",
"type" : "file"
}
]
}

Сеанс student снова можно открыть:

[student@srv1 ~]$ psql -p 5433 -h srv1
psql (15.5)
Type "help" for help.
student=> SELECT pg_backend_pid();
pg_backend_pid
----------------
178908
(1 row)

Подведем итоги​

Вопрос 1

Вопрос 1: Где находится json файл с контрольными суммами защищаемых файлов?

Вопрос 2

Вопрос 2: Посмотрите на следующий вывод:

   "integrity" : [
      {
         "hash" : "0d018b7401a9277cd0cc38174584795fb5301310964b7b1522aac95330c85b50",
         "name" : "/pgdata/06/data/postgresql.conf",
         "type" : "file"
      }
   ]

Что необходимо сделать для предотвращения блокировки сессии, вызванной изменением файла /pgdata/06/data/postgresql.conf?