Журналирование и аудит
Описание
Аудит предназначен для регистрации событий обращения к информационным ресурсам объектов и действий пользователей при работе с СУБД. Эти события могут быть вызваны сторонними приложениями, внутренними компонентами системы или непосредственно администраторами БД. Результаты аудита предназначены для снижения рисков безопасности, связанных с доступом субъектов к информационным ресурсам организации.
Для журналирования и аудита событий безопасности используется модифицированное расширение pgAudit
, интегрированное в ядро СУБД Pangolin. Оно обеспечивает детальное журналирование сессий и объектов для целей аудита. Расширение pgAudit
заменяет стандартное средство журналирования PostgreSQL.
СУБД Pangolin расширяет возможности аудита:
- отделением лога аудита от системного;
- добавлением нового системного процесса (аналог
syslogger
) для асинхронной записи событий аудита в файл; - изменением формата событий аудита для соответствия ГОСТ Р 59548-2022;
- добавлением новых событий аудита.
Запись о регистрации события представляет собой строку в журнале событий с тегом AUDIT
и содержит информацию о событии в виде последовательности полей.
В отдельные классы регистрируемых событий, для предоставления возможности гибкой настройки аудита, включаются следующие события:
CONNECTION
- подключения к серверу;PROTECTION
- использования функций настройки механизма защиты от привилегированных пользователей;RECOVERY
- восстановления базы данных;INTEGRITY
- нарушения целостности объектов контроля;ACTION
- запуска/остановки базы данных с причиной остановки;PARAMETER
- изменения конфигурации системы управления базами данных.
Полный список классов операторов, событий, функций и команд, которые можно регистрировать в события журнала аудита, указан в описании параметра pgaudit.log
Уровни важности событий аудита
Важность предопред елена для каждого события и не может быть изменена. Возможные типы важности:
Уровень важности | Признаки событий |
---|---|
Аварийный EMERGENCY | События полной блокировки пользовательского доступа пользователей к СУБД или отдельным БД. Например, скомпрометированы двоичные файлы ядра СУБД / в память СУБД загружен недоверенный код / перезаписана контролируемая функция |
Фатальный FATAL | События блокировки одиночного объекта или ограничения доступа к объекту. Например, превышено количество неуспешных попыток авторизации / пользователь заблокирован по параметру парольной политики |
Критический CRITICAL | События отказа в неавторизованном доступе. Например, отклонена попытка подключения с неверным паролем / суперпользователь попробовал без разрешения прочитать или изменить данные в объекте под защитой от действий пользователя |
Высокий HIGH | События изменения объектов защиты и прав на них (пользовательские УЗ и пароли, параметры политик, права на объекты, системные привилегии и др.), а также вызов команд для изменения БД, схем, отношений, кода, когда есть возможность задать / сменить владельца объекта, схему, права доступа. Добавление / изменение фильтров, умеющих просматривать параметры или результаты, менять поведение других команд. Например, ALTER USER (GROUP), CREATE DATABASE, CREATE EVENT TRIGGER.. |
Cредний MEDIUM | События получения разрешенных привилегий для их применения (SET - включение SET ROLE ). Прочие действия, разрешенные только суперпользователю (перезапуск сервера, снятие и восстановление резервной копии и др.), администратору безопасности (просмотр политики) или существующему владельцу объекта (настройка индексов, триггеров и т.п.). При условии, что действия не ведут к изменению объектов / прав / кода. Например, подключение / отключение сессии, вызов CREATE INDEX |
Низкий LOW | Нормальное, постоянное использование полученных привилегий: SELECT / INSERT / UPDATE / DELETE и прочие пользовательские действия |
Отладочный DEBUG | Внутренняя информация о деятельности механизмов защиты |
Уровни серьезности сообщений
В таблице приведены уровни серьезности сообщений, используемые PostgreSQL. Если вывод журнала отправляется в syslog
, уровни серьезности преобразуются, как показано в таблице.
Уровень серьезности | Описание | Уровень в syslog |
---|---|---|
DEBUG1 ... DEBUG5 | Предоставляет разработчикам последовательно более подробную информацию | DEBUG |
INFO | Предоставляет информацию, неявно запрошенную пользователем, например, вывод из VACUUM VERBOSE | INFO |
NOTICE | Предоставляет информацию, которая может быть полезна пользователям, например, уведомление об «усечении» длинных идентификаторов | NOTICE |
WARNING | Выдает предупреждения о возможных проблемах, например, COMMIT за пределами блока транзакции | NOTICE |
ERROR | Сообщает об ошибке, которая привела к прерыванию текущей команды | WARNING |
LOG | Сообщает информацию, представляющую интерес для администраторов | INFO |
FATAL | Сообщает об ошибке, которая привела к прерыванию текущего сеанса | ERR |
PANIC | Сообщает об ошибке, которая привела к прерыванию всех сеансов работы с базой данных | CRIT |
Формат
Выходные данные соответствуют формату CSV (разделитель запятая) только в том случае, если префикс ст роки журнала каждой записи удален.
По умолчанию записи аудита записываются в стандартное средство ведения журнала (регулируются параметрами лог-файла) и содержат столбцы в формате CSV.
LOG: AUDIT: <AUDIT_TYPE>,<STATEMENT ID>,<SUBSTATEMENT ID>,<CLASS>,<STATEMENT_TYPE>,<OBJECT_TYPE>,<OBJECT_NAME>,<COMMAND_TEXT>,<PARAMETER_LIST>,ERROR: <ERROR_MESSAGE>
-
AUDIT_TYPE
- тип, может быть: -
STATEMENT ID
- номер запроса; -
SUBSTATEMENT ID
- номер подзапроса; -
CLASS
- класс:DDL
,READ
,WRITE
и т.д. (задаются параметромpgaudit.log
); -
STATEMENT_TYPE
- тип запросаCREATE TABLE
,ALTER TABLE
,SELECT
,INSERT
,UPDATE
,DELETE
и т.д.; -
OBJECT_TYPE
- тип объекта, если есть (TABLE
,INDEX
,VIEW
и т.д.); -
OBJECT_NAME
- имя объекта, если есть (например,public.account
); -
COMMAND_TEXT
- текст команды (SQL-запрос); -
PARAMETER_LIST
- список параметров, если есть; -
ERROR_MESSAGE
- сообщение об ошибке, если есть.
Пример:
LOG: AUDIT: SESSION,1,1,READ,SELECT,,, SELECT * FROM ext.test_table;,<not logged>,ERROR: permission denied for table test_table
Префикс строки системного журнала
Для добавления любых других полей, необходимых для удовлетворения требований к системному журналу логов, используйте префикс строки (log_line_prefix
):
Спецсимвол | Назначение | Только для пользовательского процесса |
---|---|---|
%a | Имя приложения (application_name) | да |
%u | Имя пользователя | да |
%d | Имя базы данных | да |
%r | Имя удаленного узла или IP-адрес, а также номер порта | да |
%h | Имя удаленного узла или IP-адрес | да |
%p | Идентификатор процесса | нет |
%t | Штамп времени, без миллисекунд | нет |
%m | Штамп времени, с миллисекундами | нет |
%n | Штамп времени, с миллисекундами (в виде времени Unix) | нет |
%i | Тег команды: тип текущей команды в сессии | да |
%e | Код ошибки SQLSTATE | нет |
%c | Идентификатор сессии | нет |
%l | Номер строки журнала для каждой сессии или процесса. Начинается с 1 | нет |
%s | Штамп времени начала процесса | нет |
%v | Идентификатор виртуальной транзакции (backendID/localXID) | нет |
%x | Идентификатор транзакции (0 если не присвоен) | нет |
%q | Ничего не выводит. Непользовательские процессы останавливаются в этой точке. Игнорируется пользовательскими процессами | нет |
%% | Выводит % | нет |
Пример префикса строки журнала: "%m %u %d \[%p\]:
" - включить дату/время, имя пользователя, имя базы данных и идентификатор процесса для каждой записи журнала аудита.
В качестве идентификатора используется UUIDv4
(формируется случайным образом). Для получения идентификатора используется функция gen_random_uuid
. Формат идентификатора:
xxxxxxxxxxxxMxxxNxxxxxxxxxxxxxxx
Значени я на позициях M и N определяют соответственно версию и вариант UUID
Формат событий трассировки сессии
Для событий включения и выключения трассировки сессии записи в журнале имеют поля:
-
AUDIT_TYPE
- всегдаSESSION
; -
CLASS
- всегдаMISC
; -
STATEMENT_TYPE
- всегдаSET
; -
OBJECT_TYPE
- всегдаTRACING
; -
OBJECT_NAME
- пусто; -
COMMAND_TEXT
— зависит от события:- для события включения трассировки сессии сообщение вида:
\"<start,числовое_значение_уровня_логирования,имя_лог-файла>\"
. Словоstart
является константой; - для события выключения трассировки сессии содержит константу
stop
:\"<stop>\"
.
- для события включения трассировки сессии сообщение вида:
Пример:
LOG: AUDIT: SESSION,1,1,MISC,SET,TRACING,,\"<start,15,/pgdata/0{major_version}/data/tracing/trace1.log>\",<not logged>
LOG: AUDIT: SESSION,2,1,MISC,SET,TRACING,,\"<stop>\",<not logged>