网站安全加固
正在加载一言...
0x01 关闭不必要的端口
服务
端口
ssh
22
http
80
https
443
ftp
21,20000-30000
0x02 更改Nginx规则防止一些基础的网站攻击 分享一下我使用的Nginx配置 在站点配置里加入如下配置,可防止一些基础的SQL注入
1 2 3 4 5 6 7 8 if ($request_uri ~* "(cost\()|(concat\()") { return 403 ; }if ($request_uri ~* "[+|(%20)]union[+|(%20)]") { return 403 ; }if ($request_uri ~* "[+|(%20)]and[+|(%20)]") { return 403 ; }if ($request_uri ~* "[+|(%20)]select[+|(%20)]") { return 403 ; }if ($request_uri ~* "[+|(%20)]or[+|(%20)]") { return 403 ; }if ($request_uri ~* "[+|(%20)]delete[+|(%20)]") { return 403 ; }if ($request_uri ~* "[+|(%20)]update[+|(%20)]") { return 403 ; }if ($request_uri ~* "[+|(%20)]insert[+|(%20)]") { return 403 ; }
加入一下配置防止XSS
1 2 3 4 5 6 if ($query_string ~ "(<|%3C).*script.*(>|%3E)") { return 403 ; }if ($query_string ~ "GLOBALS(=|\[|\%[0-9A-Z] {0,2})") { return 403 ; }if ($query_string ~ "_REQUEST(=|\[|\%[0-9A-Z] {0,2})") { return 403 ; }if ($query_string ~ "proc/self/environ") { return 403 ; }if ($query_string ~ "mosConfig_[a-zA-Z_] {1,21}(=|\%3D)") { return 403 ; }if ($query_string ~ "base64_(en|de)code\(.*\)") { return 403 ; }
防止文件注入
1 2 3 if ($query_string ~ "[a-zA-Z0-9_]=http://") { return 403 ; }if ($query_string ~ "[a-zA-Z0-9_]=(\.\.//?)+") { return 403 ; }if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") { return 403 ; }
增加一些简单的规则防护
1 if ($query_string ~* ".*('|--|union|insert|drop|truncate|update|from|grant|exec|where|select|and|or|count|chr|mid|like|iframe|script|alert|webscan|dbappsecurity|style|confirm|innerhtml|innertext|class).*") { return 404 ; }
封杀各种爬虫,UA
1 2 3 4 if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) { return 403 ; }
如有需要可开启强制IP访问,防止扫描
1 2 3 if ( $host !~* 'abc.com' ) { return 403 ; }
0x03 开启Nginx自带的WAF 在宝塔—Nginx配置文件里有一行 #include luawaf.conf;取消注释并开启
0x04 开启Fail2Ban防止SSH FTP 爆破,网站扫描 所以用好 Fail2Ban 其实最重要的就是如何根据日志制定有效的监狱规则,规则制订完了还需要测试一下这个规则是否生效了,是否真的可以起到预期的目的。下面明月就结合一个实际的案例给大家具体的讲解一下:
如果经常分析 Nginx 站点日志的话,很多站长朋友们应该都会发现,站点经常收到很多返回码是 404 的请求
1 2 3 4 5 //plus/mytag_j.php?aid=6022 //plus/ad_js.php?aid=9090 //plus/ad_js.php?aid=8888 //plus/mytag_js.php?aid=8080 //utility/convert/data/config.inc.php
是返回 404 的,看似都是些很“正常”的无效访问而已,不过,仔细分析日志以及过往日志后就发现类似这种返回 404 结果的请求,这种行为的目的我们先不去深究,就这种频率绝对算是一种骚扰了,如果数量再大一些频率再高一些那影响和浪费的可就是服务器带宽和流量了。所以,这种请求必须进行应对措施,至少让其不能这么肆无忌惮呀!
借助 Fail2Ban 可以筛选出发送这些请求的 IP 地址来进行拦截屏蔽处理,根据日志中返回 404 的记录制定 Fail2Ban 监狱规则
命名为 **nginx-not-found.conf**,具体内容如下:
1 vim /etc/fail2ban/filter.d/nginx-not-found.conf
打开编辑 nginx-not-found.conf 监狱规则文件,注意一定要在/etc/fail2ban/filter.d/目录内哦。
1 2 3 [Definition] failregex = ^<HOST>.*"(GET|POST).*" (404|444|403|400) .*$ ignoreregex =
保存退出,再打开编辑 jail.local 启用这个监狱规则。
1 vim /etc/fail2ban/jail.local
添加下面的代码到 jail.local 里即可。同样的,注意 jail.local 文件的目录哦。
1 2 3 4 5 6 7 8 9 10 11 12 13 [nginxno404] #处理 nginx 下的恶意 404 结果扫描 enabled = true port = http,https filter = nginx-not-found action = iptables[name=nginxno404, port=http, protocol=tcp] #Fail2Ban 要监控的站点日志文件,大家可以根据自己站点来灵活调整。 logpath = /www/wwwlogs/access.log /www/wwwlogs/www.weblog.com.log bantime = 3600 #默认是屏蔽 IP 地址 10 分钟 #下面这两个是说 60 秒内 5 次 404 失败请求就开始屏蔽这个 IP 地址 findtime = 60 maxretry = 5
保存退出,重新启动 Fail2Ban:
1 systemctl restart fail2ban.service
这时候,我们换需要验证一下 nginx-not-found.conf 这个监狱规则是否能够生效也就是真正的发现日志文件中返回码是:404、444、403、400 中任意一个的记录,我们可以使用 fail2ban-regex 命令来验证这个规则,具体命令如下:
1 fail2ban-regex /www/wwwlogs/www.weblog.com.log /etc/fail2ban/filter.d/nginx-not-found.conf
上述命令就是用/www/wwwlogs/www.weblog.com.log 这个日志文件来测试/etc/fail2ban/filter.d/nginx-not-found.conf 监狱规则是否能够生效
在实际生产环境中使用这个监狱规则的时候不可避免的会出现“误封IP”的发生,一旦发现误伤我们就需要解除某个 IP 地址的屏蔽,这时候可以使用 fail2ban-client 命令来解除某给 IP 地址的屏蔽,比如:我们要解除 172.16.1.1 这个 IP 地址只需要**fail2ban-client set <监狱名称> unbanip <IP 地址>** 这样命令即可解除,如:
1 fail2ban-client set nginxno404 unbanip 172.16.1.1
运行成功后会返回解除屏蔽的 IP 地址,同时我们还可以查看[nginxno404]这个监狱的运行状况来查看已经屏蔽的 IP 地址有哪些:
1 fail2ban-client status nginxno404
这个命令会显示监狱[nginxno404]一共被触发了几次,施行屏蔽(Ban)IP 几次,IP 地址分别是哪几个