数据库审计,指的是将用户对数据库的所有操作写入审计日志中,使得数据库安全管理员可以利用这些日志信息,找出非法操作的用户,时间和内容等。
如何使用数据库审计,这里以审计事务功能为例:
1. 设置审计配置项
要使数据库能够审计到某项功能,需要打开审计的总开关(audit_operation_exec)和对应的审计项开关(audit_operation_exec),二者均支持动态加载,在数据库运行期间修改该配置项的值会立即生效,无需重启数据库。
- 首先打开审计总开关audit_enabled(默认开启)。登录数据库,检查audit_enabled状态
若为off ,则使用如下命令打开postgres=# show audit_enabled; audit_enabled --------------- off (1 row)
gs_guc reload -Z coordinator -Z datanode -N all -I all -c "audit_enabled=on"
- 然后打开具体审计事务配置项
gs_guc reload -Z coordinator -Z datanode -N all -I all -c "audit_operation_exec='transaction'"
postgres=# show audit_operation_exec; audit_operation_exec ---------------------- transaction (1 row)
audit_operation_exec 默认的配置项有login, logout, database_process, user_lock, grant_revoke, set,如果想增加审计配置项,进行追加配置即可,目前支持的配置项有all,login,logout,database_process,user_lock,grant_revoke,ddl,select,copy,userfunc,set,transaction,vacuum,analyze,explain,specialfunc,insert,insert_filter,update,delete,merge,show,checkpoint,barrier,cluster,comment,cleanconn,prepare,constraints,cursor。有两点需要注意,其一如果审计ddl操作,需要另外配置audit_system_object 来审计具体某个对象的ddl 操作;其二如果是审计事务,事务内部的操作是否审计需要结合其具体的配置项是否配置。
2. 查看审计日志。
审计查询命令是pg_query_audit, 其使用方法为
pg_query_audit(timestamptz startime,timestamptz endtime,audit_log)
startime 和 endtime 分别表示审计记录的开始时间和结束时间,audit_log 表示所查看的审计日志新的所在的物理文件路径,当不指定audit_log 时,默认查看连接当前实例的审计日志信息。
通过查询pgxc_query_audit 可以查询所有CN节点的审计日志信息:
pgxc_query_audit(timestamptz startime,timestamptz endtime)
除了上面审计成功的场景之外,还可以通过配置audit_operation_error 来审计失败的操作记录。默认的配置项有login,目前支持的配置项有syn_success,parse,login,user_lock,violation,grant_revoke,ddl,select,copy,userfunc,set,transaction,vacuum,analyze,explain,specialfunc,insert,update,delete,merge,show,checkpoint,barrier,cluster,comment,cleanconn,prepare,constraints,cursor,blacklist。当配置了该参数之后,其对应的失败操作也会被记录到审计日志当中,如下例
postgres=# create table t1(id int);
ERROR: relation "t1" already exists
postgres=#
postgres=# select * from pg_query_audit('2021-03-21','2021-03-30') order by endtime desc limit 1;
-[ RECORD 1 ]---+--------------------------------
begintime | 2021-03-21 11:49:41.643+08
endtime | 2021-03-21 11:49:41.652+08
operation_type | ddl
audit_type | ddl_table
result | failed
username | perfadm
database | postgres
client_conninfo | gsql@[local]
object_name | t1
command_text | create table t1(id int);
detail_info | relation "t1" already exists
transaction_xid | 0
query_id | 1062177
node_name | cn_5001
thread_id | 139916885260032@669613657906735
local_port | 6000
remote_port |