更新时间:2024-10-08 GMT+08:00

查看GaussDB(DWS)数据库审计日志

数据库审计日志在集群的“安全设置”页面中进行设置,仅“可用”“非均衡”状态的集群支持修改安全配置,同时集群的任务信息不能处于“节点扩容”“配置中”“升级中”“重分布中”“重启中”等状态。

前提条件

  • 审计功能总开关audit_enabled已开启。(audit_enabled默认值为ON,若关闭请参考修改GaussDB(DWS)集群GUC参数设置为OFF)。
  • 已配置需要审计的审计项。各审计项及其开启办法,请参考设置数据库审计日志
  • 数据库正常运行,并且对数据库执行了一系列增、删、改、查操作,保证在查询时段内有审计结果产生。
  • 数据库各个节点审计日志单独记录。
  • 只有拥有AUDITADMIN属性的用户才可以查看审计记录。

设置数据库审计日志

  1. 登录GaussDB(DWS)管理控制台。
  2. 单击“集群 > 专属集群
  3. 在集群列表中,单击指定集群的名称,然后在左侧导航栏单击“安全设置”

    默认显示“配置状态”“已同步”,表示页面显示的是数据库当前最新结果。

  4. “审计配置”区域中,根据需要设置以下操作的审计开关:

    审计日志保留策略默认为“空间优先”,表示当单个节点的审计日志超过1G后,将自动淘汰审计日志。该功能避免因审计日志占用磁盘空间高导致节点故障或性能低。

    图1 审计项

    各审计项的详细信息如表1所示。

    表1 审计项

    审计项

    说明

    越权访问操作

    表示是否记录用户的越权访问操作,默认关闭。

    DQL操作

    可选SELECT操作进行审计。

    说明:

    8.1.1.100及以上集群版本支持“DQL操作”审计项。

    DML操作

    表示是否对数据表的INSERTUPDATEDELETE操作进行记录,默认关闭。

    说明:

    8.1.1.100及以上版本支持各审计项的细粒度拆分,并增加COPYMERGE选项。

    DDL操作

    表示是否对指定数据库对象的CREATEDROPALTER操作进行记录。除“DATABASE”“SCHEMA”“USER”默认启用记录,其他默认关闭。

    说明:

    8.1.1.100及以上版本新增“TABLE”“DATA SOURCE”“NODE GROUP”操作,默认启用。

    其他操作

    表示对其他的操作进行记录,其中TRANSACTIONCURSOR操作,默认勾选,VACUUMANALYZEUSER FUNCTIONSPECIAL FUNCTIONPREPARE STATEMENT默认关闭。

    说明:
    • 8.1.1.100及以上版本支持“其他操作”审计项。
    • 建议TRANSACTION审计项保持勾选,否则事务内语句将不会审计。
    • 建议CURSOR审计项保持勾选,否则CURSOR内SELECT语句将不会被审计。需注意Data Studio客户端会自动给SELECT语句封装CURSOR。

    GaussDB(DWS)除了支持表1的审计功能,默认还开启了如表2所示的关键审计项。

    表2 关键审计项

    参数名

    说明

    关键审计项

    记录用户登录成功、登录失败和注销的信息。

    记录数据库启动、停止、恢复和切换审计信息。

    记录用户锁定和解锁功能信息。

    记录用户权限授予和权限回收信息。

    记录SET操作的审计功能。

  5. 设置是否开启审计日志转储功能。

    关于审计日志转储功能的更多信息,请参见开启审计日志转储

  6. 单击“应用”

    “配置状态”显示为“应用中”,表示系统正在保存配置。

    等待一段时间后当“配置状态”显示为“已同步”,表示已保存配置并生效。

    此外,单击刷新图标,可刷新配置信息。

查看数据库审计日志方式

方式一:由于审计日志会占用一定磁盘空间,为了防止本地磁盘文件过大,GaussDB(DWS)支持审计日志转储,用户可以开启审计日志转储功能,将审计日志转储到OBS(用户需创建用于存储审计日志的OBS桶)中进行查看或下载,详细内容请参考开启审计日志转储

方式二:通过依赖于云日志服务LTS的“集群日志管理”功能查看采集的审计数据库日志或进行日志下载,详细内容请参考查看集群日志

方式三:数据库的审计日志默认存储于数据库中,连接集群后使用pg_query_audit函数进行查看。详细内容请参考使用pg_query_audit函数查看数据库审计日志

