Аудит действий пользователей в PostgreSQL с расширением pgaudit: Настройка
- Требования регуляторов и ИБ по детальному логированию операций доступа к персональным данным (ФЗ-152, PCI-DSS).
- Невозможность определить, кто именно удалил или модифицировал критические системные таблицы.
- Стандартный параметр
log_statement = 'all'генерирует неструктурированный шум и забивает дисковые массивы.
1. Установка пакета pgaudit
# Debian/Ubuntu
apt-get install -y postgresql-16-pgaudit
# RHEL/Rocky Linux
dnf install -y pgaudit162. Конфигурация в postgresql.conf
Добавьте pgaudit в предзагружаемые библиотеки:
shared_preload_libraries = 'pgaudit'
# Классы логируемых событий (READ, WRITE, FUNCTION, ROLE, DDL, MISC)
pgaudit.log = 'ddl, role, write'
# Логировать параметры параметризованных запросов
pgaudit.log_parameter = on
# Раздельное логирование команд внутри сессии
pgaudit.log_relation = on
# Логирование системных служебных запросов (отключено для снижения шума)
pgaudit.log_catalog = offПерезапустите СУБД:
systemctl restart postgresql3. Активация расширения в целевой БД
CREATE EXTENSION pgaudit;4. Точечный аудит доступа к конфиденциальной таблице (Object Auditing)
Создайте выделенную роль для селективного аудита чтения таблицы зарплат:
CREATE ROLE auditor_role NOINHERIT;
GRANT SELECT ON confidential_payroll TO auditor_role;
-- Включение аудита только для объектов, к которым имеет доступ auditor_role
SET pgaudit.role = 'auditor_role'; Частые вопросы (FAQ)
Чем pgaudit лучше стандартного параметра log_statement = all?
pgaudit формирует структурированные записи логов с разделением на классы операций, позволяет разделять аудит DDL, чтение и запись, а также поддерживает объектный аудит отдельных таблиц.
Логирует ли pgaudit пароли при выполнении CREATE/ALTER USER?
Нет. pgaudit автоматически маскирует пароли в теле запросов (заменяет на <unlogged>), предотвращая утечку секретов в файлы логов.
Как собирать логи pgaudit в централизованные SIEM/ELK системы?
Записи pgaudit имеют фиксированный тег AUDIT: SESSION,... в системном выводе syslog/journald, что позволяет легко фильтровать их с помощью Filebeat, Vector или Rsyslog.
Можно ли включить логирование SELECT только для определенных пользователей?
Да, через механизм pgaudit.role: аудит чтения сработает только тогда, когда пользователь обращается к таблице, права на которую выданы роли аудитора.