
# 使用pgaudit插件
#### 简介
金融机构、政府机构和许多行业都需要保留审计日志以满足监管要求。通过将 PostgreSQL 审计扩展 (pgAudit) 与RDS for PostgreSQL 数据库实例一起使用，可以捕获审计员通常需要或满足法规要求的详细记录。例如，您可以设置pgAudit扩展来跟踪对特定数据库和表所做的更改、记录进行更改的用户以及许多其他详细信息。
更多信息，请参见[pgaudit官方文档](https://github.com/pgaudit/pgaudit)。
#### 支持版本说明
PostgreSQL 12及以上版本的最新小版本支持该插件。可通过以下SQL语句查询当前实例是否支持该插件：
```
SELECT * FROM pg_available_extension_versions WHERE name = 'pgaudit';
```
如果不支持，可通过[升级内核小版本](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_05_0003.html)或者[使用转储与还原升级大版本](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0053.html)使用该插件。
RDS for PostgreSQL实例支持的插件，具体请参见[支持的插件列表](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0045.html)。
 #### 插件安装/卸载
- 安装插件
  ```
  SELECT control_extension ('create', 'pgaudit');
  ```
  
- 删除插件
  ```
  SELECT control_extension ('drop', 'pgaudit');
  ```
  
更多信息，请参见[通过界面安装和卸载插件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0070.html)和[通过SQL命令安装和卸载插件](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0043.html)。
#### 基本使用
设置pgaudit扩展
1. 首先需要在插件管理中预加载pgaudit插件，因为pgaudit扩展会安装用于审核数据定义语言 (DDL) 语句的事件触发器。 默认插件管理中已预加载pgaudit插件，也可通过如下命令查看是否加载成功。
   ```
   show shared_preload_libraries;
                                shared_preload_libraries                             
   ---------------------------------------------------------------------------------
    pg_stat_statements,pgaudit,passwordcheck.so,pg_sql_history,auth_delay,pglogical
   (1 row)
   ```
   
2. 加载成功后再进行创建插件，请参考[插件安装/卸载]。
3. 插件安装完成后，需要开启审计日志。
   1. 单击实例名称，进入"概览"页面。
   
   2. 在左侧导航栏，选择"日志管理"。
   
   3. 选择"SQL审计日志"页签，单击"设置SQL审计"。
   
   4. 在弹框中，开启审计日志开关，可选择审计日志保留天数。
    
4. 开启审计日志后，还需要配置参数。 在界面"参数修改"页签，搜索"pgaudit.log"参数（指定会话审计日志将记录哪些类型的语句）并设置为适合业务需要的值，可以捕获对日志的插入、更新、删除和其他一些类型的更改。"pgaudit.log"参数取值如下：
   表1参数值说明 
   | 参数值      | 描述                                                             |
   |:---|:---|
   | none     | 这是原定设置值。不记录任何数据库更改。                                            |
   | all      | 记录所有内容（read、write、function、role、ddl、misc）。                     |
   | ddl      | 记录所有数据定义语言（DDL）语句（不包括在 ROLE 类中）。                               |
   | function | 记录函数调用和DO块。                                                    |
   | misc     | 记录其他命令，例如：DISCARD、FETCH、CHECKPOINT、VACUUM、SET                  |
   | read     | 当源为关系（例如表）或查询时记录SELECT和COPY。                                   |
   | role     | 记录与角色和权限相关的语句，例如：GRANT、REVOKE、CREATE ROLE、ALTER ROLE、DROP ROLE |
   | write    | 当目标为关系（表）时，记录INSERT、UPDATE、DELETE、TRUNCATE和COPY。               |
      
   pgaudit还有一些参数，可根据业务需要在界面上进行设置。
   表2参数说明 
   | 参数名称                              | 描述                                                  |
   |:---|:---|
   | pgaudit.log                       | 指定会话审计日志记录将记录哪些类的语句。                                |
   | pgaudit.log_catalog               | 指定在语句中的所有关系都在pg_catalog中的情况下，应该启用会话日志记录。            |
   | pgaudit.log_client_authentication | 控制是否记录用户认证的信息。                                      |
   | pgaudit.log_extra_field           | 控制是否记录PID、IP、用户名、数据库等字段。                            |
   | pgaudit.log_file_rotation_age     | 设置独立审计日志的轮转时间。                                      |
   | pgaudit.log_parameter             | 指定审核日志记录应该包含与语句传递的参数。                               |
   | pgaudit.log_relation              | 指定会话审核日志记录是否应该为SELECT或DML语句中引用的每个关系(表、视图等)创建单独的日志项。 |
   | pgaudit.log_rows                  | 指定审计日志记录应包括语句检索或影响的行。                               |
   | pgaudit.log_write_txid            | 控制是否记录写操作（insert/update等）的txid。                     |
   | pgaudit.logstatementonce          | 指定日志记录是否包含语句、文本和参数。                                 |
   | pgaudit.log_client                | 指定审计日志是否发送到客户端。                                     |
   | pgaudit.log_level                 | 指定用于日志条目的日志级别。                                      |
   | pgaudit.write_into_pg_log_file    | 控制是否仍旧向PostgreSQL的运行日志记录审计信息。                       |
      
   如果您需要在客户端上显示审计日志，可以通过修改以下参数进行配置：
   - "pgaudit.write_into_pg_log_file"和"pgaudit.log_client"参数值同时为on，再根据"pgaudit.log_level"参数选择客户端显示的日志级别（例如notice），客户端再次进行查询时，可以在客户端显示对应级别的审计日志。
   
   - "pgaudit.write_into_pg_log_file"和"pgaudit.log_client"参数只要有一个值为off，客户端不会显示审计日志。
   
   - "pgaudit.log_level"仅在"pgaudit.log_client"打开时启用。
    
 
#### SQL审计功能验证
1. 执行sql语句。
   ```
   create table t1 (id int);
   insert into t1 values (1);
   select * from t1;
    id
   ----
     1
   (1 rows)
   ```
   
2. 在界面上通过"SQL审计"页签进行审计日志下载。 审计日志包含以下内容：
   ```
   AUDIT: OBJECT,1,1,READ,SELECT,TABLE,public.t1,select * from t1;
   ```
   - AUDIT：表示这是一个审计日志条目。
   
   - OBJECT：表示这是一个对象级别的审计日志。
   
   - 第一个1：表示对象的 ID。
   
   - 第二个1：表示对象的子 ID。
   
   - READ：表示这是一个读取操作。
   
   - SELECT：表示这是一个 SELECT 查询。
   
   - TABLE：表示对象类型是表。
   
   - public.t1：表示表的名称和模式。
   
   - select \* from t1：表示执行的 SQL 查询语句。
    
 
