审计
日志审计
开启标准日志审计
修改配置文件 $PGDATA/postgresql.conf,配置开启标准日志文件
logging_collector --是否开启日志收集开关,默认off,推荐on
log_destination --日志记录类型,默认是stderr,只记录错误输出,推荐csvlog,总共包含:stderr, csvlog, syslog, and eventlog,
log_directory --日志路径,默认是$PGDATA/pg_log,
log_filename --日志名称,默认是postgresql-%Y-%m-%d_%H%M%S.log
log_file_mode --日志文件类型,默认为0600
log_truncate_on_rotation --默认为off,设置为on的话,文件内容覆盖方式:off后面附加,on:清空再加
log_rotation_age --保留单个文件的最大时长,默认是1d,也有1h,1min,1s
log_rotation_size --保留单个文件的最大尺寸,默认是10MB
log_error_verbosity --默认为default,verbose表示冗长的
log_connections --用户session登陆时是否写入日志,默认off,推荐为on
log_disconnections --用户session退出时是否写入日志,默认off,推荐为on
log_statement --记录用户登陆数据库后的各种操作
- none,即不记录
- ddl(记录create,drop和alter)
- mod(记录ddl+insert,delete,update和truncate)
- all(mod+select)
log_min_duration_statement = 2s --记录超过2秒的SQL
log_checkpoints = on
log_lock_waits = on
deadlock_timeout = 1s
pgaudit 插件实现
使用 log_statement=all 提供基本语句日志记录,但细粒度不够精细。pgaudit 提供详细的会话和/或对象审计日志功能。
对应版本关系
插件下载和安装
https://github.com/pgaudit/pgaudit
git clone https://github.com/pgaudit/pgaudit.git
cd pgaudit
make install USE_PGXS=1 PG_CONFIG=/usr/pgsql-13/bin/pg_config
配置
vi $PGDATA/postgresql.conf
shared_preload_libraries= 'pgaudit'
psql
select * from pg_available_extensions where name like '%audit%';
CREATE EXTENSION pgaudit;
pgaudit配置参数
select name,setting from pg_settings where name like 'pgaudit%';
pgaudit.log
可能的值是:
- READ: SELECT and COPY when the source is a relation or a query.
- WRITE: INSERT, UPDATE, DELETE, TRUNCATE, and COPY when the destination is a relation.
- FUNCTION: Function calls and DO blocks.
- ROLE: Statements related to roles and privileges: GRANT, REVOKE, CREATE/ALTER/DROP ROLE.
- DDL: All DDL that is not included in the ROLE class.
- MISC: Miscellaneous commands, e.g. DISCARD, FETCH, CHECKPOINT, VACUUM.
可以使用逗号分隔的列表来提供多个类,并且类可以通过使用一种来减少类来减少。
默认值为none。
pgaudit.log_catalog
指定在语句中的所有关系都在pg_catalog中的情况下,应该启用会话日志记录。禁用此设置将减少日志中的噪音,例如psql和PgAdmin等工具,这些工具对目录进行了大量查询。 默认值on 。
pgaudit.log_level
指定用于日志条目的日志级别 (see Message Severity Levels for valid levels) ,但注意ERROR、FATAL和PANIC。此设置用于进行回归测试,也可能对最终用户用于测试或其他目的使用。 默认值为log。
pgaudit.log_parameter
指定审核日志记录应该包含与语句传递的参数。当参数出现时,在语句文本之后,将以CSV格式包含。 缺省值off。
pgaudit.log_relation
指定会话审核日志记录是否应该为SELECT或DML语句中引用的每个关系(表、视图等)创建单独的日志项。这是在不使用对象审核日志记录的情况下进行穷举日志记录的一种有用的捷径。 缺省值已关闭。
pgaudit.logstatementonce
指定日志记录是否包含语句、文本和参数,其中包含statement/substatement组合的第一个日志条目,或与每个条目一起。禁用此设置将导致更少的日志记录,但可能会使确定生成日志项的语句变得更困难,尽管statement/substatement对和进程id应该足以标识使用上一个条目记录的语句文本。 缺省值off。
pgaudit.role
指定要用于对象审核日志记录的主角色。可以通过将多个审计角色授予主角色来定义多个审计角色。这就允许多个组负责审计日志记录的不同方面。 没有默认值。
会话审计日志记录
会话审计日志记录提供了后端用户执行的所有语句的详细日志。
配置
使用pgaudit.log设置启用会话日志记录。 为所有DML和DDL启用会话日志记录,并记录DML语句中的所有关系:
set pgaudit.log = 'write, ddl';set pgaudit.log_relation = on; 为除MISC之外的所有命令启用会话日志记录,并将审核日志信息作为NOTICE提交:
set pgaudit.log = 'all, -misc';set pgaudit.log_level = notice;
对象审核日志
只有SELECT、INSERT、UPDATE和DELETE命令才会被支持。在对象审核日志记录中不包含TRUNCATE。
pgaudit.log = 'read, write'的一个更细粒度的替换。因此,将它们结合在一起可能是不明智的,但一个可能的场景是使用会话日志记录每个语句,然后用对象日志来补充有关特定关系的更多细节。
配置
对象级别的审计日志记录是通过角色系统实现的。pgaudit.role设置定义了用于审核日志记录的角色。当审计角色具有执行命令的权限或继承来自另一个角色的权限时,将对关系(表、视图等)进行审核。这使您能够有效地拥有多个审计角色,尽管在任何上下文中都有一个主角色。
将pgaudit.role设置为auditor,并grant在ACCOUNT表中的SELECT和DELETE权限。现在将记录帐户表中的任何SELECT或DELETE语句:
set pgaudit.role = 'auditor';grant select, delete
on public.account to auditor;
pgAudit Analyze 插件
PostgreSQL 审计日志分析器 (pgAudit Analyze) 从 PostgreSQL 日志中读取审计条目并将它们加载到数据库模式中以帮助分析和审计。