审计是指在数据库系统中记录发生的操作(或事件),包括操作对象和操作时间等信息的过程。
KingbaseES数据库不仅支持策略审计,还具备实时入侵检测、审计策略的备份与恢复及审计记录管理的功能。
任何安全措施都无法做到绝对完善,恶意攻击者总会尝试突破防线。因此,审计功能自动记录用户对数据库的所有操作至审计日志中。审计员通过分析这些日志,可以预先识别并应对潜在威胁,确保数据库的安全性、可靠性与有效性。
KingbaseES的审计设置主要分为三类:
此类型审计关注的是数据库服务器发生的各类事件,例如启动、停止、配置文件重载、用户登录与登出等。这种审计方式简称为服务器级审计。
语句级别审计,
STATEMENT AUDITING,涉及DBMS范围内对所有结构或模式对象的操作事件。这类审计涵盖了DDL、DML、DQL、DCL、TCL等语句引起的事件,简称语句级审计。
模式对象级别的审计,
SCHEMA OBJECT AUDITING,专注于对特定模式对象执行SELECT或DML操作时触发的事件。模式对象包括但不限于表、视图、物化视图、过程、函数和序列。但不涵盖依赖于表的索引、约束、触发器或分区表等对象。这种审计方式被称为模式对象级审计或对象审计。

