Задание 2: Защита внешнего файла
По итогам выполнения данной лабораторной работы вы научитесь:
- включать проверку целостности для внешних файлов;
- отслеживать изменения защищаемых объектов;
- анализировать последствия нарушения их целостности;
- восстанавливать работоспособность системы после несанкционированных изменений.
Включение защиты внешнего файла
-
Проверьте текущее состояние подсистемы защиты файлов. В сеансе суперпользователя выполните:
student=> \! cat $PGDATA/pg_integrity/integrity_files.jsonОжидаемый результат:
{"integrity" : null}Это означает, что ни один внешний файл не находится под защитой.
-
Поставьте под защиту конфигурационный файл
postgresql.conf:student=> SELECT pg_integrity_add_file('/etc/pangolin-manager/postgres.yml');Ожидаемый результат: функция возвращает
t. -
Проверьте содержимое файла
integrity_files.jsonпосле добавления:student=> \! cat $PGDATA/pg_integrity/integrity_files.jsonОжидаемый результат:
{"integrity" : [{"hash" : "0d018b7401a9277cd0cc38174584795fb5301310964b7b1522aac95330c85b50","name" : "/etc/pangolin-manager/postgres.yml","type" : "file"}]}Контрольная сумма (
hash) может отличаться в зависимости от содержимого файла.
Проверка целостности
-
Выполните проверку целостности сразу после постановки файла под защиту:
student=> SELECT pg_integrity_check();Ожидаемый результат:
t(true), так как файл еще не изменялся. -
В терминале пользователя ОС откройте второй сеанс (например, от пользователя
postgres) и внесите изменение в защищаемый файлpostgres.yml:[postgres@srv1 ~]$ vi /etc/pangolin-manager/postgres.ymlwork_mem: 20MB -
В сеансе пользователя
student(или любого непривилегированного пользователя) получите PID серверного процесса, обслуживающего эту сессию:student=> SELECT pg_backend_pid();Ожидаемый результат: номер PID, например
178796.Запомните или запишите этот PID.
-
В сеансе суперпользователя снова выполните проверку целостности:
student=> SELECT pg_integrity_check();Ожидаемый результат:
f(false), так как файл был изменен. -
Проанализируйте записи в журнале сообщений:
[student@srv1 ~]$ sudo -u postgres tail -f $(cut -d' ' -f2 /pgdata/06/data/current_logfiles) -n 20WARNING: The hash is different object: /etc/pangolin-manager/postgres.ymlWARNING: Disconnect proc pid 178796 roleId 16390 rolename studentFATAL: terminating connection due to administrator commandОбратите внимание: в предупреждении указан PID сеанса
student, который был принудительно завершен. -
Попробуйте выполнить любую команду в сеансе
student:student=> SELECT pg_backend_pid();Ожидаемый результат: соединение разорвано, сообщение об ошибке:
FATAL: terminating connection due to administrator commandserver closed the connection unexpectedly
Восстановление целостности
-
Добавьте под наблюдение измененную версию файла (это пересчитает контрольную сумму на текущее состояние):
student=> SELECT pg_integrity_add_file('/etc/pangolin-manager/postgres.yml'); -
Выполните проверку целостности:
student=> SELECT pg_integrity_check();Ожидаемый результат:
t. -
Убедитесь, что контрольная сумма в файле
integrity_files.jsonизменилась:student=> \! cat $PGDATA/pg_integrity/integrity_files.jsonОжидаемый результат: новое значение
hash, отличное от первоначального. -
Проверьте, что сеанс пользователя
studentможно открыть снова:[student@srv1 ~]$ psql -h srv1 -p 5433Выполните запрос:
student=> SELECT pg_backend_pid();Ожидаемый результат: новый PID, соединение активно.
Подведем итоги
Вопрос 1
Вопрос 1: Где находится pg_integrity?
Вопрос 2
Вопрос 2: Посмотрите на следующий вывод:
"integrity" : [
{
"hash" : "0d018b7401a9277cd0cc38174584795fb5301310964b7b1522aac95330c85b50",
"name" : "/pgdata/06/data/postgresql.conf",
"type" : "file"
}
]
Что было сделано для того, чтобы это получилось?