WSo2 Siddhi:如何计算满足条件的事件数量

时间:2018-01-25 13:21:42

标签: stream wso2 complex-event-processing wso2cep siddhi

我正在使用一个用例来检测基于某些传入事件的登录暴力攻击。为此,我必须使用wso2 + siddhi(不是可选的)。

Code I&ve; ve build的结构是:

  1. 为每个受攻击的目标创建一个分区
  2. 创建5秒的窗口
  3. 对于属于上一个窗口的每个事件,选择其类别为" attempt.login"
  4. 的所有条目
  5. 将它们插入新表格。
  6. 一旦我在新表中有每个条目,我想知道表中存储了多少事件,以便能够检测蛮力(如果事件数大于20,例如,这意味着正在发生暴力攻击。)

    partition with (Target_IP4 of I_Events)
    begin
        from I_Events[Category == 'Attempt.Login']#window.time(5 sec)
        select meta_EventTime, correlation__id, Source_IP4, Source_Proto, Source_Hostname, Target_IP4, Target_Proto, Target_Hostnmae, Category, count() as attempts
        insert into #login_attempts;
    
    
    
    from #login_attempts[attempts > 20]#window.time(5 sec)
        select ...
        insert into alert;
    
    end;
    

    从上面的代码中可以看出,我已尝试使用count()函数,但它不起作用,每次添加新元素时它只会将值增加1例如,添加的第一个元素将具有尝试= 1,第二个元素尝试= 2,等等。

    如果无法做出上述想法......至少有人知道如果给定条件满满,如何选择字符串的所有元素?例如,如果流的一个元素的属性设置为true,则从该流中选择所有元素。

1 个答案:

答案 0 :(得分:0)

您可以使用以下Siddhi查询来满足您的要求。

partition with (Target_IP4 of I_Events)
begin
from I_Events[Category == 'Attempt.Login']#window.time(5 sec)
select meta_EventTime, correlation__id, Source_IP4, Source_Proto, Source_Hostname, Target_IP4, Target_Proto, Target_Hostnmae, Category, count() as attempts
having attempts > 20
insert into alert;
end;

此前,在5分钟内进入相同目标ip的前20个事件将不会产生任何警报。之后,在20分钟内超过该限制的每个事件都将产生警报。这种实现的一个缺点是,如果你有大量不同的target_ip,它将导致大量的分区创建,这将导致服务器进入OOM。解决方法是使用group by

Tishan