# 查看DWS数据库审计日志
数据库审计日志在集群的**"安全设置"** 页面中进行设置，仅**"可用"** 和**"非均衡"**状态的集群支持修改安全配置，同时集群的任务信息不能处于其它业务运行中状态。
#### 前提条件
- 审计功能总开关audit_enabled已开启（audit_enabled默认值为ON，若关闭请参考[修改DWS集群GUC参数](https://support.huaweicloud.com/mgtg-dws/dws_01_0152.html)设置为OFF）。
- 已配置需要审计的审计项。各审计项及其开启办法，请参考[设置数据库审计日志]。
- 数据库正常运行，并且对数据库执行了一系列增、删、改、查操作，保证在查询时段内有审计结果产生。
- 数据库各个节点审计日志单独记录。
- 只有拥有AUDITADMIN属性的用户才可以查看审计记录。
 
 #### 设置数据库审计日志
1. [登录DWS管理控制台](https://console.huaweicloud.com/dws)。
2. 在左侧导航栏选择**"集群 \> 集群列表"**。
3. 在集群列表中，单击指定集群的名称，然后在上侧导航栏单击**"安全设置"** 。
   
   默认显示"配置状态"为**"已同步"**，表示页面显示的是数据库当前最新结果。
   
   
4. 在"审计配置"区域中，根据需要设置以下操作的审计开关，各审计项的详细信息如[表1]所示。
   
   图1审计项   
   ![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002617505271.png "点击放大")
    表1审计项 
   | 审计项    | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   |:---|:---|
   | 日志保留策略                              | 默认为**空间优先**。表示当单个节点的审计日志超过1G后，将自动淘汰审计日志。该功能避免因审计日志占用磁盘空间高导致节点故障或性能低。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | 执行结果                                 | 对语句执行结果进行审计，可选**SUCCESS** 和**ERROR** 。**SUCCESS**结果默认勾选。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
   | 越权访问操作 | 表示是否记录用户的越权访问操作，默认开启。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | DQL操作  | 可选**SELECT**操作进行审计。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | DML操作   | 表示是否对数据表的**INSERT** 、**UPDATE** 、**DELETE、MERGE** 和**COPY**操作进行记录，默认全部勾选。其中UPSERT操作属于INSERT审计项。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | DDL操作  | 表示是否对指定数据库对象的**CREATE** 、**DROP** 和**ALTER**操作进行记录。数据库对象默认全部关闭。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 其他操作   | 表示对其他的操作进行记录，其中**TRANSACTION** 、**USER FUNCTION** 和**CURSOR** 操作默认勾选，**VACUUM** ，**ANALYZE** ，**USER FUNCTION** ，**SPECIAL FUNCTION** ，**PREPARE STATEMENT**默认关闭。 说明： - 8.1.1.100及以上版本支持"其他操作"审计项。  - 建议TRANSACTION审计项保持勾选，否则事务内语句将不会审计。  - 建议CURSOR审计项保持勾选，否则CURSOR内SELECT语句将不会被审计。需注意Data Studio客户端会自动给SELECT语句封装CURSOR。   |
      
   DWS除了支持[表1]的审计功能，默认还开启了如[表2]所示的关键审计项。
    表2关键审计项 
   | 参数名    | 说明                    |
   |:---|:---|
   | 关键审计项 | 记录用户登录成功、登录失败和注销的信息。  |
   | 关键审计项 | 记录数据库启动、停止、恢复和切换审计信息。 |
   | 关键审计项 | 记录用户锁定和解锁功能信息。        |
   | 关键审计项 | 记录用户权限授予和权限回收信息。      |
   | 关键审计项 | 记录SET操作的审计功能。         |
      
   
   
5. 设置是否开启审计日志转储功能。 
   关于审计日志转储功能的更多信息，请参见[开启日志转储](https://support.huaweicloud.com/mgtg-dws/dws_01_0142.html#ZH-CN_TOPIC_0000002617625141__zh-cn_topic_0000001145696613_section8182105814130)。
   
   
6. 单击**"** **应用"** 。
   
   "配置状态"显示为**"应用中"**，表示系统正在保存配置。
   等待一段时间后当"配置状态"显示为**"** **已同步"**，表示已保存配置并生效。
   此外，单击刷新图标![](https://support.huaweicloud.com/mgtg-dws/figure/zh-cn_image_0000002587065688.png)，可刷新配置信息。
   
   
 
#### 查看数据库审计日志方式
- **方式一：** 由于审计日志会占用一定磁盘空间，为了防止本地磁盘文件过大，DWS支持审计日志转储，用户可以开启审计日志转储功能，将审计日志转储到OBS（用户需创建用于存储审计日志的OBS桶）中进行查看或下载，详细内容请参考[开启日志转储](https://support.huaweicloud.com/mgtg-dws/dws_01_0142.html#ZH-CN_TOPIC_0000002617625141__zh-cn_topic_0000001145696613_section8182105814130)。
- **方式二：** 通过依赖于云日志服务LTS的"集群日志管理"功能查看采集的审计数据库日志或进行日志下载，详细内容请参考[查看集群日志](https://support.huaweicloud.com/mgtg-dws/dws_01_01111.html#ZH-CN_TOPIC_0000002587065452__section1600157575)。
- **方式三：** 数据库的审计日志默认存储于数据库中，连接集群后使用pg_query_audit函数进行查看。详细内容请参考[使用系统函数查看数据库审计日志]。
 
 #### 使用系统函数查看数据库审计日志
1. 使用SQL客户端工具成功连接集群，连接方式请参考[连接DWS集群](https://support.huaweicloud.com/mgtg-dws/dws_01_0131.html)。
2. 使用函数pg_query_audit查询当前CN节点的审计日志： 
   ```
   pg_query_audit(timestamptz starttime,timestamptz endtime,audit_log)
   ```
   参数starttime和endtime分别表示审计记录的开始时间和结束时间，audit_log表示所查看的审计日志信息所在的物理文件路径，当不指定audit_log时，默认查看连接当前实例的审计日志信息。
   例如，查看指定时间段当前CN节点审计记录。
   ```
   SELECT * FROM pg_query_audit('2021-02-23 21:49:00','2021-02-23 21:50:00');
   ```
   查询结果如下：
   ```
   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节点的审计日志： 
   ```
   pgxc_query_audit(timestamptz starttime,timestamptz endtime)
   ```
   例如，查看指定时间段所有CN节点审计记录。
   ```
   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';
   ```
   查询结果如下：
   ```
   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_logout    | 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_logout    | 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. 查询审计多个对象名的记录。 
   ```
   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%';
   ```
   查询结果如下：
   ```
   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显示多个对象名，包括：表名、视图名及视图所涉及的基表名。
   
   
 
