目录
对数据库系统中发生的动作(或事件),将其对应的操作对象、操作时间等信息记录下来的过程,称为审计。
任何系统的安全保护措施都不是完美无缺的,蓄意盗窃,破坏数据的人总是想方设法打破控制,审计功能将用户对数据库的所有操作自动记录下来放入审计日志中,审计员(sao)可以通过对审计日志的分析,对潜在的威胁提前采取有效地措施加以防范。KingbaseES数据库提供了一套完整的审计机制,用来保证对数据库中的各种行为进行监控,进而为数据库的安全、可靠和有效提供有力的保障。
KingbaseES数据库通过插件sysaudit实现审计功能,修改 kingbase.conf 文件中 shared_preload_libraries
参数。
shared_preload_libraries = 'sysaudit'
KingbaseES数据库中对审计功能设置了开关。审计功能关闭时,数据库不会发生审计动作,也无法将审计设置应用到数据库中。审计员(sao)如果要使 KingbaseES 系统中的审计设置生效,必须打开该审计开关。
sysaudit.enable
设置审计功能是否开启的总开关,有on和off两种选择,缺省为 off。
on表示打开审计功能;
off表示关闭审计功能;
打开(或关闭)审计开关的方式有如下方式:
在KingbaseES启动之前,通过修改 kingbase.conf 文件,将 sysaudit.enable
设置为on(或off)
在KingbaseES启动后,以审计员用户连接数据库,利用ALTER SYSTEM命令将 sysaudit.enable
设置为on | off。打开(或关闭)审计开关,重载配置后,数据库系统中的审计功能立即生效(或失效)。
打开(或关闭)审计开关并重载的命令:
ALTER SYSTEM SET sysaudit.enable = on | off; CALL sys_reload_conf();
KingbaseES的审计设置分为三种类型:服务器事件审计、语句审计、模式对象审计。
事件审计:审计数据库服务器发生的事件,包含以下几种:数据库服务器的启动、数据库服务器的停止、数据库服务器配置文件的重新加载、用户登录、用户登出。简称为:服务器级审计或服务器审计。
语句级别审计:也称为 "STATEMENT AUDITING",指在 DBMS 范围内,对DBMS拥有的结构或模式对象进行操作时引发的事件进行审计,此类结构或模式对象并不指具体的某个结构或模式对象,而是一类结构或模式对象的泛称。通常,包括 DBMS 提供的 DDL、DML、DQL、DCL、TCL 等语句引发的事件。简称为:语句级审计或语句审计。
模式对象级别审计:也称为 "SCHEMA OBJECT AUDITING",指在某个确定的模式对象上进行 SELECT 或 DML 操作时引发的事件进行审计。模式对象包括表、视图、物化视图、过程、函数、序列。模式对象不包括有依附关系的对象,如依附于表的索引、约束、触发器、分区表等。简称为:模式对象级审计或对象审计。
KingbaseES的审计参数设置如下:
sysaudit.serverevent
服务器事件审计开关,包括:服务器启动、关闭、重载配置,服务器启动时设置,默认on。
sysaudit.userevent
用户事件审计开关,包括:客户端登录和退出,默认on。
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用户密码。
只要打开审计开关以及服务器事件或者用户事件的开关,总是在审计中记录发生的服务器事件,不需要设置审计策略。
下表为审计策略与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 | 定义用户 | |
DML | 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 | 移除用户 | |
FUNCTION | 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 | 查询语句。从数据库中检索数据的过程 或命令叫做查询。在 SQL 语句里SELECT 命令用于指定查询。 |
SEQUENCE | CREATE SEQUENCE | 定义序列 |
ALTER SEQUENCE | 更改序列定义 | |
DROP SEQUENCE | 移除序列 | |
SYSTEM | ALTER SYSTEM | 更改服务器配置参数 |
TABLE | CREATE TABLE | 定义表 |
ALTER TABLE | 更改表定义 | |
DROP TABLE | 移除表 | |
TRUNCATE | 清空一个或者一组表 | |
TRANSACTION | BEGIN | 开始事务块 |
COMMIT | 提交当前事务 | |
ROLLBACK | 中止当前事务 | |
SAVEPOINT | 在当前事务中定义保存点 | |
ROLLBACK TO | 回滚到指定保存点 | |
RELEASE | 释放指定的保存点 | |
START TRANSACTION | 开始事务块 | |
VIEW | CREATE VIEW | 定义视图 |
ALTER VIEW | 更改视图定义 | |
DROP VIEW | 移除视图 |
具体的 SQL 命令内容可参考 SQL语句参考手册
注意
数据库在审计过程中,需要先读取审计规则,之后使用审计规则判断,才能生成审计记录。如果在读取审计规则前,就出错,可能无法生成审计记录。
注意
关于ALL类型审计:
1.ALL类型审计可以设置语句级和模式对象级,但都不能指定对象
2.不推荐使用ALL类型审计,对性能有影响
启用语句审计:
sysaudit.set_audit_stmt(audit_type text, audit_users text, audit_schema text, audit_objs text )
参数说明:
audit_type
语句级审计策略,支持DML、DDL、TCL语句等。
可以指定审计某一种SQL命令。
详见 表7.3.1 审计策略与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);
模式对象级审计发生在具体的对象上的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 (rule_id int)
对象审计示例:
审计 user1 用户对 public 模式下的表 t1 的任意操作。
SELECT sysaudit.set_audit_object('table', 'user1', 'public', 't1');
取消id为10002的审计设置。
CALL sysaudit.remove_audit (10002);
审计策略设置可通过系统视图 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 | 策略设置者名 |
审计策略可以使用sys_dump和sys_restore进行备份恢复,操作步骤如下:
1.分别使用sao和sso对每个配置了审计策略的数据库进行备份,例如:
./sys_dump -d test -p 54321 -U sao -W -F c -f audit_test1.dmp ./sys_dump -d test -p 54321 -U sso -W -F c -f audit_test2.dmp
2.分别使用sao和sso对新data实例进行恢复,例如:
./sys_restore -p 54321 -U sao -W -d test audit_test1.dmp ./sys_restore -p 54321 -U sso -W -d test audit_test2.dmp
注意
当数据库需要进行升级时也可以使用上述方法升级审计配置,但要在数据库升级前执行第一步即审计配置备份,升级完成后执行第二步恢复审计配置。
提示
审计配置备份恢复时,sys_dump和sys_restore不能指定-a参数,会导致审计配置无法备份恢复; 如果要指定--section参数,需要指定为post-data。
--system用户创建测试表t1 \c - system create table t1 (a int); --sao用户配置审计规则 \c - sao alter system set sysaudit.enable = on; select sys_reload_conf(); select sysaudit.set_audit_stmt('insert table','system','public','t1'); --system执行SQL语句触发审计 \c - system insert into t1 values (1); --sao用户查看审计日志 \c security sao select count(*) from sysaudit_record_sao where opr_type = 'INSERT'; count ------- 1 (1 row)
当启动参数 sysaudit.ids 设置为true时,实时侵害检测系统会实时分析用户的操作,将其与系统中创建的实时侵害检测规则进行匹配,判断该用户操作是否是侵害行为。 当检测到侵害行为次数达到阀值时,服务器将自动断开连接。
启用入侵检测:
sysaudit.create_ids_rule(rulename text, actionname text, username text, schname text, objname text, when_ever text, IP text, start_end_time text, interval_time int, times int)
参数说明:
rulename
创建的审计入侵检测规则名,具有唯一性,大小写敏感,不可指定为null。
actionname
审计类型名,取值详见审计策略与SQL命令对应表,不可指定为null。
username
审计用户名,未设置时需要指定为null。
schname
审计模式名,未设置时需要指定为null。
objname
审计对象名,未设置时需要指定为null。
when_ever
审计时机,取值 ALL/SUCCESSFUL/FAILED ,指定为null时默认取值FAILED。
IP
审计的IP列表,以’,’隔开。例如'"192.168.0.1","127.0.0.1"。指定为null时为检测所有IP地址。
start_end_time
审计的时间串,指定为null时为检测所有时间,格式如下:
start_end_time ::= 具体时间段项 {, 具体时间段项}
具体时间段项 ::= 开始时间 TO 结束时间
interval_time
时间间隔,单位为分钟,不可指定为null。
times
检测次数阀值,不可指定为null。
返回值说明:
无返回值。
删除入侵检测规则:
sysaudit.drop_ids_rule(rulename text)
参数说明:
rulename
审计入侵检测规则名,指定为null时将删除所有入侵检测规则。
显示当前检测规则:
sysaudit.show_ids_rules()
审计入侵检测实例:
创建审计入侵检测规则。
SELECT sysaudit.create_ids_rule('rule1', 'create table', null, null, null, 'ALL', '127.0.0.1', '09:00:00 TO 10:00:00', 10, 3);
删除审计入侵检测规则。
SELECT sysaudit.drop_ids_rule('rule1');
显示审计入侵检测规则。
SELECT sysaudit.show_ids_rules();
提示
入侵检测日志sysaudit_ids_log和检测结果sysaudit_ids_result存储在数据库SECURITY中,审计管理员sao可以查看。
发送邮件功能
当启动参数 sysaudit.ids_mail_enable 设置为true时,可以在入侵检测达到阀值时向指定邮箱发送提示邮件。
邮件相关参数说明
sysaudit.ids_mail_server
指定邮箱所在的服务器。
sysaudit.ids_mail_port
指定邮箱服务器的端口号。
sysaudit.ids_mail_login
登录服务器使用的用户名。
sysaudit.ids_mail_password
登录服务器的用户名对应的密码。
sysaudit.ids_mail_from
邮件的发送方网址。
sysaudit.ids_mail_to
邮件的接收方方网址。
提示
上述邮件相关参数均不可为空,否则将无法发送邮件并会警告提示。
--system用户创建测试表t1 \c - system create table t1 (a int); --sao用户配置审计规则 \c - sao alter system set sysaudit.enable = on; select sys_reload_conf(); select sysaudit.set_audit_stmt('insert table','system','public','t1'); --sao用户配置入侵检测规则 \c - sao alter system set sysaudit.ids = on; select sys_reload_conf(); select sysaudit.create_ids_rule('rule1','insert table','','','','ALL','','',10,2); --system用户执行违规操作 \c - system insert into t1 values (1);--error insert into t1 values (2);--error --达到违规次数强制断开连接
数据库审计员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 with time zone | 操作时间 |
result | text | 操作成功是success,失败是failure |
record_type | smallint | 审计记录类型(预留) |
aud_client | text | 客户端名字 |
server_type | text | 集群时服务器类型,M是主机,S是备机 |
7.5.2.1. 使用前配置
审计记录可以通过手动调用函数或者设置自动转储参数的方式进行转储, 转储之前要提前设置转储目录, 否则会转储失败。不推荐将转储目录放在data目录下。
数据库审计员sao登录数据库后,可以审计转储目录:
--设置审计转储目录为/home/test/audlog alter system set sysaudit.auditlog_dump_dir = '/home/test/audlog';
注意
审计转储目录必须设置为绝对路径,且目录必须存在,否则会导致转储失败
7.5.2.2. 功能使用
7.5.2.2.1. 审计转储参数
KingbaseES的审计转储参数设置如下:
sysaudit.auditlog_dump_dir
设置转储文件保存的目录, 路径必须是绝对路径,默认为空。使用审计转储功能之前必须设置此参数。
sysaudit.enable_auto_dump_auditlog
是否开启自动转储功能, 默认为false。
sysaudit.max_auditlog_size
触发自动转储时, 审计记录表的最大占用空间, 默认为16MB。
sysaudit.auditlog_alarm_percent
触发自动转储时, 审计记录占用表最大空间的比例, 默认为80%。
sysaudit.auditlog_auto_dump_days
触发自动转储时, 以当前时间为基准, 自动转储多少天之前的审计记录, 默认为0天。
7.5.2.2.2. 审计转储的系统函数
数据库审计员sao可以通过调用系统函数进行审计转储:
函数名 | 参数列表 | 描述 |
sysaudit.dump_auditlog | days(int) | 转储days天之前的所有审计日志 |
sysaudit.show_audlog_dump_file | 无参数 | 输出显示转储目录下的所有转储文件 |
sysaudit.restore_auditlog | filename(text) | 恢复文件名为filename的转储文件内的审计日志 |
启用审计转储:
sysaudit.dump_auditlog(days int)
参数说明:
days
转储时将当前时间之前days天之前的审计日志转储到指定目录。
返回值说明:
无返回值。
查看转储文件:
sysaudit.show_auditlog_dump_file();
参数说明:
无参数。
返回值说明:
filename
转储产生的文件名。
filesize
转储文件的大小。
恢复审计日志:
sysaudit.restore_auditlog(filename text);
参数说明:
filename
要恢复的转储文件的名字。
返回值说明:
无返回值。
7.5.2.2.3. 审计转储示例
数据库审计员sao登录数据库后,可以直接进行审计转储的配置及使用:
alter system set sysaudit.auditlog_dump_dir = '/home/test/audlog'; select sys_reload_conf();
上述配置中,将审计转储文件的保存目录设置为/home/test/audlog。
--将1天之前的所有审计日志转储 select sysaudit.dump_auditlog(1); --查看转储目录下的所有转储文件 select sysaudit.show_audlog_dump_file(); --将AUDIT_DUMP_FILE-2021-12-10_170855文件内的所有审计日志恢复到数据库中 select sysaudit.restore_auditlog('AUDIT_DUMP_FILE-2021-12-10_170855');
注意
如有需要修改sao用户密码的情况,请在修改之后使用sys_encpwd客户端工具配置sao密码,否则会导致无法记录审计日志。