■山東 張科
根據(jù)IDS系統(tǒng)發(fā)現(xiàn),筆者單位的Nginx一天遭受攻擊176次,根據(jù)Nginx的日志顯示,其中96.5%的攻擊被Nginx拒絕且響應(yīng)403,3.4%響應(yīng)400。然后在網(wǎng)上尋求幫助,發(fā)現(xiàn)網(wǎng)易的工程師在使用Fail2ban,感覺挺靠譜就部署上了。
圖1 Fail2ban的原理
Fail2ban的原理是獲取系統(tǒng)服務(wù)的消息日志,根據(jù)日志的內(nèi)容匹配自定義的規(guī)則,從而觸發(fā)自定義的動作;它與Windows下的RdpGuard原理相同,它是運行在Linux平臺上的一個動態(tài)防御系統(tǒng)。
例如:定義某IP在10分鐘內(nèi)訪問Nginx時返回403的響應(yīng)5次,那么Fail2ban就會調(diào)用iptables封禁該IP。
單位系統(tǒng)采用Centos7,安裝阿里云的EPEL后,使用“yum install-y Fail2ban”安裝。
Fail2ban結(jié)構(gòu)如圖2所示。
在Nginx里面的虛擬主機(jī)配置上添加過濾條件,如圖3所示。
然后配置jail.conf,創(chuàng)建“Nginx-403”,然后輸入“enabled=true”。
在下面創(chuàng)建規(guī)則,如圖4所示。
然后在filter.d目錄下創(chuàng)建Nginx.conf:
重啟Fail2ban,使用命令“systemctl restart Fail2ban”
圖2 Fail2ban結(jié)構(gòu)
圖3 添加過濾條件
圖4 自建的Nginx防御規(guī)則
配置Fail2ban的日志輪轉(zhuǎn):
cp jail.conf jail.local(修改前cp一下jail.conf文件,如果不cp為local會導(dǎo)致啟動出錯)。
使用yum安裝完成之后配置文件會帶一些規(guī)則,但是規(guī)則默認(rèn)不開啟。
將里面enabled=false修改為true即可啟動。
測試開啟ssh enabled=true。
之后使用Hydra進(jìn)行SSH暴力破解攻擊后SSH連接已被阻斷。
查看Fail2ban的日志后,發(fā)現(xiàn)ban了Hydra的攻擊源IP。
如圖5所示,F(xiàn)ail2ban將SSH攻擊機(jī)用iptables封禁。
修改MySQL的配置文件/etc/my.cnf。
添加log_warnings=2,如圖6所示。
重啟數(shù)據(jù)庫systemctl restart mairadb。
在filter.d里面添加規(guī)則mysqld.conf:
修改jail.conf,添加mysql的配置:
圖5 Fail2ban將SSH攻擊機(jī)用iptables 封禁
圖6 添加log_warnings=2
Fail2ban經(jīng)過一周的公網(wǎng)測試,效果顯著,針對測試發(fā)生的問題進(jìn)行以下解釋:
1.客戶忘記密碼,多次嘗試然后被封禁的問題。調(diào)整SSH的封禁策略,設(shè)置3次/秒登錄失敗即封禁,手速再快也很難每秒輸錯3次密碼,包括出口NAT的情景下,一般只有機(jī)器破解才會高頻率登錄失敗。此方案適用于SSH和MySQL等密碼登錄的保護(hù)。
2.Nginx和Apache的Web保護(hù)需要根據(jù)當(dāng)前的環(huán)境配置正則表達(dá)式,筆者采用了只能通過域名訪問Web的控制,其余訪問皆返回403,如果想要防掃描,那就將deny all改為return 444。