瀚高数据库安全版审计查询方法
文章目录
- 环境
- 文档用途
- 详细信息
环境
系统平台:N/A
版本:4.5.8
文档用途
本文档基于HGDB-see-4.5.8,适用于全平台。
文档用途:
-
如何导入审计日志
-
如何查询对应的审计记录
(不包含审计参数详解、以及如何配置对应审计策略等)
详细信息
一 审计的作用
1.1 开启审计有什么意义?
发现安全问题:可以有效发现未经授权的访问、数据泄露、数据篡改等安全问题。
辅助安全管理:数据库审计能够评估和优化安全策略,发现并修补访问权限等漏洞,监督员工的安全意识和行为,从而提高整体的安全水平。
合规性审计:许多行业监管机构要求企业按照相关的法规和标准对数据库进行审计。
追溯与审计追踪:记录和追踪数据库操作的历史记录对于审计数据的变更历史、完整性和解决纠纷具有重要意义。
防止数据进一步泄露:通过审计数据库,可以及时进行数据泄露事件的事后追查,保护敏感信息和客户数据。
1.2 日常使用场景
-
满足合规性要求,现场测试审计功能是否可用
-
数据遭到错误修改,需要排查修改原因或修改人员
-
数据遭到泄露,需要追查某一时间段访问该数据库的请求信息
1.3 本文档示例中的开启审计步骤
(注意:本文档不进行开启审计日志以及审计相关参数的解释)
- 开启审计
select set_audit_param('hg_audit','on');
2.重启数据库
pg_ctl restart
- 对数据库添加审计策略:
audit all by all;
二 审计日志的查询步骤
2.1 明确日期范围
实际情况中,一般会将审计日志保留几个月到几年不等,
-
假如需要查询审计记录的日期较为久远,则无法查询。
-
假如查询的时间跨度较大,需要导入的审计日志文件较多,则需要评估数据库读取审计占用的时间和硬盘空间等,假如条件允许,建议搭建相同版本测试环境,并将审计日志导入测试环境进行查询,避免影响主库性能。
2.2 明确审计对象
审计对象一般会细化到某张表,某种操作等,最常见的场景例如:追查谁删了某张表的数据、批量更新了某个字段等。常见于开发商和客户的要求。
有时也会根据实际情况追溯某个IP、客户端等对数据库做哪些操作等,但是此种情况较少,常见于安全部门在漏洞发现后对事态的弥补。
2.3 导入审计日志
hgaudit_imp -f hgaudit-2023-12-19-161119.log,hgaudit-2023-12-19-162003.log
请注意:
-
hgaudit_imp默认会查找$PGDATA/hgaudit目录下的文件,假如审计文件在其他位置,请使用绝对路径。
-
支持指定多个文件,多个文件用逗号分隔,假如不使用-f指定,会将当前$PGDATA/hgaudit下的所有审计记录都导入,包括未写完的审计记录。
-
导入审计文件会先truncate审计日志表再写入,所以假如发现审计日志导入不全,只能全量导入,无法增量。
-
假如我们担心查询审计日志影响到正常业务运行,可以临时在其他服务器上搭建相同版本的数据库环境,将审计日志传输过去后进行导入。这也是较推荐的方案。
2.4 审计日志表结构详解
审计日志表结构如下,我们需要根据实际情况来选择日志查询范围。
Column | Type | 描述 --------------------+--------------------------+-----------log_time | timestamp with time zone |日志记录时间risklevel | "char" |风险等级audittype | text |审计类型:包含system(系统审计事件),statement(语句审计事件),object(对象审计事件),mandatory(强制审计事件)oper_opts | text |审计语句的类型username | text |用户名rolename | text |角色名dbname | text |数据库名objtype | text |对象类型schemaname | text |模式名objectname | text |对象名colname | text |列名privlevel | text |权限等级:包含SYSTEM,DATABASE,SCHEMAOBJECT,INSTACEprocpid | integer |进程idsession_start_time | timestamp with time zone |会话开始时间action_start_time | timestamp with time zone |操作开始时间tansaction_id | integer |事务idclient_mac | text |客户端mac地址client_ip | text |客户端IPclient_port | text |客户端portapplication_name | text |客户端应用名server_mac | text |服务器macserver_ip | text |服务器IPserver_port | text |服务器端口command | text |执行的命令affect_rows | integer |命令影响的行数return_row | integer |命令返回的行数duration | double precision |命令持续时间result | text |命令执行结果(成功或失败)
由于操作类型:oper_opts 字段较为常用,且类型较多,特此说明该字段的所有取值,对于不同的操作可以按照如下清单来查询。
CREATE ROLECREATE DOMAINCREATE PROCEDURECREATE INDEXCREATE SCHEMACREATE SEQUENCECREATE TABLECREATE TABLE ASCREATE TRIGGERCREATE USERCREATE VIEWCREATE EXTENSIONCREATE DATABASEALTER ROLEALTER DOMAINALTER PROCEDUREALTER INDEXALTER SYSTEMALTER SCHEMAALTER SEQUENCEALTER TABLEALTER TRIGGERALTER USERALTER VIEWALTER EXTENSIONALTER DATABASEDROP DOMAINDROP PROCEDUREDROP ROLEDROP INDEXDROP SCHEMADROP SEQUENCEDROP TABLEDROP TRIGGERDROP USERDROP VIEWDROP DATABASEDROP EXTENSIONSELECTSELECT INTOINSERTUPDATEDELETEGRANTREVOKECOMMENTRESETSETTRUNCATECOPY TOCOPY FROMREINDEXLOCKCALL
2.5 常见审计查询场景
示例1:查询2024-02-19 12:00 - 2024-02-19 19:00 期间,清空了库db_test1中表public.t11的操作明细
select * from hg_t_audit_log where log_time > '2024-02-19 12:00:00' and log_time < '2024-02-19 19:00:00' and dbname = 'db_test1'and schemaname = 'public' and objectname = 't11' and oper_opts in ('DELETE','TRUNCATE');
示例2:查询2024-02-19 12:00 - 2024-02-19 19:00 期间,查找谁删除了库db_test1中表public.t11
select * from hg_t_audit_log where log_time > '2024-02-19 12:00:00' and log_time < '2024-02-19 19:00:00' and dbname = 'db_test1' --注意:删除对象时,不会记录对象的模式名和对象名,不能用对象名来查找对应表and oper_opts = 'DROP TABLE';
示例3:查询2024-02-21 08:00 - 2024-02-21 12:00,谁查询了表 public.t12
请注意:对于类似join表查询,只能记录到主表的表名,假如要查询的表是作为副表,那么只能对command列进行模糊查询,需要耗费的时空复杂度经常无法接受。
测试的SQL语句示例:
select t12.id,t11.name from t12left join t11 on t11.id = t12.id;
导入后查询:
select * from hg_t_audit_log where log_time > '2024-02-21 08:00:00' and log_time < '2024-02-21 12:00:00' and dbname = 'db_test1'and schemaname = 'public' and objectname = 't12' and oper_opts in ('SELECT');
2.6 其他提示
查询审计日志时,有时会发生无结果的情况,则将条件适当放开,特别是对象名、操作类型等,多试几次,实际应用系统运行的SQL并不像我们实验环境中那么简单和明确,检索审计日志需要耐心。