访问行为识别模块
来自SEnginx
目录 |
访问行为识别模块
概要
访问行为识别模块的作用是对用户访问网站的行为进行监控,在和其他功能模块(例如基于条件的限速功能和机器人缓解功能)配合使用的情况下,可以使得一些动作的执行更加准确,例如对CC攻击和页面扫描的判断等场景。
目前此模块只支持敏感URL访问识别一种模式,其他行为模式的支持会逐渐添加。
此功能在1.5.10之后的SEnginx中提供。
命令
ip_behavior_zone
语法 | ip_behavior_zone zone=name:size sample_base=times sample_cycle=cycle; |
默认值 | |
上下文 | http |
定义一个IP分析zone,需要指定三个参数:
- zone=name:size,name为zone的名称,size是占用的内存大小,可用单位有m,k等;
- sample_base=times,指定有效采样的请求数量,times为整数值;
- sample_cycle=cycle,指定采样的周期,单位可以为s秒和m分钟,只有在采样周期内达到sample_base次数的请求才会被计算访问行为。
举例:
ip_behavior_zone zone=abc:10m sample_base=10 sample_cycle=2s;
定义一个10MB大小的zone,采样周期是2秒,最小有效请求数量是10个。
ip_behavior
语法 | ip_behavior zone=name type=type; |
默认值 | |
上下文 | server |
在server上启用一个IP分析zone,需要指定二个参数:
- name,name为之前定义的zone的名称;
- type:指定要进行分析的模式,目前只支持sensitive_url,即敏感url访问行为识别一种模式。
举例:
server { ip_behavior zone=abc type=sensitive_url; }
在某server上开启zone abc并进行敏感url访问行为识别。
ip_behavior_sensitive
语法 | ip_behavior_sensitive; |
默认值 | |
上下文 | location |
指定某个location下的资源为敏感资源,此命令可以出现在多个location中
举例:
server { location ~* .*\.php { ip_behavior_sensitive; ... } }
没有标明成sensitive的location则视为非敏感的资源。
变量
$insensitive_percent
返回某个IP地址的非敏感url的访问占全部访问的比例,可以在ifany、ifall和if中使用,一般用于设置条件限速功能的condition。例如:
ifall ($insensitive_url >= 0) ($insensitive_url < 30) { set $cond 1; }
配置示例
将访问行为识别模块其他模块组合使用,可以实现多种不同的功能。
和基于条件的限速模块组合使用
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/; } } }
说明:只有大量访问敏感url的行为会被限速,否则不执行限速动作。
和机器人缓解模块组合使用
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; } }
说明:对短时间内大量访问敏感url的IP地址进行机器人挑战,挑战失败10次会被加入到动态IP黑名单中,挑战成功的可以继续访问资源。
和基于条件的限速模块以及机器人缓解模块组合使用
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; ... } } }
使用限速功能的forbid_action将阻断的请求进行机器人缓解挑战,如果挑战成功,则放行,否则继续挑战以缓解后端php-fpm和数据库的压力。