2016-01-12 3 views
0

Я написал правило для предупреждения события ssh с «неудавшимся паролем». Это правило находится здесь:Как накапливать факты с одинаковым значением поля в drools

rule "Hello World" 
    when 
    accumulate(m:Message(eventType=="Failed password") over window:time(59s);s:count(m);s>3) 
    then 
    System.out.println("success"); 
    Alert alert=new Alert("ssh","test"); 
    insert(alert); 
end 

Это работает для первого сценария. Но я хочу расширить это правило. Я хочу накопить событие ssh с «неудавшимся паролем» с тем же адресом Src_ip. Например, если у меня 4 сбойного события ssh sys в 59s из трех разных src_ip, это правило не соответствует, но когда у меня есть 4 сбойного события ssh ssh в 59s из одного src_ip, правило совпадает. Как я должен переписать это правило для этого сценария.

+0

Вы говорите о некоторых свойствах (ssh, src_ip) без четкой индикации, к какому классу они принадлежат. Добавьте классы Java в свой вопрос. - Кроме того, логика не ясна. Как насчет 4 неудачных событий из * two * different src_ip? Или три из одного src_ip? Или 10 из трех разных src_ip? ;-) – laune

+0

«тогда» часть правила здесь не важна. мой вопрос связан с «когда» частью правила. с этим правилом, если есть 4 события ssh с типом «сбойным паролем» в 59s из любого src_ip, которое соответствует правилу, а «then» часть правила выполняется. Но я хочу переписать это правило в соответствие только тогда, когда 4 ssh-события с типом «сбойного пароля» в 59-х годах имеют одинаковое значение в файле src_ip. –

+0

с этим правилом эти правила запускают правило: ts: "1: 1: 1", eventype: "сбойный пароль", src_ip: "1.1.1.1" ts: "1: 1: 3", eventype: "failed пароль ", src_ip:" 1.1.1.1 " ts:" 1: 1: 7 ", eventype:" failed password ", src_ip:" 1.1.1.5 " ts:" 1: 1: 9 ", eventype:" failed password ", src_ip:" 1.1.1.7 " Я хочу переписать правило для запуска только с этими событиями: ts:" 1: 1: 1 ", eventype:" failed password ", src_ip:" 1.1.1.1 " ts : «1: 1: 3», eventype: «failed password», src_ip: «1.1.1.1» ts: «1: 1: 7», eventype: «сбойный пароль», src_ip: «1.1.1.1» ts : «1: 1: 9», eventype: «failed password», src_ip: «1.1.1.1» –

ответ

0

Вам нужно одно сообщение, чтобы выбрать определенный IP-адрес; то вы можете накапливать другие с одинаковым значением.

rule "Four or more" 
when 
    $ml: Message(eventType == "Failed password", $ip: src_ip) 
    not Message(eventType == "Failed password", src_ip == $ip, this after $ml) 
    accumulate(Message(eventType == "Failed password", src_ip == $ip) 
     over window:time(59s); s:count(1); s > 3) 
then 
    System.out.println("success"); 
    Alert alert=new Alert("ssh","test"); 
    insert(alert); 
end 
+0

этот код делает ошибку: Поле Reader не существует для объявления '$ ip' в 'предикате' e ventType == "Failed password" '' в правиле 'sshbrute': [Имя правила = 'sshbrute'] Поле Reader не существует для объявления '$ ip' в 'предикате' src_ip == $ ip '' в rule 'sshbrute': [Название правила = 'sshbrute'] Невозможно проанализировать выражение src_ip == $ ip: [Ошибка: не удалось разрешить метод с использованием строгого режима: com.sample.Message.src_ip()] [ Near: {... src_ip == $ ip ....}] –

+0

Возможно, вы не скопировали правило правильно. Какую версию Drools вы используете? – laune

+0

Drools версия 6.3 –

Смежные вопросы