合 人大金仓KES安全之数据库审计
Tags: 整理自官网人大金仓国产数据库安全KES官方文档审计
7.1. 审计概述
对数据库系统中发生的动作(或事件),将其对应的操作对象、操作时间等信息记录下来的过程,称为审计。
任何系统的安全保护措施都不是完美无缺的,蓄意盗窃,破坏数据的人总是想方设法打破控制,审计功能将用户对数据库的所有操作自动记录下来放入审计日志中,审计员(sao)可以通过对审计日志的分析,对潜在的威胁提前采取有效地措施加以防范。KingbaseES数据库提供了一套完整的审计机制,用来保证对数据库中的各种行为进行监控,进而为数据库的安全、可靠和有效提供有力的保障。
7.2. 审计开关
7.2.1. 加载插件
KingbaseES数据库通过插件sysaudit实现审计功能,修改 kingbase.conf 文件中 shared_preload_libraries
参数。
1 shared_preload_libraries = 'sysaudit'
7.2.2. 审计的打开和关闭
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();
7.3. 审计策略的配置
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用户密码。
7.3.1. 服务器事件审计
只要打开审计开关以及服务器事件或者用户事件的开关,总是在审计中记录发生的服务器事件,不需要设置审计策略。
7.3.2. 语句级别审计
下表为审计策略与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类型审计,对性能有影响
启用语句审计:
12345 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这六种语句支持设置表名。
返回值说明:
无返回值
取消审计:
1 sysaudit.remove_audit (rule_id int)参数说明:
rule_id
审计策略编号(创建后可从sysaudit.all_audit_rules中查询)语句审计示例:
审计system用户的表创建动作。
1 SELECT sysaudit.set_audit_stmt('CREATE TABLE', 'system', null, null);审计用户user_a的表修改动作
1 SELECT sysaudit.set_audit_stmt('alter table', 'user_a', null, null);取消编号为10001的审计策略。
1 CALL sysaudit.remove_audit (10001);
7.3.3. 模式对象级别审计
模式对象级审计发生在具体的对象上的DML/SELECT操作,需要指定模式名及其对象名。只有对相应对象执行正确的设置才会触发审计,比如:为函数对象设置一个INSERT的审计策略将无法生效,因为数据库并不支持INSERT到一个函数。
启用对象审计:
1234 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
审计对象的名称,比如为表名、视图名、存储过程名。可以为空,表示审计指定模式下的所有此类对象。
返回值说明:
无返回值。
取消对象审计:
1 sysaudit.remove_audit (rule_id int)对象审计示例:
审计 user1 用户对 public 模式下的表 t1 的任意操作。
1 SELECT sysaudit.set_audit_object('table', 'user1', 'public', 't1');取消id为10002的审计设置。
1 CALL sysaudit.remove_audit (10002);
7.3.4. 审计配置查询
审计策略设置可通过系统视图 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 | 策略设置者名 |
7.3.5. 审计配置备份恢复
审计策略可以使用sys_dump和sys_restore进行备份恢复,操作步骤如下:
1.分别使用sao和sso对每个配置了审计策略的数据库进行备份,例如:
123 ./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实例进行恢复,例如:
123 ./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。
7.3.6. 示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | --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) |
7.4. 审计入侵检测
当启动参数 sysaudit.ids 设置为true时,实时侵害检测系统会实时分析用户的操作,将其与系统中创建的实时侵害检测规则进行匹配,判断该用户操作是否是侵害行为。 当检测到侵害行为次数达到阀值时,服务器将自动断开连接。
启用入侵检测:
12345678910 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)参数说明:
本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!