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

Задание 2: Ключевые параметры аудита и их включение

Эффективная настройка аудита в Pangolin достигается за счет управления рядом ключевых параметров pgAudit в конфигурационном файле postgresql.conf. Ниже представлены наиболее важные из них:

ПараметрОписаниеТипЗначение по умолчаниюПримечание
pgaudit.logУказывает, какие классы операторов, событий, функций и команд будут регистрироваться. Можно включить несколько классов (через запятую) или исключить (знак «-»)stringnoneДля применения измененного значения необходимо перечитать конфигурацию
pgaudit.legalВключение/отключение расширенных возможностей аудита (запись логов аудита в отдельный файл, регистрация дополнительных событий аудита, использование нового формата событий аудита)booleanoffДля активации pgaudit.legal = on требуется перезапуск сервера
pgaudit.log_clientУказывает, должен ли журнал аудита включать записи, включающие сообщения NOTICE и WARNINGbooleanoff
pgaudit.log_levelУстанавливает уровень ведения журнала для сообщений аудита. Используется только, если pgaudit.log_client включенstringlog
pgaudit.log_parameterУказывает, должны ли параметры, переданные с оператором, включаться в журнал аудита (в формате CSV после текста оператора)booleanoffПри masking_mode=full на сервере все значения будут замаскированы
pgaudit.log_relationУказывает, должна ли запись аудита сессии создавать отдельную запись журнала для каждого отношения (TABLE, VIEW и т.д.), на которое ссылается оператор SELECT или DML. Полезно для исчерпывающего ведения журнала без журнала аудита объектовbooleanoff
pgaudit.log_rowsУказывает, должно ли количество строк, извлеченных или затронутых оператором, включаться в журнал аудита (после поля параметра, если pgaudit.log_parameter = on )booleanoff
pgaudit.log_statementУказывает, будет ли текст запроса и параметры (если разрешено) включаться в журнал аудита. Отключение делает журналы менее подробнымиbooleanon
pgaudit.log_statement_onceУказывает, будут ли текст и параметры оператора прикрепляться к первой записи в журнале для комбинации оператора и вложенных операторов или к каждой записи. Отключение приводит к менее подробному ведению журналаbooleanoff
pgaudit.roleУказывает главную роль, используемую для ведения журнала аудита объектов. Позволяет нескольким группам отвечать за различные аспекты ведения журнала аудитаstringОтсутствует
pgaudit.log_directoryДиректория для хранения логов аудита, если pgaudit.legal включенstringaudit (относительно $PGDATA)Изменение требует перезагрузки конфигурации
pgaudit.log_filenameИмя файла лога аудитаstringaudit-%Y-%m-%d_%H%M%S.logИзменение требует перезагрузки конфигурации
pgaudit.log_rotation_sizeРазмер файла (в килобайтах), при превышении которого произойдет ротация лога аудитаinteger10240 (10MB)Изменение требует перезагрузки конфигурации
pgaudit.log_rotation_ageИнтервал времени (в минутах), по истечении которого произойдет ротация лога аудитаinteger1d (1 день)Изменение требует перезагрузки конфигурации
Внимание!

Журнал pgaudit может достигать очень больших размеров. Необходимо максимально точно определять, что именно должно быть записано, чтобы избежать чрезмерного количества записей.

