Аудит действий пользователей и DDL команд в PostgreSQL через pgaudit
- Отсутствие прозрачного журнала действий привилегированных пользователей и администраторов БД.
- Необходимость соответствия требованиям стандартов безопасности (PCI-DSS, GDPR, ISO 27001, ФСТЭК).
- Стандартный параметр
log_statement = 'all'генерирует огромный неструктурированный объем мусорных логов.
1. Установка расширения pgAudit
# Для Debian / Ubuntu (PostgreSQL 15)
apt-get install -y postgresql-15-pgaudit
# Для RHEL / Rocky Linux
dnf install -y pgaudit152. Конфигурация в postgresql.conf
# Добавление библиотеки при старте сервера
shared_preload_libraries = 'pgaudit'
# Классы логируемых операций (READ, WRITE, FUNCTION, ROLE, DDL, MISC)
pgaudit.log = 'ddl, role, write, misc'
# Логировать параметры запросов (подставленные значения)
pgaudit.log_parameter = on
# Разделять аудит по уровням важности
pgaudit.log_level = 'log'
pgaudit.log_catalog = off
pgaudit.log_relation = on3. Активация расширения в базе данных
Перезапустите PostgreSQL и выполните в целевой базе:
systemctl restart postgresql
psql -d mydb -c "CREATE EXTENSION pgaudit;"4. Настройка аудита конкретной роли
Для исключения служебных мониторинговых учетных записей из аудита:
CREATE ROLE auditor_role;
GRANT auditor_role TO sensitive_user;
ALTER ROLE sensitive_user SET pgaudit.log = 'all';5. Проверка формата записей аудита в логах
tail -f /var/log/postgresql/postgresql-15-main.log | grep "AUDIT:"Вывод содержит структурированные поля: AUDIT: SESSION,1,1,DDL,CREATE TABLE,TABLE,public.accounts,...
Частые вопросы (FAQ)
Чем pgaudit отличается от стандартного параметра log_statement = 'ddl'?
pgaudit обеспечивает детальный структурный разбор объектов (тип схемы, имя таблицы, затронутые колонки), логирует вложенные вызовы внутри хранимых процедур и позволяет настраивать избирательный аудит конкретных ролей.
Почему стоит выставлять pgaudit.log_catalog = off?
Значение 'off' отключает логирование обращений к системному каталогу PostgreSQL (pg_class, pg_namespace), предотвращая засорение журнала тысячами внутренних системных запросов.