|
4 F3 O* x! w5 ^* y( [. L
原文来源:https://blog.washmore.tech/articles/2017/08/09/1502257351914.html 最近有点忙,一段时间没管博客了,今天上来看了一下access.log,多了一些牛鬼蛇神,之前因为博客访问量少,没怎么弄,看来是时候带一波节奏了。 + |) s! r+ ` \( p$ ^( F3 t
之前的做法以前就已经陆续发现一些恶意用户访问了,比如:- 认为后端是java对tomcat的/manager进行访问的,- 认为后端是php做一些eval或者爆破操作的,- 一些独狼/个人蜘蛛用户不分时段对网站进行大规模爬取的
! G$ u% j1 g7 { 由于都是一些零散的访问,针对这些行为 在nginx.conf同目录下创建了一个denyIpList.conf配置文件,内容形式如下:# 针对单个ip的形式7 T/ q% {. K8 v
deny 171.94.171.205;
1 \8 q& x" X) F8 Y, j deny 115.29.166.101;/ X7 K7 Y4 u5 ^% D, K
deny 182.247.251.48;; i! r4 Q0 b1 m
deny 61.147.89.17;# B- K8 ]" B& n6 F7 O& R" H! W0 e# N& a
# 针对网段的形式
# \; a" [5 O- w; O4 o7 \+ S deny 66.249.227.0/24;
; z% z' h: _1 v% a. K3 @( g1 v 然后在nginx.conf合适的位置引入此配置文件:http {( w0 j& ?' Q; V4 `2 H$ v! X0 O( `
include mime.types;
0 C0 H) l7 y! [( `; l/ l include denyIpList.conf;/ N F/ j4 n2 @' N5 g
default_type application/octet-stream;# J9 N1 i+ A3 f4 N3 o# f
...以下省略 $ e+ v- y8 W8 m: ^9 C" @" U+ ?# H
重启nginx后生效,这样,当这些ip/网段发起访问后,直接返回403;现在的做法现象今早上来看了一下访问记录后,发现了几组丧心病狂的内容:1. user-agent为 Baidu-YunGuanCe-SLABot(ce.baidu.com) 的访问;
4 k3 }( _3 S3 M( k! e% Z 2. 来自美国66.249.*.*网段的访问;3. user-agent为 Mozilla/5.0 (compatible; MJ12bot/v1.4.7; … 的访问4. user-agent为空(正常浏览器访问不会为空的)
1 J# @. Z) n7 W% U& ? 分析其中第一个我刚开始以为是我配的百度云观测网站定期健康检查的访问记录,但是简单统计了一下,数量也太大了,而且不分时段都有,初步怀疑是有人闲着无聊借用百度云观测提供的工具对本站进行了友e情yi压测…即便不是,我也不需要云观测提供的特殊服务,准备直接ban掉; 9 u3 h* f- o( @5 b/ }% `. z/ C
第二个,应该是谷歌的爬虫(ua判断),以前也看到过访问记录,频率比较低,直接deny访问地址的,但是最近访问的ip也太多了,根本ban不过来;第三个,MJ12bot比较常用的爬虫工具,访问ip也是来自世界各地; ! q& @1 X% C1 ]$ ]1 N6 w9 }+ X
解决方案根据以上分析,发现大部分恶意请求可以通过user-agent来判断,因此,考虑通过nginx提供的一些内置变量进行配置:首先我们还是新建一个文件denyUaList.conf在nginx.conf同目录下;
2 h/ j0 G4 @$ R& f( W 编写denyUaList.conf规则内容:#禁止常用工具的抓取 if ($http_user_agent ~* (Scrapy|Curl|HttpClient|Java)) {
0 `- {) l/ Y: m5 C$ { return 403;3 v( j; m: M0 d" p* S* M e5 x
}. d! Q; D+ Y, B5 C* g
#禁止指定UA及UA为空的访问0 a4 a7 g. F3 N. i7 u$ U; e
if ($http_user_agent ~* "Baidu-YunGuanCe|FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|YisouSpider|MJ12bot|heritrix|EasouSpider|LinkpadBot|Ezooms|^$" )" R+ U, S1 y: Y# o) \ N
{) X. e. B/ S5 v9 x$ E& k
return 403;* \& y7 x, b: v: G
} ; n3 ?! Q% a% {% ~) h
tips:注意书写格式if和(之间有空格,|Ezooms|最后面有个|破折号,用于禁止空ua访问在nginx.conf中合适的位置引入denyUaList.conf...以上省略+ J. x2 n6 X, g: q7 ~
server {( N$ l2 ?9 o3 Y9 Q% o
listen 443 ssl;* k0 T0 `" I9 r" I" t) R k
server_name example.com;#你的域名
& e+ J1 p' M8 {( C0 u W ...ssl配置省略...3 F3 T8 t8 ]: C* ~8 f/ k$ M0 L5 u
include denyUaList.conf;...以下省略
, |* I4 c% y: S# g tips:注意因为denyUaList.conf包含if等控制语句,因此不能和denyIpList.conf一样放在根节点,需要自行根据需要放在server节点中以上就是目前的配置方案,如果后续有优化升级,会在本帖更新,如果有朋友有更合适的方案,请在留言中回复! 7 Q" x/ `5 T' {0 T& r# {" y9 f, t( |
测试在Baidu-YunGuanCe前增加chrome|,然后使用谷歌浏览器访问博客地址,返回403forbidden,切换为ie访问,正常进入(不过d大@88250竟然给了一个超low的提示(/ □ )),测试通过,去掉chrome|,重启nginx,收工!
7 M. a5 F1 T6 K T$ o$ o! j( p# ]9 {1 D9 Q
, y& Q# e2 {# y8 x1 n. h" w2 Q% T6 r$ h9 X' F8 g5 s8 ]7 Q
0 V, ?2 r" J% v# k+ l
|