WHCSRL 技术网

OSSIM Research Record (3)

2021SC@SDUSC


一、问题简述

在os-sim/mysql/db中05-create_post_correlation.sql的内容与其他sql文件有较大区别,(具体可见我上一篇博客)。代码主要以事件/进程的创建注销为主,其意义不详,让人看着头大。在这周我仔细阅读代码并查阅一些基础知识,再对其进行解析。

下图为部分代码示意

DROP PROCEDURE IF EXISTS select_post_correlation_index;

DELIMITER '|'

CREATE PROCEDURE select_post_correlation_index()
BEGIN
IF EXISTS
        (SELECT id FROM alienvault.post_correlation)
THEN
	SELECT id FROM alienvault.post_correlation order by id desc limit 1;
ELSE
	SELECT 1 as id;
        END IF;
END
|

DELIMITER ';'

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

二、代码分析

2.1、PROCEDURE

  • 创建存储过程,存储过程是保存起来的可以接受和返回用户提供的参数的 Transact-SQL 语句的集合。
    可以创建一个过程供永久使用,或在一个会话中临时使用(局部临时过程),或在所有会话中临时使用(全局临时过程)。

  • 用Create Procedure 创建存储过程的语法规则如下:
    CREATE PROC [ EDURE ] procedure_name [ ; number ]
    [ { @parameter data_type }
    [ VARYING ] [ = default ] [ OUTPUT ]
    ] [ ,…n ]
    [ WITH
    { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
    [ FOR REPLICATION ]
    AS sql_statement [ …n ]
    各参数的含义如下:
    procedure_name
    是要创建的存储过程的名字,它后面跟一个可选项number, 它是一个整数,用来区别一组同名的存储过程。存储过程的命名必须符合命名规则,在一个数据库中或对其所有者而言,存储过程的名字必须惟一。
    @parameter
    是存储过程的参数。在Create Procedure 语句中,可以声明一个或多个参数。当调用该存储过程时,用户必须给出所有的参数值,除非定义了参数的缺省值。若参数的形式以 @parameter=value 出现,则参数的次序可以不同,否则用户给出的参数值必须与参数列表中参数的顺序保持一致。若某一参数以@parameter=value 形式给出,那么其它参数也必须以该形式给出。一个存储过程至多有1024 个参数。
    Data_type
    是参数的数据类型。在存储过程中,所有的数据类型包括text 和image 都可被用作参数。但是,游标cursor 数据类型只能被用作OUTPUT 参数。当定义游标数据类型时,也必须对VARING 和OUTPUT 关键字进行定义。对可能是游标型数据类型的OUTPUT 参数而言,参数的最大数目没有限制。
    VARYING
    指定由OUTPUT 参数支持的结果集,仅应用于游标型参数。
    Default
    是指参数的缺省值。如果定义了缺省值,那么即使不给出参数值,则该存储过程仍能被调用。缺省值必须是常数,或者是空值。
    OUTPUT
    表明该参数是一个返回参数。用OUTPUT 参数可以向调用者返回信息。Text 类型参数不能用作OUTPUT 参数。
    RECOMPILE
    指明SQL Server 并不保存该存储过程的执行计划,该存储过程每执行一次都又要重新编译。
    ENCRYPTION
    表明SQL Server 加密了syscomments 表,该表的text 字段是包含有Create procedure语句的存储过程文本,使用该关键字无法通过查看syscomments 表来查看存储过程内容。
    FOR REPLICATION
    选项指明了为复制创建的存储过程不能在订购服务器上执行,只有在创建过滤存储过程时(仅当进行数据复制时过滤存储过程才被执行),才使用该选项。FOR REPLICATION与WITH RECOMPILE 选项是互不兼容的。
    AS
    指明该存储过程将要执行的动作。
    Sql_statement
    是任何数量和类型的包含在存储过程中的SQL 语句。

2.2、EVENT

mysql5.1版本开始引进event概念。event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发。通过单独或调用存储过程使用,在某一特定的时间点,触发相关的SQL语句或存储过程。
单独使用event调用SQL语句时,查看和创建需要用户具有event权限,调用该SQL语句时,需要用户具有执行该SQL的权限。Event权限的设置保存在mysql.user表和mysql.db表的Event_priv字段中。
当event和procedure配合使用的时候,查看和创建存储过程需要用户具有create routine权限,调用存储过程执行时需要使用excute权限,存储过程调用具体的SQL语句时,需要用户具有执行该SQL的权限。

2.3、具体实例


CREATE EVENT check_too_many_authentication_events1_schedule ON SCHEDULE
EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL '8' HOUR
COMMENT 'Check for IPS with more than 3 different Authentication events during the last 24 hours'
DO CALL alienvault.post_correlation_check_too_many_authentication_events1();

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

创建一个事件 check_too_many_authentication_events1_schedule,没有输入参数。
其语义是
每天 在当前时间戳+间隔“8”小时之内
调用alienvault.post_correlation_check_too_many_authentication_events1();、
目的是:检查在过去24小时内具有3个以上不同身份验证事件的IP

DROP PROCEDURE IF EXISTS post_correlation_check_too_many_access_events1;
DELIMITER '|'

CREATE PROCEDURE post_correlation_check_too_many_access_events1()
BEGIN
insert into alienvault.post_correlation(src_ip, ocurrences, plugin_id, plugin_sid) select e.ip_src as ip_src,count(ip_src) as cnt, 12001, 53 from alienvault_siem.acid_event as e, alienvault.plugin_sid as s where e.plugin_id=s.plugin_id and e.plugin_sid = s.sid and s.category_id= 3 and e.timestamp>=DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY) group by e.ip_src having cnt>=200;
END
|

DELIMITER ';'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

删除过程(如果存在)关联后检查过多访问事件1;
创建过程后相关性检查过多访问事件1。

总结

参考文献

1.用CREATE PROCEDURE 命令创建存储过程

推荐阅读