概述
全量语句日志开销大且噪音多。pgaudit 允许按类别选择,例如 ddl、role、write,只记录模式变更、权限授予和数据修改,而不记录每条 SELECT。开启 pgaudit.log_relation 后,写操作会带上关系名,排查具体表的问题时更有用。
步骤
- 在
postgresql.conf中加载扩展并限定审计范围:
shared_preload_libraries = 'pgaudit'
pgaudit.log = 'ddl, role, write'
pgaudit.log_relation = on
log_line_prefix = '%m [%p] %u@%d '
logging_collector = on
- 重启 PostgreSQL 后,在需要审计的数据库中执行
CREATE EXTENSION IF NOT EXISTS pgaudit;。 - 使用 Vector 或 Fluent Bit 把日志文件写入开启版本控制或对象锁的桶:
[sources.pg]
type = "file"
include = ["/var/log/postgresql/*.log"]
[sinks.s3]
type = "aws_s3"
inputs = ["pg"]
bucket = "acme-audit-logs"
region = "us-east-1"
encoding.codec = "json"
compression = "gzip"
- 执行一次
CREATE ROLE auditor LOGIN;,再在日志中搜索AUDIT: SESSION。
验证
预期日志行包含语句、执行用户、数据库名和时间戳,并且一分钟内能在桶中按日期前缀找到对应对象。用用户名、语句关键字和时间范围各检索一次;若本地有日志而远端没有,说明采集器异常;若两边都没有,说明扩展未加载。
注意事项
- pgaudit 记录语句与关系名,不记录读取或修改的具体行。
- 本地管理员可能在采集前删除文件,应尽量实时传输并启用对象锁。
- 只审计必要类别,写密集表全量审计会显著增加日志量和 I/O。
- 每次 PostgreSQL 大版本升级后重跑本验证,预加载配置和扩展版本都会变化。