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

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

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

  • включать проверку целостности для внешних файлов;
  • отслеживать изменения защищаемых объектов;
  • анализировать последствия нарушения их целостности;
  • восстанавливать работоспособность системы после несанкционированных изменений.

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

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

    student=> \! cat $PGDATA/pg_integrity/integrity_files.json

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

    {
    "integrity" : null
    }

    Это означает, что ни один внешний файл не находится под защитой.

  2. Поставьте под защиту конфигурационный файл postgresql.conf:

    student=> SELECT pg_integrity_add_file('/etc/pangolin-manager/postgres.yml');

    Ожидаемый результат: функция возвращает t.

  3. Проверьте содержимое файла integrity_files.json после добавления:

    student=> \! cat $PGDATA/pg_integrity/integrity_files.json

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

    {
    "integrity" : [
    {
    "hash" : "0d018b7401a9277cd0cc38174584795fb5301310964b7b1522aac95330c85b50",
    "name" : "/etc/pangolin-manager/postgres.yml",
    "type" : "file"
    }
    ]
    }

    Контрольная сумма (hash) может отличаться в зависимости от содержимого файла.

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

  1. Выполните проверку целостности сразу после постановки файла под защиту:

    student=> SELECT pg_integrity_check();

    Ожидаемый результат: t (true), так как файл еще не изменялся.

  2. В терминале пользователя ОС откройте второй сеанс (например, от пользователя postgres) и внесите изменение в защищаемый файл postgres.yml:

    [postgres@srv1 ~]$ vi /etc/pangolin-manager/postgres.yml
    work_mem: 20MB
  3. В сеансе пользователя student (или любого непривилегированного пользователя) получите PID серверного процесса, обслуживающего эту сессию:

    student=> SELECT pg_backend_pid();

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

    Запомните или запишите этот PID.

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

    student=> SELECT pg_integrity_check();

    Ожидаемый результат: f (false), так как файл был изменен.

  5. Проанализируйте записи в журнале сообщений:

    [student@srv1 ~]$ sudo -u postgres tail -f $(cut -d' ' -f2 /pgdata/06/data/current_logfiles) -n 20
    WARNING: The hash is different object: /etc/pangolin-manager/postgres.yml
    WARNING: Disconnect proc pid 178796 roleId 16390 rolename student
    FATAL: terminating connection due to administrator command

    Обратите внимание: в предупреждении указан PID сеанса student, который был принудительно завершен.

  6. Попробуйте выполнить любую команду в сеансе student:

    student=> SELECT pg_backend_pid();

    Ожидаемый результат: соединение разорвано, сообщение об ошибке:

    FATAL: terminating connection due to administrator command
    server closed the connection unexpectedly

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

  1. Добавьте под наблюдение измененную версию файла (это пересчитает контрольную сумму на текущее состояние):

    student=> SELECT pg_integrity_add_file('/etc/pangolin-manager/postgres.yml');
  2. Выполните проверку целостности:

    student=> SELECT pg_integrity_check();

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

  3. Убедитесь, что контрольная сумма в файле integrity_files.json изменилась:

    student=> \! cat $PGDATA/pg_integrity/integrity_files.json

    Ожидаемый результат: новое значение hash, отличное от первоначального.

  4. Проверьте, что сеанс пользователя 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"
      }
   ]

Что было сделано для того, чтобы это получилось?