全部版块 我的主页
论坛 会计与财务管理论坛 七区 会计与财务管理
297 0
2025-11-20

审计概述

审计是指在数据库系统中记录发生的操作(或事件),包括操作对象和操作时间等信息的过程。

KingbaseES数据库不仅支持策略审计,还具备实时入侵检测、审计策略的备份与恢复及审计记录管理的功能。

任何安全措施都无法做到绝对完善,恶意攻击者总会尝试突破防线。因此,审计功能自动记录用户对数据库的所有操作至审计日志中。审计员通过分析这些日志,可以预先识别并应对潜在威胁,确保数据库的安全性、可靠性与有效性。

KingbaseES的审计设置主要分为三类:

  • 服务器事件审计
  • 语句级别审计
  • 模式对象级别审计

服务器事件审计

此类型审计关注的是数据库服务器发生的各类事件,例如启动、停止、配置文件重载、用户登录与登出等。这种审计方式简称为服务器级审计。

语句级别审计

语句级别审计,

STATEMENT AUDITING
,涉及DBMS范围内对所有结构或模式对象的操作事件。这类审计涵盖了DDL、DML、DQL、DCL、TCL等语句引起的事件,简称语句级审计。

模式对象级别审计

模式对象级别的审计,

SCHEMA OBJECT AUDITING
,专注于对特定模式对象执行SELECT或DML操作时触发的事件。模式对象包括但不限于表、视图、物化视图、过程、函数和序列。但不涵盖依赖于表的索引、约束、触发器或分区表等对象。这种审计方式被称为模式对象级审计或对象审计。

审计策略的启用与配置

审计参数开关

KingbaseES数据库中,审计功能的启用与否由特定开关控制。当此功能被关闭时,数据库不会执行任何审计活动,也无法应用任何审计设置。若要让KingbaseES系统中的审计配置生效,审计员需要开启相应的审计开关。

  1. KingbaseES数据库的审计功能通过sysaudit插件实现,需在kingbase.conf文件中修改相应参数。
    shared_preload_libraries
  2. 审计功能的总开关为sysaudit.enable,提供on和off两个选项,默认值为off。要在kingbase.conf文件末尾添加该参数以激活审计总开关。
    sysaudit.enable=on

sysaudit插件提供的审计参数

根据具体需求,可以开启不同的审计参数,其启用方法与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'

sysaudit.enable_audit_cluster_set_guc_param

激活此参数后,将在集群环境中对主备机之间的GUC参数同步行为进行审计。

sysaudit.processevent

启用该参数后,系统将审计后台子进程的启动与退出事件。

sysaudit.all_error

激活此参数后,将审计所有错误事件,包括所有等级在error及以上的错误日志均会被记录到审计日志中。

sysaudit.report_log

激活此参数后,KES的审计日志将通过操作系统的标准日志发送接口,传输到其他服务器。目前,仅审计管理员sao有权更改此参数设置,且此功能暂时不支持在Windows平台使用。

2.2 服务器事件审计

一旦开启审计功能并设置服务器事件或用户事件的审计开关,服务器事件将始终被记录在审计日志中,无需额外配置审计策略。

sysaudit.serverevent
sysaudit.userevent

2.3 语句级别审计

---请参阅本文档末尾的审计策略与SQL命令对照表

启动语句级别的审计功能,需配置以下参数:

sysaudit.set_audit_stmt
(
audit_type text,
audit_users text,
audit_schema text,
audit_objs text
)
audit_type
  • 支持DML、DDL、TCL等类型的SQL命令审计。
  • 可指定特定的SQL命令进行审计,详情请参见上表。
审计策略与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
  • 审计策略编号(创建后可从 sysaudit.all_audit_rules 表中查询)

语句审计实例:

语句审计示例

审计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);

2.4 模式对象级别审计

模式对象级别的审计涉及具体对象上的DML/SELECT操作,需要指明模式名及其对象名。只有正确设置了相关对象的审计规则,才能触发审计,例如,为函数对象设定一个INSERT审计策略是无效的,因为数据库不支持向函数执行INSERT操作。

sysaudit.set_audit_object(audit_type text,
audit_users text,
audit_schema text,
audit_objs text)

配置参数说明:

audit_type
  • 审计对象类型,支持 TABLE、VIEW、MATERIALIZED VIEW、PROCEDURE、FUNCTION,不区分大小写。
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 行记录)

四、审计记录查询管理

4.1 审计策略查询

审计策略的设置情况可以通过系统视图查询,其结构如下表所示:

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 策略设置者的角色

4.2 审计记录查询

数据库审计员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命令对应表

分组名称 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 删除视图
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群