Задание 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?