Упражнение 1: Параметры аудита по умолчанию​

  1. По умолчанию аудит включен, но ничего не регистрирует (pgaudit.log = 'none') (перед каждым параметром аудита в конфигурационном файле стоит знак комментирования #). Ознакомьтесь с настраиваемыми параметрами аудита, которые можно раскомментировать и перенастроить:

    [postgres@ServerName ~]$ cat $PGDATA/postgresql.conf | grep 'pgaudit.'
    #pgaudit.legal = off # Enable auditlogger subprocess, new audit log format
    #pgaudit.log_syslog = off # Should auditlogger write audit log to syslog?
    #pgaudit.log_directory = audit # Directory for audit files.
    #pgaudit.log_filename = 'audit-%Y-%m-%d_%H%M%S.log' # Audit file name pattern.
    #pgaudit.log_rotation_size = 10MB # Automatic rotation of audit files
    #pgaudit.log_rotation_age = '1d' # Automatic rotation of audit files
    #pgaudit.log_file_mode = 0600 # Creation mode for log files,
    #pgaudit.log_truncate_on_rotation = off # If on, an existing log file with the
    #pgaudit.log_recovery = off # If off, auditlogger will be terminated if there is
    ...
  2. Запустите psql и проверьте, что регистрирует аудит, для этого запросите значение параметра pgaudit.log:

    postgres@postgres=# SHOW pgaudit.log;
    ┌─────────────┐
    │ pgaudit.log │
    ├─────────────┤
    │ none │
    └─────────────┘
    (1 row)

    Мы не изменяли значение параметра по умолчанию, поэтому аудит отключен.

  3. Изучите полный список параметров аудита:

    postgres@postgres=# SELECT name,setting FROM pg_settings WHERE name LIKE 'pgaudit.%';
    ┌──────────────────────────────────┬───────────────────────────┐
    │ name │ setting │
    ├──────────────────────────────────┼───────────────────────────┤
    │ pgaudit.legal │ off │
    │ pgaudit.log │ none │
    │ pgaudit.log_catalog │ on │
    │ pgaudit.log_client │ off │
    │ pgaudit.log_directory │ audit │
    │ pgaudit.log_file_mode │ 0600 │
    │ pgaudit.log_filename │ audit-%Y-%m-%d_%H%M%S.log │
    │ pgaudit.log_level │ log │
    │ pgaudit.log_parameter │ off │
    │ pgaudit.log_recovery │ off │
    │ pgaudit.log_relation │ off │
    │ pgaudit.log_rotation_age │ 1440 │
    │ pgaudit.log_rotation_size │ 10240 │
    │ pgaudit.log_rows │ off │
    │ pgaudit.log_statement │ on │
    │ pgaudit.log_statement_once │ off │
    │ pgaudit.log_syslog │ off │
    │ pgaudit.log_truncate_on_rotation │ off │
    │ pgaudit.role │ │
    └──────────────────────────────────┴───────────────────────────┘
    (19 rows)

Упражнение 2: Включаем аудит​

Управление аудитом в Pangolin требует прав суперпользователя. Это критически важно, поскольку предоставление обычным пользователям возможности изменять настройки аудита может привести к компрометации его целостности.

Примечание

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

  1. Включите расширенный аудит, для этого в конфигурационном файле postgresql.conf раскомментируйте и отредактируйте параметры:

    pgaudit.log = 'read, write' - все операции SELECT, INSERT, UPDATE, DELETE будут логироваться сервером
    pgaudit.legal = on - включаем расширенный аудит
    pgaudit.log_syslog = off - запрещаем писать сообщения от аудита в системный журнал
    pgaudit.log_directory = audit - все сообщения от аудита пишем в отдельный файл для аудита
    pgaudit.log_filename = 'audit-%Y-%m-%d_%H%M%S.log' - формат файла аудита
    pgaudit.log_rotation_size = 10MB - размер файла для ротации
    pgaudit.log_rotation_age = '1d' - принудительная ротация
    pgaudit.log_file_mode = 0600 - запрещаем просмотр файла всем подряд - только суперпользователь может это делать
  2. Перезапустите сервер и запустите psql:

    [student@ServerName ~]$ sudo systemctl restart postgresql
    [postgres@ServerName ~]$ psql
    Pager is used for long output.
    Border style is 2.
    Line style is unicode.
    psql (15.5)
    Type "help" for help.
  3. Проверьте параметр pgaudit.log:

    postgres@postgres=# SHOW pgaudit.log;
    ┌─────────────┐
    │ pgaudit.log │
    ├─────────────┤
    │ read, write │
    └─────────────┘
    (1 row)
  4. Создайте пользователей и таблицы:

    postgres@postgres=# CREATE ROLE student1 password '12345';
    CREATE ROLE
    postgres@postgres=# ALTER ROLE student1 LOGIN;
    ALTER ROLE
    postgres@postgres=# CREATE ROLE student2 password '12345';
    CREATE ROLE
    postgres@postgres=# ALTER ROLE student2 LOGIN;
    ALTER ROLE
    postgres@postgres=# CREATE TABLE test1 (p integer);
    CREATE TABLE
    postgres@postgres=# GRANT ALL PRIVILEGES ON SCHEMA PUBLIC TO student1,student2;
    GRANT
    postgres@postgres=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA PUBLIC TO student1,student2;
    GRANT
    А что там по правам?..

    1. Из-под пользователя postgres выполните команду для получения информации о владельце таблиц:

      postgres@postgres=# \dt+
      List of relations
      ┌────────┬───────┬───────┬──────────┬─────────────┬───────────────┬─────────┬─────────────┐
      │ Schema │ Name │ Type │ Owner │ Persistence │ Access method │ Size │ Description │
      ├────────┼───────┼───────┼──────────┼─────────────┼───────────────┼─────────┼─────────────┤
      │ public │ test1 │ table │ postgres │ permanent │ heap │ 0 bytes │ │
      └────────┴───────┴───────┴──────────┴─────────────┴───────────────┴─────────┴─────────────┘
      (1 row)

      Видим, что таблицей test1 владеет postgres (только он сможет удалить таблицу).

    2. Чтобы узнать, какими привилегиями (правами) обладают созданные пользователи, выполните:

      postgres@postgres=# \dp
      Access privileges
      ┌────────┬───────┬───────┬───────────────────────────┬───────────────────┬──────────┐
      │ Schema │ Name │ Type │ Access privileges │ Column privileges │ Policies │
      ├────────┼───────┼───────┼───────────────────────────┼───────────────────┼──────────┤
      │ public │ test1 │ table │ postgres=arwdDxt/postgres↵│ │ │
      │ │ │ │ student1=arwdDxt/postgres↵│ │ │
      │ │ │ │ student2=arwdDxt/postgres │ │ │
      └────────┴───────┴───────┴───────────────────────────┴───────────────────┴──────────┘
      (1 row)

      В данном случае пользователи student1 и student2 обладают полными привилегиями (правами), что отражено в столбце Access privileges.

  5. Подключитесь к базе ролью student1 и вставьте в таблицу test1 одну строку:

    postgres@postgres=# \c - student1
    You are now connected to database "postgres" as user "student1".
    student1@postgres=# INSERT INTO public.test1 values(1);
    INSERT 0 1
  6. Подключитесь к базе ролью student2 и прочитайте таблицу test1:

    student1@postgres=# \c - student2
    You are now connected to database "postgres" as user "student2".
    student2@postgres=# SELECT * FROM public.test1;
    ┌───┐
    │ p │
    ├───┤
    │ 1 │
    └───┘
    (1 row)
  7. Обратитесь к журналу аудита и ознакомьтесь с записями:

    [postgres@ServerName]$ cd $PGDATA/audit
    [postgres@ServerName audit]$ less audit-2025-08-21_141534.log
    ...
    2025-08-21 10:04:48.540 MSK [1561] LOG: AUDIT: SESSION,2,1,WRITE,INSERT,,,INSERT INTO test1 values(1);,<not logged>
    2025-08-21 10:05:10.733 MSK [1566] LOG: AUDIT: SESSION,2,1,READ,SELECT,,,SELECT * FROM test1;,<not logged>
    ...

Упражнение 3: Включение аудита для конкретного пользователя​

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

    pgaudit.log = 'none'
  2. Чтобы аудит выводил имя пользователя от логируемого события измените конфигурационный параметр log_line_prefix:

    log_line_prefix = '%m %c %a %u %d %r %p'
  3. Перезагрузите сервер для применения новых значений параметров:

    [postgres@ServerName ~]$ exit
    [student@ServerName ~]$ sudo systemctl restart postgresql
  4. Установите для пользователя student1 регистрируемый класс событий READ:

    [student@ServerName ~]$ sudo su - postgres
    [postgres@ServerName ~]$ psql
    postgres@postgres=# ALTER ROLE student1 SET pgaudit.log = 'READ';
    ALTER ROLE
  5. Установим для пользователя student2 регистрируемый класс событий WRITE:

    postgres@postgres=# ALTER ROLE student2 SET pgaudit.log = 'WRITE';
    ALTER ROLE
  6. Из-под пользователя student1 выполните последовательно операции SELECT и INSERT:

    postgres@postgres=# \c - student1
    You are now connected to database "postgres" as user "student1".
    student1@postgres=# SELECT * FROM public.test1;
    ┌───┐
    │ p │
    ├───┤
    │ 1 │
    └───┘
    (1 row)
    student1@postgres=# INSERT INTO public.test1 values(2);
    INSERT 0 1
  7. Аналогично выполните последовательно операции SELECT и INSERT из-под пользователя student2:

    student1@postgres=# \c - student2
    You are now connected to database "postgres" as user "student2".
    student2@postgres=# SELECT * FROM public.test1;
    ┌───┐
    │ p │
    ├───┤
    │ 1 │
    │ 2 │
    └───┘
    (2 rows)
    student2@postgres=# INSERT INTO public.test1 values(3);
    INSERT 0 1
  8. Отследите, что в системном журнале регистрируются операции SELECT только от пользователя student1 и операции INSERT только от пользователя student2:

    [postgres@ServerName audit]$ less audit-2025-08-21_141535.log
    ...
    2025-08-21 14:49:23.579 MSK 68a707bd.c0f psql student1 postgres [local] 3087LOG: AUDIT: SESSION,2,1,READ,SELECT,,,SELECT * FROM test1;,<not logged>
    2025-08-21 14:49:45.467 MSK 68a707d0.c15 psql student2 postgres [local] 3093LOG: AUDIT: SESSION,1,1,WRITE,INSERT,,,INSERT INTO test1 values(3);,<not logged>
    ...
    Не проходите мимо!

    Обратите внимание, что событие FAILED регистрируется всегда, независимо от значения pgaudit.log.

    Рассмотрим пример ввода неверного пароля:

    [postgres@ServerName ~]$ psql -h ServerName -U student1 -d postgres
    Password for user student1:
    psql: error: connection to server at "ServerName" (192.168.1.160), port 5432 failed: FATAL: password authentication failed for user "student1"

    Получен отказ в доступе. Обратимся к системному журналу:

    [postgres@ServerName audit]$ less audit-2025-08-21_141535.log
    ...
    2025-08-21 17:17:38.181 MSK 68a72a82.f0d [unknown] student1 postgres 192.168.1.160(36962) 3853LOG: AUDIT: SESSION, CONNECTION, FAILED,database = postgres,user = student1

    Подробности можно увидеть в логах postgres:

    2025-08-21 17:17:38.189 MSK 68a72a82.f0d [unknown] student1 postgres 192.168.1.160(36962) 3853FATAL: password authentication failed for user "student1"
    2025-08-21 17:17:38.189 MSK 69fc4471.701c [unknown] student1 postgres 172.29.53.36(40436) 28700DETAIL: Connection matched pg_hba.conf line 91: "host all all 0.0.0.0/0 scram-sha-256"
    ...

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

Вопрос 1

Какой параметр отвечает за включение расширенных возможностей аудита в Pangolin, и какое действие необходимо выполнить, чтобы изменения вступили в силу?

Вопрос 2

Как можно полностью отключить аудит событий в Pangolin с помощью параметра pgaudit.log?

Вопрос 3

Перечислите три ключевых конфигурационных параметра pgaudit, влияющих на детализацию логирования событий