KingbaseES数据库中,审计功能的启用与否由特定开关控制。当此功能被关闭时,数据库不会执行任何审计活动,也无法应用任何审计设置。若要让KingbaseES系统中的审计配置生效,审计员需要开启相应的审计开关。
shared_preload_librariessysaudit.enable=on根据具体需求,可以开启不同的审计参数,其启用方法与sysaudit.enable相同。以下是部分重要参数及其用途:
| 参数 | 使用说明 |
|---|---|
| sysaudit.serverevent | 控制服务器事件的审计,如启动、关闭、重载配置等,默认为off。 |
| sysaudit.userevent | 控制用户事件的审计,如登录和退出,默认为off。 |
| sysaudit.enable | 审计功能的总开关,可选值为on或off,默认为off。 |
| sysaudit.syntaxerror | 控制是否审计语法错误的语句,默认为off。 |
| sysaudit.audit_table_hostaddr | 指定存储审计日志的数据库IP地址,默认为本地。 |
| sysaudit.audit_table_port | 指定存储审计日志的数据库端口号。 |
| sysaudit.audit_table_user | 指定存储审计日志的数据库用户名,默认为审计管理员sao。 |
| sysaudit.audit_table_password | 指定存储审计日志的数据库用户的密码。 |
| sysaudit.local_sao_password | 指定数据库审计管理员sao用户的密码。 |
| sysaudit.bgw_workers | 指定启动的后台审计进程数量,默认为1,建议在服务器启动前配置。 |
| sysaudit.shared_cache | 指定审计使用的共享缓存大小,默认为10MB,同样建议在服务器启动前配置。 |
| sysaudit.third_store_num | 指定第三方审计时批量提交的日志条数,默认为1,适用于性能测试场景。 |
| sysaudit.enable_encrypt | 开启后将审计密钥生成、数据加密和解密事件。 |
| sysaudit.enable_mac | 开启后将审计创建强制访问控制规则及相关的读写事件。 |
| sysaudit.enable_audit_cluster_datatransfer | 开启后将在集群环境下审计主备机间的通信。 |
shared_preload_libraries = 'sysaudit'激活此参数后,将在集群环境中对主备机之间的GUC参数同步行为进行审计。
启用该参数后,系统将审计后台子进程的启动与退出事件。
激活此参数后,将审计所有错误事件,包括所有等级在error及以上的错误日志均会被记录到审计日志中。
激活此参数后,KES的审计日志将通过操作系统的标准日志发送接口,传输到其他服务器。目前,仅审计管理员sao有权更改此参数设置,且此功能暂时不支持在Windows平台使用。
一旦开启审计功能并设置服务器事件或用户事件的审计开关,服务器事件将始终被记录在审计日志中,无需额外配置审计策略。
sysaudit.serverevent
sysaudit.userevent
---请参阅本文档末尾的审计策略与SQL命令对照表
启动语句级别的审计功能,需配置以下参数:
sysaudit.set_audit_stmt
(
audit_type text,
audit_users text,
audit_schema text,
audit_objs text
)
audit_type
审计策略与SQL命令对应表
audit_users
审计的用户名,null表示审计所有用户。当 audit_type 设定为 ALL 时,必须指定审计的用户。
audit_schema
审计对象的模式名。留空则表示审计所有模式下的此类对象。
audit_objs
对于select table、insert table、update table、delete table、truncate table、drop table这六类语句,可以设置表名。
返回值说明: 无返回值。
取消审计时,需提供以下参数:
sysaudit.remove_audit (rule_id int)
rule_id
语句审计实例:
语句审计示例
审计system用户的表创建动作:
SELECT sysaudit.set_audit_stmt('CREATE TABLE', 'system', null, null);
审计用户user_a的表修改动作:
SELECT sysaudit.set_audit_stmt('alter table', 'user_a', null, null);
取消编号为10001的审计策略:
CALL sysaudit.remove_audit (10001);
取消所有审计策略:
CALL sysaudit.remove_audit(null);
模式对象级别的审计涉及具体对象上的DML/SELECT操作,需要指明模式名及其对象名。只有正确设置了相关对象的审计规则,才能触发审计,例如,为函数对象设定一个INSERT审计策略是无效的,因为数据库不支持向函数执行INSERT操作。
sysaudit.set_audit_object(audit_type text,
audit_users text,
audit_schema text,
audit_objs text)
配置参数说明:
audit_type
audit_users
审计的用户名,null表示审计所有用户。
audit_schema
审计对象的模式名。留空则表示审计所有模式下的此类对象。
audit_objs
审计对象的名称,例如表名、视图名、存储过程名。留空则表示审计指定模式下的所有此类对象。
返回值说明: 无返回值。
取消对象审计时,需提供以下参数:
sysaudit.remove_audit (audit_id int)
sysaudit.remove_audit (null)
audit_id
sysaudit.all_audit_rules 中的 audit_id。若未指定审计策略编号,则参数设为 null 时,将移除当前用户可管理的所有审计规则。对象审计示例:
对象审计示例
审计 user1 用户对 public 模式下的表 t1 的任意操作。
SELECT sysaudit.set_audit_object('table', 'user1', 'public', 't1');
取消id为10002的审计设置。
CALL sysaudit.remove_audit (10002);
语句级审计示例:
--system用户创建测试表t1
\c - system
您现在以用户名"system"连接到数据库"test"。
CREATE TABLE t1 (a int);
CREATE TABLE
--sao用户开启审计、配置审计规则、查看审计规则
\c - sao
您现在以用户名"sao"连接到数据库"test"。
ALTER system SET sysaudit.enable = on;
ALTER SYSTEM
SELECT sys_reload_conf();
sys_reload_conf
-----------------
t
(1 行记录)
SELECT sysaudit.set_audit_stmt('insert table','system','public','t1');
set_audit_stmt
----------------
(1 行记录)
SELECT * FROM sysaudit.all_audit_rules ;
audit_id | audit_target | audit_type | audit_users | audit_schema | audit_objname | audit_objoid | creator_name
----------+--------------+--------------+-------------+--------------+---------------+--------------+--------------
16387 | SQL | insert table | system | public | t1 | 16384 | sao
(1 行记录)
--system执行SQL语句触发审计
\c - system
您现在以用户名"system"连接到数据库"test"。
INSERT INTO t1 VALUES (1);
INSERT 0 1
--sao用户登录security库查看审计日志
\c security sao
您现在以用户名"sao"连接到数据库"security"。
security=> SELECT COUNT(*) FROM sysaudit_record_sao WHERE opr_type = '插入';
count
-------
1
(1 行记录)
--sao用户取消审计规则
security=> \c test sao
您现在以用户名"sao"连接到数据库"test"。
SELECT sysaudit.remove_audit(16387);
remove_audit
--------------
(1 行记录)
SELECT * FROM sysaudit.all_audit_rules ;
audit_id | audit_target | audit_type | audit_users | audit_schema | audit_objname | audit_objoid | creator_name
----------+--------------+------------+-------------+--------------+---------------+--------------+--------------
(0 行记录)
对象级审计示例:
--sao用户设置审计规则
SELECT sysaudit.set_audit_object('table','system','public','t1');
set_audit_stmt
----------------
(1 行记录)
SELECT * FROM sysaudit.all_audit_rules ;
audit_id | audit_target | audit_type | audit_users | audit_schema | audit_objname | audit_objoid | creator_name
----------+--------------+------------+-------------+--------------+---------------+--------------+--------------
16388 | Object | table | system | public | t1 | 16384 | sao
(1 行记录)
--system执行SQL语句触发审计
\c - system
您现在以用户名"system"连接到数据库"test"。
SELECT * FROM t1;
a
---
1
(1 行记录)
--sao用户登录security库查看审计日志
\c security sao
您现在以用户名"sao"连接到数据库"security"。
security=> SELECT COUNT(*) FROM sysaudit_record_sao WHERE opr_type = '查询';
count
-------
1
(1 行记录)
--sao用户取消审计规则
security=> \c test sao
您现在以用户名"sao"连接到数据库"test"。
SELECT sysaudit.remove_audit(16388);
remove_audit
--------------
(1 行记录)
SELECT * FROM sysaudit.all_audit_rules ;
audit_id | audit_target | audit_type | audit_users | audit_schema | audit_objname | audit_objoid | creator_name
----------+--------------+------------+-------------+--------------+---------------+--------------+--------------
(0 行记录)
审计策略的设置情况可以通过系统视图查询,其结构如下表所示:
sysaudit.all_audit_rules
| 列名 | 数据类型 | 说明 |
|---|---|---|
| audit_id | int | 审计策略编号 |
| audit_target | smallint | 审计目标(事件、语句、对象) |
| audit_type | text | 审计类型 |
| audit_users | text | 审计用户 |
| audit_schema | text | 审计对象所在模式 |
| audit_objnames | text | 审计对象名称 |
| audit_objoid | oid | 审计对象id |
| creator_name | text | 策略设置者的角色 |
数据库审计员sao和数据库安全员sso可在security数据库下通过查询系统视图来查看相应的审计日志:
--数据库审计员sao需要查询视图sysaudit_record_sao,可以查看超级用户(包括数据库管理员system)和数据库安全员sso的审计日志
select * from sysaudit_record_sao;
--数据库安全员sso需要查询视图sysaudit_record_sso,可以查看普通用户和数据库审计员sao的审计日志
select * from sysaudit_record_sso;
备注: 当审计记录被存储至第三方库后,将无法通过工具的对象界面查看。
审计管理员sao或安全管理员sso可通过视图 sysaudit_record_sso 查询审计记录。视图结构如下:
| 列名 | 数据类型 | 说明 |
|---|---|---|
| session_id | text | 会话id |
| proc_id | int | 进程号 |
| vxid | text | 虚事务id |
| xid | int | 事务id |
| user_id | oid | 用户id |
| username | text | 用户名 |
| remote_addr | text | ip地址/端口 |
| db_id | oid | 数据库id |
| db_name | text | 数据库名 |
| rule_id | bigint | 审计策略编号 |
| rule_type | text | 审计类型 |
| opr_type | text | 操作类型 |
| obj_type | text | 对象类型 |
| schm_id | oid | 模式id |
| schm_name | text | 模式名 |
| obj_id | oid | 对象id |
| obj_name | text | 对象名 |
| sqltext | text | SQL文本 |
| params | text | 参数 |
| errcode | text | SQLSTATE错误码 |
| errmsg | text | 错误消息内容 |
| audit_ts | timestamp | 审计时间戳 |
timestamp with time zone:操作时间
result:操作结果,成功为success,失败为failure
record_type:审计记录类型(预留字段)
aud_client:客户端名称
server_type:服务器类型,集群环境下,M表示主服务器,S表示备用服务器
authen_method:认证方法,对于非用户登录流程,该字段显示为unknown
| 分组名称 | SQL命令 | 说明 |
|---|---|---|
| ALL | ALL | 涵盖所有类型的审计支持 |
| ALTER | ALTER DATABASE | 修改数据库定义 |
| ALTER TABLE | 修改表定义 | |
| ALTER INDEX | 修改索引定义 | |
| ALTER VIEW | 修改视图定义 | |
| ALTER MATERIALIZED VIEW | 修改物化视图定义 | |
| ALTER SCHEMA | 修改模式定义 | |
| ALTER SEQUENCE | 修改序列定义 | |
| ALTER FUNCTION | 修改函数定义 | |
| ALTER PROCEDURE | 修改过程定义 | |
| ALTER TABLESPACE | 修改表空间定义 | |
| ALTER USER | 修改用户信息 | |
| COPY | COPY FROM | 从文件向表中复制数据 |
| COPY TO | 从表或查询向文件复制数据 | |
| CREATE | CREATE DATABASE | 创建数据库 |
| CREATE TABLE | 创建表 | |
| CREATE INDEX | 创建索引 | |
| CREATE VIEW | 创建视图 | |
| CREATE MATERIALIZED VIEW | 创建物化视图 | |
| CREATE SCHEMA | 创建模式 | |
| CREATE SEQUENCE | 创建序列 | |
| CREATE FUNCTION | 创建函数 | |
| CREATE PROCEDURE | 创建过程 | |
| CREATE TABLESPACE | 创建表空间 | |
| CREATE USER | 创建用户 | |
| ML | DELETE TABLE | 删除表中的记录 |
| INSERT TABLE | 向表中插入记录 | |
| UPDATE TABLE | 更新表中的记录 | |
| DROP | DROP DATABASE | 删除数据库 |
| DROP TABLE | 删除表 | |
| DROP INDEX | 删除索引 | |
| DROP VIEW | 删除视图 | |
| DROP MATERIALIZED VIEW | 删除物化视图 | |
| DROP SCHEMA | 删除模式 | |
| DROP SEQUENCE | 删除序列 | |
| DROP FUNCTION | 删除函数 | |
| DROP PROCEDURE | 删除过程 | |
| DROP TABLESPACE | 删除表空间 | |
| DROP USER | 删除用户 | |
| NCTION | CREATE FUNCTION | 创建函数 |
| ALTER FUNCTION | 修改函数定义 | |
| DROP FUNCTION | 删除函数 | |
| GRANT | GRANT | 授予权限 |
| INDEX | CREATE INDEX | 创建索引 |
| ALTER INDEX | 修改索引定义 | |
| DROP INDEX | 删除索引 | |
| MATERIALIZED VIEW | CREATE MATERIALIZED VIEW | 创建物化视图 |
| ALTER MATERIALIZED VIEW | 修改物化视图定义 | |
| DROP MATERIALIZED VIEW | 删除物化视图 | |
| PROCEDURE | CREATE PROCEDURE | 创建过程 |
| ALTER PROCEDURE | 修改过程定义 | |
| DROP PROCEDURE | 删除过程 | |
| SELECT | SELECT TABLE | 查询语句,用于从数据库中检索数据 |
| SEQUENCE | CREATE SEQUENCE | 创建序列 |
| ALTER SEQUENCE | 修改序列定义 | |
| DROP SEQUENCE | 删除序列 | |
| SYSTEM | ALTER SYSTEM | 修改服务器配置参数 |
| TABLE | CREATE TABLE | 创建表 |
| ALTER TABLE | 修改表定义 | |
| DROP TABLE | 删除表 | |
| TRUNCATE TABLE | 清空表 | |
| TRANSACTION | BEGIN | 开始事务块 |
| COMMIT | 提交当前事务 | |
| ROLLBACK | 回滚当前事务 | |
| SAVEPOINT | 在当前事务中定义保存点 | |
| ROLLBACK TO | 回滚到指定的保存点 | |
| RELEASE | 释放指定的保存点 | |
| START TRANSACTION | 开始事务块 | |
| VIEW | CREATE VIEW | 创建视图 |
| ALTER VIEW | 修改视图定义 | |
| DROP VIEW | 删除视图 |
扫码加好友,拉您进群



收藏
