IP Behavior

Содержание

Обзор

Модуль IP behavior используется для поведенческого анализа пользователей при доступе к серверу. Этот модуль преимущественно используется в связке с другими модулями, например limit_req по условию и Robot Mitigation, позволяя SEnginx определять и блокировать ddos атаки 7 уровня и различные сканеры контента.
В настоящее время этот модуль поддерживает только анализ доступа к чувствительным URL. Анализ других поведенческих факторов будет реализован в будущих версиях (но это не точно).

Эта функция доступна начиная с SEnginx версии 1.5.10.

Директивы

ip_behavior_zone

Синтаксис ip_behavior_zone zone=name:size sample_base=times sample_cycle=cycle;
По умолчанию
Контекст http

Чтобы определить зону поведенческого анализа, нужно указать 3 параметра:

  • zone=name:size, name это название зоны, size обозначает сколько памяти для зоны будет использовано в m (мегабайты), k (килобайты) и т.д.;
  • sample_base=times, указывает количество запросов к контенту зоны, целое число без знака;
  • sample_cycle=cycle, указывает временной интервал, в течение которого производится анализ, значение может быть s (секунды) или m (минуты).

Количество запросов к контенту зоны рассчитывается пока временной интервал между текущим и предыдущим запросом меньше, чем sample_cycle. Количество запросов начинает отсчитываться заново, если интервал между текущим и предыдущим запросом больше sample_cycle.
Пример:

ip_behavior_zone zone=abc:10m sample_base=10 sample_cycle=2s;

Здесь определяется зона размером 10MB, sample_cycle составляет 2 секунды, а минимальное количество запросов 10.


ip_behavior

Синтаксис ip_behavior zone=name type=type;
По умолчанию
Контекст server

Включает поведенческий анализ на уровне server. Эта директива принимает 2 параметра:

  • name, указывает название зоны, которая будет использоваться;
  • type, указывает режим. В настоящее время поддерживается только sensitive_url.


Пример:

server {
    ip_behavior zone=abc type=sensitive_url;
}

Включить зону abc на уровне server и установить режим sensitive_url для поведенческого анализа.

ip_behavior_sensitive

Синтаксис ip_behavior_sensitive;
По умолчанию
Контекст location

Указывает чувствительный location. Если location определен как чувствительный, все ресурсы в этом location будут трактоваться как чувствительные.
Пример:

server {
    location ~* .*\.php {
        ip_behavior_sensitive;
        
        ...
    }
}

Определить php файлы как чувствительные ресурсы, так как запросами к php файлам легко организовать ddos атаку 7 уровня.

Переменные

$insensitive_percent

Процент доступа к нечувствительным ресурсам от общего количества запросов. Значение рассчитывается для каждого IP адреса и может быть использовано в директивах ifany, ifall и if. Обычно значение используется для того, чтобы установить параметр condition в директиве limit_req по условию.
Примечание: $insensitive_percent равен -1 если не достигнуто минимальное значение количества запросов (sample_base), смотрите ip_behavior_zone.
Например:

ifall ($insensitive_percent >= 0) ($insensitive_percent < 30) {
    set $cond 1;
}

Примеры конфигураций

Работа с limit_req по условию

http {
    ...
    limit_req_zone $binary_remote_addr zone=cc:10m rate=1r/s;
    ip_behavior_zone zone=abc:10m sample_base=10 sample_cycle=2s;
    ...

    server {
         ...
         ip_behavior zone=abc type=sensitive_url;
         ...

         location ~ /.*\.php {
             limit_req zone=cc burst=1 condition=$cond;         
             ip_behavior_sensitive;

             ifall ($insensitive_percent >= 0) ($insensitive_percent < 5) {
                 set $cond 1;
             }

             fastcgi_pass 127.0.0.1:9000;
             ...
         }

         location / {
             root html/;
         }
    }
}

Для IP адресов, с которых производятся запрсы к большому количеству чувствительных ресурсов, будет ограничена скорость обработки запросов.

Работа с модулем Robot Mitigation

http {
    ...
    ip_behavior_zone zone=abc:10m sample_base=10 sample_cycle=2s;
    ...

    server {
         ...
         ip_behavior zone=abc type=sensitive_url;
         ...

         location ~ /.*\.php {
             ip_behavior_sensitive;

             ifall ($insensitive_percent >= 0) ($insensitive_percent < 5) {
                 return 599;
             }

             fastcgi_pass 127.0.0.1:9000;
             ...
         }

         location @process {
            ns_layer_force_run;

            robot_mitigation on;
            robot_mitigation_blacklist 10;

            fastcgi_pass 127.0.0.1:9000;
            ...
         }

         error_page 599 = @process;
    }
}

Проверить IP адреса, которые выполняют запросы к большому количеству чувствительных ресурсов за короткое время. IP адреса будут добавлены в черный список если не пройдут проверку 10 раз.

Работа с limit_req по условию и Robot Mitigation

http {
    ...

    limit_req_zone $binary_remote_addr zone=cc:10m rate=5r/s;
    limit_req_zone $binary_remote_addr zone=total:10m rate=30r/s;
    ip_behavior_zone zone=abc:10m sample_base=10 sample_cycle=1s;

    server {
        ...
        ip_behavior zone=abc type=sensitive_url;
        
        location / {
            root  html/;
        }


        ...


        location ~* .*\.php {
            limit_req zone=cc burst=1 forbid_action=@process condition=$cond;
            limit_req zone=total burst=5;


            ip_behavior_sensitive;


            ifall ($insensitive_percent >= 0) ($insensitive_percent < 30) {
                set $cond 1;
            }


            fastcgi_pass  127.0.0.1:9000;
            ...
	}


        location @process {
            ns_layer_force_run;
	    
            robot_mitigation on;
            robot_mitigation_mode js;

            fastcgi_pass  127.0.0.1:9000;
            ...
        }
    }
}

Проверять IP адреса с использованием действия forbid_action в limit_req.