Bootstrap

PostgreSQL 审计怎么搞

PostgreSQL 的审计还是要借助PostgreSQL的扩展pgaudit 来进行。有些熟悉PG的同学可能说,不是可以log_statement = all 来记录所有的语句吗,干嘛那么麻烦,自己去查日志不就好了。实际上如果公司有审计部门的情况下,这样是过不了关的,需要一个与商业数据功能相差无几的方式来面对审计部门的“亲和力”。

安装很简单,如果熟悉extension的话,当然pgaudit需要加载链接库中

与大部分的audit 的方式不同pg_audit记录在标准的PostgreSQL日志中。Pgaudit通过在模块加载时注册自身并为executorStart、executorCheckPerms、processUtility和object_access提供挂钩来工作。因此,pgaudit与另一种audit-trigger不同支持读取(SELECT、COPY)。一般来说,使用pgaudit,我们可以有两种操作模式,或者将它们结合使用:

session 模式或object 模式。

其中可以进行监控的方式

  • READ (select, copy from)

  • WRITE (insert, update, delete, truncate, copy to)

  • FUNCTION (function calls and DO blocks)

  • ROLE (grant, revoke, create/alter/drop role)

  • DDL (all DDL except those in ROLE)

  • MISC (discard, fetch, checkpoint, vacuum)

从上面可以审计监控的东西来说,还是很全面的。

下面我们可以来做一个测试

我们创建一个表,而这个表应该被audit 日志来记录,我们看看audit 日志是否记录了。从下图可以看到

在日志中已经添加了audit 的记录。

说明这个东西还是蛮好用的。日志的格式

  • AUDIT_TYPE - 告知你目前的audit 的方式是 session 还是 object

  • STATEMENT_ID - 主语句的会话ID

  • SUBSTATEMENT_ID - 主语句中每个子语句的顺序ID。

  • Operation type 操作的方式是DDL DCL DML 

  • COMMAND -  操作的命令

  • OBJECT_TYPE - 操作的OBJECT 类型

  • OBJECT_NAME - 操作的OBJECT 类型的名字,例如表名,存储过程名等等

  • STATEMENT - 执行的语句

  • PARAMETER - 相关的参数

此时有人可能提出,这个设计的不好,为什么不能设计到插入到表中,个人觉得有两点,既然叫审计日志,1 他是提供审计的  2  他是日志 

如果日志在某些情况下爆发增长,怎么办,塞满整个表的存储空间,从多方面考虑,让日志存储在适当的地方,其实是一个比较规范的做法。

下面我们来做几个尝试来看看审计日志是否能帮助我们,记录相关的操作,下图是PG相关的audit 选项。

相关的一些设置设什么意思

pgaudit.log

指定会话审计日志记录哪些语句类。

可以设置的类别 read , write ,function,role ,ddl,misc , All 等

pgaudit.log_catalog

指定当一条语句中的所有关系都位于pg_catalog中时,应该启用会话日志记录。禁用此设置将减少来自psql和PgAdmin等工具的日志噪音,这些工具会大量查询目录。

pgaudit.log_relation

指定会话审计日志记录是否应该为SELECT或DML语句中引用的每个关系(表、视图等)创建单独的日志条目。对于不使用对象审计日志记录的穷举日志记录,这是一个非常有用的快捷方式。

例如我们要记录 ddl ,role , functiton,以及更改系统配置 方面的操作记录

当然,这样的操作记录也不是没有缺点的,例如我想知道是那个账户做的某件事,这点还是没有做到,仅仅是知道在什么时间做了什么。

;