暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

瀚高数据库安全版审计查询方法

瀚高PG实验室 2025-07-30
324

文档用途

本文档基于HGDB-see-4.5.8,适用于全平台。

文档用途:

1. 如何导入审计日志

2. 如何查询对应的审计记录

(不包含审计参数详解、以及如何配置对应审计策略等)


详细信息

一、审计的作用

1.1 开启审计有什么意义?


发现安全问题:可以有效发现未经授权的访问、数据泄露、数据篡改等安全问题。

辅助安全管理:数据库审计能够评估和优化安全策略,发现并修补访问权限等漏洞,监督员工的安全意识和行为,从而提高整体的安全水平。

合规性审计:许多行业监管机构要求企业按照相关的法规和标准对数据库进行审计。

追溯与审计追踪:记录和追踪数据库操作的历史记录对于审计数据的变更历史、完整性和解决纠纷具有重要意义。

防止数据进一步泄露:通过审计数据库,可以及时进行数据泄露事件的事后追查,保护敏感信息和客户数据。



1.2 日常使用场景


1. 满足合规性要求,现场测试审计功能是否可用

2. 数据遭到错误修改,需要排查修改原因或修改人员

3. 数据遭到泄露,需要追查某一时间段访问该数据库的请求信息



1.3 本文档示例中的开启审计步骤


(注意:本文档不进行开启审计日志以及审计相关参数的解释)


1. 开启审计
    select set_audit_param('hg_audit','on');
    2.重启数据库
      pg_ctl restart
      3. 对数据库添加审计策略:
        audit all by all;

        二、审计日志的查询步骤

        2.1 明确日期范围


        实际情况中,一般会将审计日志保留几个月到几年不等,

        1. 假如需要查询审计记录的日期较为久远,则无法查询。

        2. 假如查询的时间跨度较大,需要导入的审计日志文件较多,则需要评估数据库读取审计占用的时间和硬盘空间等,假如条件允许,建议搭建相同版本测试环境,并将审计日志导入测试环境进行查询,避免影响主库性能。



        2.2 明确审计对象


        审计对象一般会细化到某张表,某种操作等,最常见的场景例如:追查谁删了某张表的数据、批量更新了某个字段等。常见于开发商和客户的要求。

        有时也会根据实际情况追溯某个IP、客户端等对数据库做哪些操作等,但是此种情况较少,常见于安全部门在漏洞发现后对事态的弥补。



        2.3 导入审计日志


          hgaudit_imp -f hgaudit-2023-12-19-161119.log,hgaudit-2023-12-19-162003.log

          请注意:


          1. hgaudit_imp默认会查找$PGDATA/hgaudit目录下的文件,假如审计文件在其他位置,请使用绝对路径。

          2. 支持指定多个文件,多个文件用逗号分隔,假如不使用-f指定,会将当前$PGDATA/hgaudit下的所有审计记录都导入,包括未写完的审计记录。

          3. 导入审计文件会先truncate审计日志表再写入,所以假如发现审计日志导入不全,只能全量导入,无法增量。

          4. 假如我们担心查询审计日志影响到正常业务运行,可以临时在其他服务器上搭建相同版本的数据库环境,将审计日志传输过去后进行导入。这也是较推荐的方案。


          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,INSTACE
             procpid            | integer                  |进程id
             session_start_time | timestamp with time zone |会话开始时间
             action_start_time  | timestamp with time zone |操作开始时间
             tansaction_id      | integer                  |事务id
             client_mac         | text                     |客户端mac地址
             client_ip          | text                     |客户端IP
             client_port        | text                     |客户端port
             application_name   | text                     |客户端应用名
             server_mac         | text                     |服务器mac
             server_ip          | text                     |服务器IP
             server_port        | text                     |服务器端口
             command            | text                     |执行的命令
             affect_rows        | integer                  |命令影响的行数
             return_row         | integer                  |命令返回的行数
             duration           | double precision         |命令持续时间
             result             | text                     |命令执行结果(成功或失败)
            由于操作类型:oper_opts 字段较为常用,且类型较多,特此说明该字段的所有取值,对于不同的操作可以按照如下清单来查询。
              CREATE ROLE
              CREATE DOMAIN
              CREATE PROCEDURE
              CREATE INDEX
              CREATE SCHEMA
              CREATE SEQUENCE
              CREATE TABLE
              CREATE TABLE AS
              CREATE TRIGGER
              CREATE USER
              CREATE VIEW
              CREATE EXTENSION
              CREATE DATABASE
              ALTER ROLE
              ALTER DOMAIN
              ALTER PROCEDURE
              ALTER INDEX
              ALTER SYSTEM
              ALTER SCHEMA
              ALTER SEQUENCE
              ALTER TABLE
              ALTER TRIGGER
              ALTER USER
              ALTER VIEW
              ALTER EXTENSION
              ALTER DATABASE
              DROP DOMAIN
              DROP PROCEDURE
              DROP ROLE
              DROP INDEX
              DROP SCHEMA
              DROP SEQUENCE
              DROP TABLE
              DROP TRIGGER
              DROP USER
              DROP VIEW
              DROP DATABASE
              DROP EXTENSION
              SELECT
              SELECT INTO
              INSERT
              UPDATE
              DELETE
              GRANT
              REVOKE
              COMMENT
              RESET
              SET
              TRUNCATE
              COPY TO
              COPY FROM
              REINDEX
              LOCK
              CALL

              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 t12
                    left 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并不像我们实验环境中那么简单和明确,检索审计日志需要耐心。


                      版权声明:本文由瀚高及PG志愿者翻整理,转载请注明出处,本页面内容均源自PostgreSQL Weekly英文官网,翻译目的在于传递更多信息,并不意味着瀚高赞同其观点或证实其内容的真实性。如果其他媒体、网站或其他任何形式的法律实体和个人使用,必须经过著作权人合法书面授权并自负全部法律责任。不得擅自使用瀚高名义进行转载,或盗用瀚高名义发布信息。否则瀚高将保留追究法律责任的权利


                      文章转载自瀚高PG实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论