Задание 2: Ключевые параметры аудита и их включение
Эффективная настройка аудита в Pangolin достигается за счет управления рядом ключевых параметров pgAudit в конфигурационном файле postgresql.conf. Ниже представлены наиболее важные из них:
| Параметр | Описание | Тип | Значение по умолчанию | Примечание |
|---|---|---|---|---|
pgaudit.log | Указывает, какие классы операторов, событий, функций и команд будут регистрироваться. Можно включить несколько классов (через запятую) или исключить (знак «-») | string | none | Для применения измененного значения необходимо перечитать конфигурацию |
pgaudit.legal | Включение/отключение расширенных возможностей аудита (запись логов аудита в отдельный файл, регистрация дополнительных событий аудита, использование нового формата событий аудита) | boolean | off | Для активации pgaudit.legal = on требуется перезапуск сервера |
pgaudit.log_client | Указывает, должен ли журнал аудита включать записи, включающие сообщения NOTICE и WARNING | boolean | off | |
pgaudit.log_level | Устанавливает уровень ведения журнала для сообщений аудита. Используется только, если pgaudit.log_client включен | string | log | |
pgaudit.log_parameter | Указывает, должны ли параметры, переданные с оператором, включаться в журнал аудита (в формате CSV после текста оператора) | boolean | off | При masking_mode=full на сервере все значения будут замаскированы |
pgaudit.log_relation | Указывает, должна ли запись аудита сессии создавать отдельную запись журнала для каждого отношения (TABLE, VIEW и т.д.), на которое ссылается оператор SELECT или DML. Полезно для исчерпывающего ведения журнала без журнала аудита объектов | boolean | off | |
pgaudit.log_rows | Указывает, должно ли количество строк, извлеченных или затронутых оператором, включаться в журнал аудита (после поля параметра, если pgaudit.log_parameter = on ) | boolean | off | |
pgaudit.log_statement | Указывает, будет ли текст запроса и параметры (если разрешено) включаться в журнал аудита. Отключение делает журналы менее подробными | boolean | on | |
pgaudit.log_statement_once | Указывает, будут ли текст и параметры оператора прикрепляться к первой записи в журнале для комбинации оператора и вложенных операторов или к каждой записи. Отключение приводит к менее подробному ведению журнала | boolean | off | |
pgaudit.role | Указывает главную роль, используемую для ведения журнала аудита объектов. Позволяет нескольким группам отвечать за различные аспекты ведения журнала аудита | string | Отсутствует | |
pgaudit.log_directory | Директория для хранения логов аудита, если pgaudit.legal включен | string | audit (относительно $PGDATA) | Изменение требует перезагрузки конфигурации |
pgaudit.log_filename | Имя файла лога аудита | string | audit-%Y-%m-%d_%H%M%S.log | Изменение требует перезагрузки конфигурации |
pgaudit.log_rotation_size | Размер файла (в килобайтах), при превышении которого произойдет ротация лога аудита | integer | 10240 (10MB) | Изменение требует перезагрузки конфигурации |
pgaudit.log_rotation_age | Интервал времени (в минутах), по истечении которого произойдет ротация лога аудита | integer | 1d (1 день) | Изменение требует перезагрузки конфигурации |
Журнал pgaudit может достигать очень больших размеров. Необходимо максимально точно определять, что именно должно быть записано, чтобы избежать чрезмерного количества записей.
Упражнение 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... -
Запустите
psqlи проверьте, что регистрирует аудит, для этого запросите значение параметраpgaudit.log:postgres@postgres=# SHOW pgaudit.log;┌─────────────┐│ pgaudit.log │├─────────────┤│ none │└─────────────┘(1 row)Мы не изменяли значение параметра по умолчанию, поэтому аудит отключен.
-
Изучите полный список параметров аудита:
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 требует прав суперпользователя. Это критически важно, поскольку предоставление обычным пользователям возможности изменять настройки аудита может привести к компрометации его целостности.
Не забудьте отключить парольные политики после предыдущего модуля, иначе будет невозможно создать простые пароли в рамках данного урока.
-
Включите расширенный аудит, для этого в конфигурационном файле
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 - запрещаем просмотр файла всем подряд - только суперпользователь может это делать -
Перезапустите сервер и запустите
psql:[student@ServerName ~]$ sudo systemctl restart postgresql[postgres@ServerName ~]$ psqlPager is used for long output.Border style is 2.Line style is unicode.psql (15.5)Type "help" for help. -
Проверьте параметр
pgaudit.log:postgres@postgres=# SHOW pgaudit.log;┌─────────────┐│ pgaudit.log │├─────────────┤│ read, write │└─────────────┘(1 row) -
Создайте пользователей и таблицы:
postgres@postgres=# CREATE ROLE student1 password '12345';CREATE ROLEpostgres@postgres=# ALTER ROLE student1 LOGIN;ALTER ROLEpostgres@postgres=# CREATE ROLE student2 password '12345';CREATE ROLEpostgres@postgres=# ALTER ROLE student2 LOGIN;ALTER ROLEpostgres@postgres=# CREATE TABLE test1 (p integer);CREATE TABLEpostgres@postgres=# GRANT ALL PRIVILEGES ON SCHEMA PUBLIC TO student1,student2;GRANTpostgres@postgres=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA PUBLIC TO student1,student2;GRANTА что там по правам?..
-
Из-под пользователя
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(только он сможет удалить таблицу). -
Чтобы узнать, какими привилегиями (правами) обладают созданные пользователи, выполните:
postgres@postgres=# \dpAccess 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.
-
-
Подключитесь к базе ролью
student1и вставьте в таблицуtest1одну строку:postgres@postgres=# \c - student1You are now connected to database "postgres" as user "student1".student1@postgres=# INSERT INTO public.test1 values(1);INSERT 0 1 -
Подключитесь к базе ролью
student2и прочитайте таблицуtest1:student1@postgres=# \c - student2You are now connected to database "postgres" as user "student2".student2@postgres=# SELECT * FROM public.test1;┌───┐│ p │├───┤│ 1 │└───┘(1 row) -
Обратитесь к журналу аудита и ознакомьтесь с записями:
[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: Включение аудита для конкретного пользователя
-
Для включения аудита действий конкретных пользователей отключите общее значение параметра в
postgresql.conf:pgaudit.log = 'none' -
Чтобы аудит выводил имя пользователя от логируемого события измените конфигурационный параметр
log_line_prefix:log_line_prefix = '%m %c %a %u %d %r %p' -
Перезагрузите сервер для применения новых значений параметров:
[postgres@ServerName ~]$ exit[student@ServerName ~]$ sudo systemctl restart postgresql -
Установите для пользователя
student1регистрируемый класс событийREAD:[student@ServerName ~]$ sudo su - postgres[postgres@ServerName ~]$ psqlpostgres@postgres=# ALTER ROLE student1 SET pgaudit.log = 'READ';ALTER ROLE -
Установим для пользователя
student2регистрируемый класс событийWRITE:postgres@postgres=# ALTER ROLE student2 SET pgaudit.log = 'WRITE';ALTER ROLE -
Из-под пользователя
student1выполните последовательно операцииSELECTиINSERT:postgres@postgres=# \c - student1You 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 -
Аналогично выполните последовательно операции
SELECTиINSERTиз-под пользователяstudent2:student1@postgres=# \c - student2You 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 -
Отследите, что в системном журнале регистрируются операции
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 postgresPassword 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, влияющих на детализацию логирования событий