使用pg_query_audit函数查看数据库审计日志

  1. 使用SQL客户端工具成功连接集群,连接方式请参考连接GaussDB(DWS)集群
  2. 使用函数pg_query_audit查询当前CN节点的审计日志:

    1
    pg_query_audit(timestamptz starttime,timestamptz endtime,audit_log)
    

    参数starttime和endtime分别表示审计记录的开始时间和结束时间,audit_log表示所查看的审计日志信息所在的物理文件路径,当不指定audit_log时,默认查看连接当前实例的审计日志信息。

    例如,查看指定时间段当前CN节点审计记录。
    1
    SELECT * FROM pg_query_audit('2021-02-23 21:49:00','2021-02-23 21:50:00');
    

    查询结果如下:

    1
    2
    3
             begintime         |          endtime          | operation_type | audit_type | result |  username  | database | client_conninfo | object_name | command_text |                           detail_info                            | transaction_xid | query_id |  node_name   |               session_id                | local_port | remote_port 
    ---------------------------+---------------------------+----------------+------------+--------+------------+----------+-----------------+-------------+-----------------+------------------------------------------------------------------+-----------------+----------+--------------+------------------------------+------------+-------------
     2021-02-23 21:49:57.76+08 | 2021-02-23 21:49:57.82+08 | login_logout   | user_login | ok     | dbadmin | gaussdb | gsql@[local]    | gaussdb    | login db     | login db(gaussdb) successfully, the current user is: dbadmin | 0               | 0        | coordinator1 | 140324035360512.667403397820909.coordinator1 | 27777      | 
    

    该条记录表明,用户dbadmin在2021-02-23 21:49:57.82+08登录数据库gaussdb。其中client_conninfo字段在log_hostname启动且IP连接时,字符@后显示反向DNS查找得到的主机名。

  3. 使用函数pgxc_query_audit可以查询所有CN节点的审计日志:

    1
    pgxc_query_audit(timestamptz starttime,timestamptz endtime)
    
    例如,查看指定时间段所有CN节点审计记录。
    1
    SELECT * FROM pgxc_query_audit('2021-02-23 22:05:00','2021-02-23 22:07:00') where audit_type = 'user_login' and username = 'user1';
    

    查询结果如下:

    1
    2
    3
    4
             begintime          |          endtime           | operation_type | audit_type | result | username | database | client_conninfo | object_name | command_text |                         detail_info                        | transaction_xid | query_id |  node_name   |               session_id                     | local_port | remote_port 
    ----------------------------+----------------------------+----------------+------------+--------+----------+----------+-----------------+-------------+--------------+------------------------------------------------------------+-----------------+----------+--------------+----------------------------------------------+------------+-------------
     2021-02-23 22:06:22.219+08 | 2021-02-23 22:06:22.271+08 | login_lgout    | user_login | ok     | user1    | gaussdb  | gsql@[local]    | gaussdb     | login db     | login db(gaussdb) successfully, the current user is: user1 | 0               | 0        | coordinator2 | 140689577342720.667404382271356.coordinator  | 27782      | 
     2021-02-23 22:05:51.697+08 | 2021-02-23 22:05:51.749+08 | login_lgout    | user_login | ok     | user1    | gaussdb  | gsql@[local]    | gaussdb     | login db     | login db(gaussdb) successfully, the current user is: user1 | 0               | 0        | coordinator1 | 140525048424192.667404351749143.coordinator1 | 27777      | 
    

    查询结果显示,用户user1在CN1和CN2的成功登录记录。

  4. 查询审计多个对象名的记录。

    1
    2
    SET audit_object_name_format TO 'all';
    SELECT object_name,result,operation_type,command_text FROM pgxc_query_audit('2022-08-26 8:00:00','2022-08-26 22:55:00') where command_text like '%student%';
    

    查询结果如下:

    1
    2
    3
    4
    5
    6
    7
    8
                               object_name                            | result | operation_type |                                                                         command_text                             
    
    ------------------------------------------------------------------+--------+----------------+------------------------------------------------------------------------------------------------------------------
    --------------------------------------------
     student                                                          | ok     | ddl            | CREATE TABLE student(stuNo int, stuName TEXT);
     studentscore                                                     | ok     | ddl            | CREATE TABLE studentscore(stuNo int, stuscore int);
     ["public.student_view01","public.studentscore","public.student"] | ok     | ddl            | CREATE OR REPLACE VIEW student_view01 AS SELECT * FROM student t1 where t1.stuNo in (select stuNo from studentscore t2 where t1.stuNo = t2.stuNo);
     ["public.student_view01","public.student","public.studentscore"] | ok     | dml            | SELECT * FROM student_view01;
    

    查询结果object_name显示多个对象名,包括:表名、视图名及视图所涉及的基表名。