← 中文资源

简体中文版本

将数据库审计日志导出到对象存储

用 pgaudit 记录 DDL 与角色变更,通过日志采集器写入带对象锁的对象存储,形成可检索的合规审计链。

阅读英文原文

概述

全量语句日志开销大且噪音多。pgaudit 允许按类别选择,例如 ddl、role、write,只记录模式变更、权限授予和数据修改,而不记录每条 SELECT。开启 pgaudit.log_relation 后,写操作会带上关系名,排查具体表的问题时更有用。

步骤

  1. 在 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
  1. 重启 PostgreSQL 后,在需要审计的数据库中执行 CREATE EXTENSION IF NOT EXISTS pgaudit;。
  2. 使用 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"
  1. 执行一次 CREATE ROLE auditor LOGIN;,再在日志中搜索 AUDIT: SESSION。

验证

预期日志行包含语句、执行用户、数据库名和时间戳,并且一分钟内能在桶中按日期前缀找到对应对象。用用户名、语句关键字和时间范围各检索一次;若本地有日志而远端没有,说明采集器异常;若两边都没有,说明扩展未加载。

注意事项

  • pgaudit 记录语句与关系名,不记录读取或修改的具体行。
  • 本地管理员可能在采集前删除文件,应尽量实时传输并启用对象锁。
  • 只审计必要类别,写密集表全量审计会显著增加日志量和 I/O。
  • 每次 PostgreSQL 大版本升级后重跑本验证,预加载配置和扩展版本都会变化。