• 金仓数据库KingbaseES安全指南--7.数据库审计


    目录

    7.1. 审计概述

    7.2. 审计开关

    7.2.1. 加载插件

    7.2.2. 审计的打开和关闭

    7.3. 审计策略的配置

    7.3.1. 服务器事件审计

    7.3.2. 语句级别审计

    7.3.3. 模式对象级别审计

    7.3.4. 审计配置查询

    7.3.5. 审计配置备份恢复

    7.3.6. 示例

    7.4. 审计入侵检测

    7.4.1. 示例

    7.5. 审计记录管理

    7.5.1. 审计记录查询

    7.5.2. 审计记录转储


    7.1. 审计概述

    对数据库系统中发生的动作(或事件),将其对应的操作对象、操作时间等信息记录下来的过程,称为审计。

    任何系统的安全保护措施都不是完美无缺的,蓄意盗窃,破坏数据的人总是想方设法打破控制,审计功能将用户对数据库的所有操作自动记录下来放入审计日志中,审计员(sao)可以通过对审计日志的分析,对潜在的威胁提前采取有效地措施加以防范。KingbaseES数据库提供了一套完整的审计机制,用来保证对数据库中的各种行为进行监控,进而为数据库的安全、可靠和有效提供有力的保障。

    7.2. 审计开关

    7.2.1. 加载插件

    KingbaseES数据库通过插件sysaudit实现审计功能,修改 kingbase.conf 文件中 shared_preload_libraries 参数。

    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命令对应表:

    表 7.3.1 审计策略与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);
    

    7.3.3. 模式对象级别审计

    模式对象级审计发生在具体的对象上的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);
    

    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对每个配置了审计策略的数据库进行备份,例如:

    ./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。

    7.3.6. 示例

    --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时,实时侵害检测系统会实时分析用户的操作,将其与系统中创建的实时侵害检测规则进行匹配,判断该用户操作是否是侵害行为。 当检测到侵害行为次数达到阀值时,服务器将自动断开连接。

    启用入侵检测:

    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

    邮件的接收方方网址。

    提示

    上述邮件相关参数均不可为空,否则将无法发送邮件并会警告提示。

    7.4.1. 示例

    --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
    --达到违规次数强制断开连接
    

    7.5. 审计记录管理

    7.5.1. 审计记录查询

    数据库审计员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查询审计记录。

    表 7.5.1 视图结构如下表

    列名

    数据类型

    说明

    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. 审计记录转储

    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密码,否则会导致无法记录审计日志。

  • 相关阅读:
    02.nginx高可用负载均衡
    C语言实现扫雷游戏(分解代码,超级详细,无压力)
    Actor对象的引用 怎么设置他的材质?或设置是否启用重力?
    艾美捷细胞低密度脂肪酸(LDL)摄取试剂盒的功能&应用
    SpringMVC返回不带引号的字符串方案汇总
    sqoop同步命令从mysql同步到hive
    线性代数学习笔记8-3:二次型、合同矩阵、标准型、规范型
    Jedis连接池:JedisPool及连接池工具类搭建
    【新知实验室--音视频通话】腾讯云TRTC-实时音视频---多人会议视频通话SDK基础搭建
    洛谷 P1449 后缀表达式
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/126380189