nginx发展多年,自身的安全漏洞比较少,发现软件漏洞,一般利用软件包管理器升级一下就好了。
在做安全加固的时候,我们一定要头脑清晰,手里拿着刀,一刀一刀的切,将我们不想要的流量干掉,除去隐患。
1、屏蔽IP
假设我们的 站只是一个国内小站,有着公司业务,不是靠广告生存的那种,那么可以用geoip模块封杀掉除中国和美国外的所有IP。这样可以过滤大部分来自国外的恶意扫描或者无用访问。不用担心封杀了 络蜘蛛。主流的 络蜘蛛(百度/谷歌/必应/搜狗)已经包含在了我们的IP范围内了。如果是公 的登录后台,更应该屏蔽彻底一点。
1 2 3 | if ( $geoip_country_code !~ ^(CN|US)$ ) { return 403; } |
(很多人担心geoip库不够准确,诚然,中国城市级别的IP段会有误差,但是国家级别的IP段一般是没有问题的,并且geoip库可以随时在线更新)
2、封杀各种user-agent
user-agent 也即浏览器标识,每个正常的web请求都包含用户的浏览器信息,除非经过伪装,恶意扫描工具一般都会在user-agent里留下某些特征字眼,比如scan,nmap等。我们可以用正则匹配这些字眼,从而达到过滤的目的,请根据需要调整。
1 2 3 4 5 6 | if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) { return 403; } if ($http_user_agent ~* "" ) { return 403; } |
这里分析得不够细致,具体的非法user-agent还得慢慢从日志中逐个提取。
通过上面两个大招,相信你的日志里很快就会有大量的403记录。,我们接着干。
(如果 站提供公共api,注意与开发者约定好UA,防止撞墙)
3、封杀特定的url
特定的文件扩展名,比如.bak
1 2 3 | location ~* .(bak|save|sh|sql|mdb|svn|git|old)$ { rewrite ^/(.*)$ $host permanent; } |
知名程序,比如phpmyadmin
1 | location /(admin|phpadmin|status) { deny all; } |
4、封杀特定的http方法和行为,比如
1 2 3 4 5 6 7 | if ($request_method !~ ^(GET|POST|HEAD)$ ) { return 405; } if ($http_range ~ "d{9,}" ) { return 444; } |
5、强制 站使用域名访问,可以逃过IP扫描,比如
1 2 3 |