金仓数据库KingbaseES- 数据库审计
关键字:
KingbaseES、audit、审计、人大金仓
审计
对数据库系统中发生的动作(或事件),将其对应的操作对象、操作时间等信息记录下来的过程,称为审计。
任何系统的安全保护措施都不是完美无缺的,蓄意盗窃,破坏数据的人总是想方设法打破控制,审计功能将用户对数据库的所有操作自动记录下来放入审计日志中,审计员(sao)可以通过对审计日志的分析,对潜在的威胁提前采取有效地措施加以防范。KingbaseES数据库提供了一套完整的审计机制,用来保证对数据库中的各种行为进行监控,进而为数据库的安全、可靠和有效提供有力的保障。
使用审计功能
1. 使用前进行配置
修改配置文件 kingbase.conf 文件中 shared_preload_libraries,增加审计插件 sysaudit:
shared_preload_libraries = 'sysaudit'
重启数据库
数据库审计员 sao 打开审计开关
/c - sso
alter system set sysaudit.enable = on;
select sys_reload_conf();
2. 配置审计功能
1) 默认审计
在initdb阶段可以通过参数启动默认审计功能:
./initdb -D data1 -Usystem -x123456 --init-audit-rules
2)配置参数
审计功能非常复杂,可配置的参数非常多,目前可配置参数如下图:
根据审计用户的不同,需要用不同用户进行审计规则设置:
数据库审计员 sao 负责设置对超级用户(包括数据库管理员 system)及数据库安全员 sso 的审计规则;数据库安全员 sso 负责设置对普通用户和数据库审计员 sao 的审计规则;
审计规则设置可以设置语句级审计和对象级审计(对象级审计只审计 insert、update、delete 和 select 四种语句),insert、update、delete 和 select 审计类型可以设置审计对象。
具体审计支持的审计类型可以参考数据库审计部分的安全手册
3)示例
数据库审计员 sao 和数据库安全员 sso 登录数据库之后,可以直接设置审计规则:
--数据库审计员 sao 设置语句级审计规则,审计类型为 select table 语句,审计用户为数据库管理员 system,审计对象为public 模式下的 tab1
select sysaudit.set_audit_stmt(‘select table’,’system’,’public’,’tab1’);
--数据库安全员 sso 设置对象级审计规则,审计类型为 table 对象,审计用户为普通用户 user1,审计对象为 public 模式下的 tab2
select sysaudit.set_audit_object(‘table’,’user1’,’public’,’tab2’);
数据库审计员 sao 和数据库安全员 sso 可以通过查询系统视图 sysaudit.all_audit_rules 查看自己设置了哪些审计规则:
select * from sysaudit.all_audit_rules;
数据库审计员 sao 和数据库安全员 sso 可以通过系统函数删除自己设置的审计规则:
--删除 oid 为 16384 的审计规则
select sysaudit.remove_audit(16384);
--删除当前用户设置的所有审计规则select sysaudit.remove_audit(null);
审计用例
--开启审计功能
\c – sao
alter system set sysaudit.enable = on;
--由sao对system进行审计
--创建表
\c test system
create table t_table(a int);
create table t_insert(a int);
--设置审计规则
\c - sao
call sysaudit.set_audit_object('table', 'system', 'public', 't_table');
call sysaudit.set_audit_stmt('insert table','SYSTEM','public','t_insert');
--查看审计规则
select * from sysaudit.all_audit_rules ;
--结果:
audit_id | audit_target | audit_type | audit_users | audit_schema | audit_objname | audit_objoid | creator_name
----------+--------------+--------------+-------------+--------------+---------------+--------------+--------------
16397 | Object | table | system | public | t_table | 16391 | sao
16398 | SQL | insert table | system | public | t_insert | 16394 | sao
(2 行记录)
--执行sql向表中插入数据
\c - system
insert into t_table values (1);
insert into t_insert values (2);
--查看审计记录
\c security sao
select username,db_name,rule_type,obj_type,schm_name,obj_name,sqltext,result from sysaudit_record_sao;
--结果:
username | db_name | rule_type | obj_type | schm_name | obj_name | sqltext | result
----------+---------+----------------+----------+-----------+----------+----------------------------------+--------
system | test | 表 | 表 | public | t_table | insert into t_table values (1); | 成功
system | test | 向表中插入数据 | | public | t_insert | insert into t_insert values (2); | 成功
(2 行记录)
--出现以上结果表明审计成功,否则说明审计失败
--审计system的所有操作
/c - sao
call sysaudit.set_audit_stmt('all','SYSTEM','','');
\c – system
create table t_all(a int);
insert into t_all values (1),(2),(3);
select * from t_all ;
delete from t_all;
select * from t_all;
\c security sao
select username,db_name,rule_type,opr_type,obj_type,schm_name,obj_name,sqltext,result from sysaudit_record_sao;
username | db_name | rule_type | opr_type | obj_type | schm_name | obj_name | sqltext | result
----------+---------+-----------+----------------+----------+-----------+----------+---------------------------------------+--------
system | test | 事件 | 用户登录 | | | | | 成功
system | test | 全部 | 创建表 | | | | create table t_all(a int); | 成功
system | test | 全部 | 插入 | | public | t_all | insert into t_all values (1),(2),(3); | 成功
system | test | 全部 | 设置 | | | | set ora_input_emptystr_isnull to off; | 成功
system | test | 全部 | 设置 | | | | set ora_input_emptystr_isnull to on; | 成功
system | test | 全部 | 设置 | | | | set ora_input_emptystr_isnull to off; | 成功
system | test | 全部 | 设置 | | | | set ora_input_emptystr_isnull to on; | 成功
system | test | 全部 | 查询 | | public | t_all | select * from t_all ; | 成功
system | test | 全部 | 删除 | | public | t_all | delete from t_all; | 成功
system | test | 全部 | 查询 | | public | t_all | select * from t_all; | 成功
system | test | 事件 | 用户退出 | | | | | 成功
--查询得出以上结果说明对system所有操作的审计成功
--删除审计规则
call sysaudit.remove_audit(16397);
call sysaudit.remove_audit(16398);
--审计登录登出事件
\c – sao
alter system set sysaudit.userevent = on;
alter system set sysaudit.serverevent = on;
call sys_reload_conf();
\c – system
\c security sao
select * from sysaudit_record_sao;
--初始化数据库时启用默认审计规则
./initdb -D data -Usystem -x123456 --init-audit-rules
上面演示了如何设置、查看和删除审计规则,并查看审计记录。