|
6 z) ~- v# B3 |" r4 k; S5 {% u" s
1. 介绍自从了解了error和access日志的重要性,并且学会阅读相关log文档之后通过调整nginx配置,解决error中的大量报错提示通过过滤js等静态资源减少大量的access日志记录内容同时,经过使用阿里云安全组封禁大量国外ip地址的访问。 1 o. J; W; X" x9 R/ x) n$ `% y7 X
我的access.log文件和error.log的尺寸得到了有效压缩管理access.log 从原先的12m左右的的文件,变成了现在的400KB记录的访问数据也清晰了很多error.log也从原先的8M左右的文件,变成了现在的1KB,或者300Bytes的文件。 - K( E. x! r( Y
甚至有时候还是0 Bytes日志文件的减少,也降低了服务器的IO读取的性能开支可以将更多的内存资源用于处理正常的请求可以说是一个双赢的结局本篇作为一个回顾总结内容具体的error文件内容配置可以参考:https://zinyan.com/?p=450 ,https://zinyan.com/?p=453。
- V$ b4 U3 L, f- P9 `+ n+ } access.log的文件配置可以参考:https://zinyan.com/?p=445,https://zinyan.com/?p=444,以及爬虫屏蔽过滤返回444:https://zinyan.com/?p=454。
6 ~" O9 {3 f2 O" B 2. 总结现在error文件中,剩下的记录主要就是SSL: error:141CF06C:SSL routines:tls_parse_ctos_key_share:bad key share异常了处理这个异常,可以通过封禁ip地址的访问,也可以不用在意。 6 I6 \0 k% E. R5 p& Q' {
剩下的就是access.log文件了当我们配置UserAgent请求中带有爬虫关键字的请求直接返回444之后,例如:Status:444,Bytes:0,IP:185.117.225.171,Time:[ 0 m. d2 V) |/ P6 O
2022-11-24T04:18:36+08:00],Host:"zinyan.com",Request:"GET /robots.txt HTTP/1.1",Referer:"-",UserAgent 4 u) I1 ~$ e! T+ ?8 h. Q/ ]# C% B
:"python-requests/2.28.1"Status:444,Bytes:0,IP:51.77.247.119,Time:[2022-11-24T04:57:39+08:00],Host:"47.101.47.241" : c. i" ]# f6 u {/ D$ F* C
,Request:"POST /phpinfo HTTP/1.1",Referer:"-",UserAgent:"curl/7.64.0"对比不同日期的access.log 可以发现,爬虫请的数量在不断变少。
5 J+ ~# M/ Q" G- y* v, G B ?3 } 因为当爬虫多次请求得到结果是444后,会渐渐降低我们网站的爬取级别,最终犹豫得不到数据而放弃爬取但是,也会有一些新增加的爬虫需要我们注意,并添加到过滤条件中而且也有一些过滤无法生效的情况,需要我们随时进行一些配置的修改例如:。 ( u1 U: L- n- y7 s t8 r
Status:404,Bytes:177,IP:18.195.96.149,Time:[2022-11-24T04:58:10+08:00],Host:"zinyan.com",Request:"GET /s/.git/HEAD HTTP/1.1"
2 W7 B# |# Q1 h- z. _ ,Referer:"-",UserAgent:"RepoLookoutBot/1.0.0 (abuse reports to abuse@repo-lookout.org)"Status:404,Bytes 9 a, Z z, [- a0 M0 A/ L
:186,IP:18.195.96.149,Time:[2022-11-24T04:58:42+08:00],Host:"zinyan.com",Request:"GET /categories/.git/HEAD HTTP/1.1" 3 X& r( K5 M$ t9 V
,Referer:"-",UserAgent:"RepoLookoutBot/1.0.0 (abuse reports to abuse@repo-lookout.org)"我们需要新增:RepoLookoutBot 爬虫工具的过滤。
6 s I( d2 L2 x, f- z" N 还有通过CensysInspect 工具:Status:400,Bytes:248,IP:167.248.133.62,Time:[2022-11-24T07:17:24+08:00],Host:"47.101.47.241:443"
- O7 [" f1 T( | c" {/ b) R ,Request:"GET / HTTP/1.1",Referer:"-",UserAgent:"Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/)"
# s/ r+ s$ y8 i! T& N: m9 ] 同时在屏蔽过程中出现了有些能够屏蔽而有些无法屏蔽的问题:Status:444,Bytes:0,IP:167.248.133.62,Time:[2022-11-24T07:17:20+08:00],Host
( O- B; u* d& e' _ :"47.101.47.241:443",Request:"GET / HTTP/1.1",Referer:"-",UserAgent:"-"Status:400,Bytes:248,IP:167.248 ) o2 g; F3 I7 y' U* e) |+ L" B. i
.133.62,Time:[2022-11-24T07:17:23+08:00],Host:"47.101.47.241:443",Request:"GET / HTTP/1.1",Referer:"-"
6 q4 ~ w% i$ }4 C$ V0 _ ,UserAgent:"-"两种访问从access.log中看到,可以说完全一样但是却一个返回444,一个返回400 返回444说明我的nginx过滤规则生效了而400说明没有生效同时,还需要添加上Host为空的访问,将它们进行过滤,例如:。
; @; B( b8 B) s' q" S4 ~. ` Status:400,Bytes:150,IP:167.248.133.62,Time:[2022-11-24T07:17:24+08:00],Host:"-",Request:"PRI * HTTP/2.0" # g( ^) d" q7 Y) r7 J* |
,Referer:"-",UserAgent:"-"同时,我们也可以检查静态资源是否全部都过滤的情况,例如我的资源用到了jfif,webp文件我就需要添加到过滤规则中去PS:可能存在部分的过滤失败,但是整体上来说。
) E! d! g6 y) E3 G( s 提高了网站的安全性,降低了大量的非法请求在收获上来说,这一些配置的付出是值得的3. 改进 nginx过滤规则基于发现的问题,再次改进access的过滤规则以及非法请求返回444的判断逻辑3.1 修改access_log 记录。 + |# D1 D- {. a+ ~6 v; i
在/etc/nginx/nginx.conf文件中修改如下:
+ o# T% R: q' y8 F- O& c http {
) u0 G) {' r+ Z. k ...
* a$ }- \7 \: S log_format main Status status,Bytes body_bytes_sent,IP remote_addr,Time:[$time_iso8601],Host:"$http_host",Request:"$request",Referer:"$http_referer",UserAgent:"$http_user_agent"
$ ?; f- O5 t" ?, y2 p* \' R ;: u& X4 t! o! W
map $uri $zinyanloggable {% F" G1 _) G8 O4 }
default 1;9 j6 `) n) H' d. l: e- O
~^(.*\.(ico|gif|jpg|jpeg|png|bmp|swf|js| & K6 ^0 N/ ~- ~) k( F- x
css|svg|woff|ttf|jfif|webp)$) 0;9 S/ ]& z3 E8 u7 N) A1 a! {( a
}- T2 ]$ {5 z$ L5 _
access_log /var/log/nginx/access.log main if=$zinyanloggable;* ^, B% {# b- [ X& g* p. a$ Z1 s
...1 [% j6 s8 E) T& }
} , b8 K+ c( [8 ~0 b9 M) F
这样,access文件中就不会添加ico|gif|jpg|jpeg|png|bmp|swf|js|css|svg|woff|ttf|jfif|webp 作为后缀结尾的日志内容了3.2 map实现爬虫屏蔽。 ! M9 x9 r/ G3 N' k0 ^5 _0 p& M
老版本写法为: server{0 G' ?1 r' ], p8 ^
...$ p7 v( T% S* t2 X0 ?) z5 p
if ($http_user_agent ~ ^$){0 [9 d% U# M; r& H* x" m1 I9 u
return444;
7 u) q7 N' X9 Q }( r! ^% Y6 `4 w, H0 u6 f- c
if ($http_user_agent ~* 1 `0 T* R( ]3 ]
"scrapy|python|curl|java|wget|httpclient|okhttp|MJ12bot|Expanse|ahrefsbot|seznambot|serpstatbot|sindresorhus|zgrab" . T- u, ]$ P' c2 b, S
){6 ~) l" f2 k; j# h
return444;& t3 Z5 f# u; d% X& a; {
}7 ?0 R7 I. B& _
...
# O$ t$ w, O) Y }效率比较低,如果是多个server那么得写多遍所以修改为map的规则进行但是如果改为map的话,需要在http{}之中先创建map规则,然后再到server中使用就可以了。 $ X! h2 u V* j
示例如下: http {4 G- W# A `( A0 i3 O4 I2 x! X( R
...
7 f! e/ p" N8 S0 V9 t+ j* C. S% n # 创建一个屏蔽规则zinyanUA,而它的取值从$http_user_agent 中获取
3 l# R# L! q h; C map $http_user_agent $zinyanUA {
" Y7 X) ]' m& D default 。
/ A3 B- g2 o2 x. A% [# D9 b 0;3 ~2 K; r6 t% i9 P" O' `, C
~*(scrapy|python|curl|java|wget|httpclient|okhttp|MJ12bot|Expanse|ahrefsbot|seznambot|serpstatbot| + `/ e+ K9 M6 w9 D
sindresorhus|zgrab|censys|RepoLookoutBot) 1;2 D, t& }4 i Y" d6 H
~ ^$ 1;
& t* _3 {; S* F6 s1 W }
. o9 Q/ `7 L/ u/ r ...% C4 y0 b1 S5 M4 j/ t/ s
}语法解释:~ 表示正则表达式对大小写敏感~* 表示正则表达式对大小写不敏感。
3 h% f! I! f& h: G/ g g 后面跟着的内容就是正则表达式了在正则表达式中^代表开头,$代表结尾,^$就代表开头和结尾中间没有字符也就是字符串为空的配置完毕后,在需要的server{}段中添加:server{: G3 P. w. T. B3 t+ y. c' e
...* F2 \' U( \3 {( F
。 . S/ V4 N U7 k
if ($zinyanUA){8 `" `3 n+ e% i: n0 ?
return 444;! b( N) w D) i n+ V
}
! G6 P" H5 m% U2 h8 M7 x- r ...
1 u4 K- K- b% t }因为在nginx 的if判断中,参数值0或者为空字符串,会判断为false,其他判断为true。 ( c) M# i S# ] r; Y; Q
而我在上面创建的map对象中,规范了,如果匹配就返回1,不匹配返回0所以if ($zinyanUA)为true的就是需要返回444的请求了nginx: [emerg] unknown directive "if($http_host)" in /etc/nginx/conf.d/zinyan.conf:49 nginx: configuration file /etc/nginx/nginx.conf test failed。 + y }$ w2 b4 _+ d* V: {$ E
如果你出现了这个if命名错误的提示,并不是所谓的缺乏if命名的依赖库,而是Nginx中的if命名和括号中间需要有空格nginx -t 检测通过后,通过service nginx reload刷新配置就可以生效了。 ! f" K. E: T$ H g* j V
PS:如果实在过滤不了的,建议直接封IP地址,特别是国外的访问。国内也有不少的攻击 5 k: a N8 D5 n1 w4 ~$ s
+ }* U& ]; R+ L- ]
. i. v; M( Y4 F
1 b5 K1 z! ?9 O2 M5 T3 W! |6 N* t; t! E) m& j# R o4 ?
|