■山東 張科
根據IDS系統發現,筆者單位的Nginx一天遭受攻擊176次,根據Nginx的日志顯示,其中96.5%的攻擊被Nginx拒絕且響應403,3.4%響應400。然后在網上尋求幫助,發現網易的工程師在使用Fail2ban,感覺挺靠譜就部署上了。

圖1 Fail2ban的原理
Fail2ban的原理是獲取系統服務的消息日志,根據日志的內容匹配自定義的規則,從而觸發自定義的動作;它與Windows下的RdpGuard原理相同,它是運行在Linux平臺上的一個動態防御系統。
例如:定義某IP在10分鐘內訪問Nginx時返回403的響應5次,那么Fail2ban就會調用iptables封禁該IP。
單位系統采用Centos7,安裝阿里云的EPEL后,使用“yum install-y Fail2ban”安裝。
Fail2ban結構如圖2所示。
在Nginx里面的虛擬主機配置上添加過濾條件,如圖3所示。
然后配置jail.conf,創建“Nginx-403”,然后輸入“enabled=true”。
在下面創建規則,如圖4所示。
然后在filter.d目錄下創建Nginx.conf:

重啟Fail2ban,使用命令“systemctl restart Fail2ban”

圖2 Fail2ban結構

圖3 添加過濾條件

圖4 自建的Nginx防御規則
配置Fail2ban的日志輪轉:

cp jail.conf jail.local(修改前cp一下jail.conf文件,如果不cp為local會導致啟動出錯)。
使用yum安裝完成之后配置文件會帶一些規則,但是規則默認不開啟。
將里面enabled=false修改為true即可啟動。
測試開啟ssh enabled=true。
之后使用Hydra進行SSH暴力破解攻擊后SSH連接已被阻斷。
查看Fail2ban的日志后,發現ban了Hydra的攻擊源IP。
如圖5所示,Fail2ban將SSH攻擊機用iptables封禁。
修改MySQL的配置文件/etc/my.cnf。
添加log_warnings=2,如圖6所示。
重啟數據庫systemctl restart mairadb。
在filter.d里面添加規則mysqld.conf:

修改jail.conf,添加mysql的配置:


圖5 Fail2ban將SSH攻擊機用iptables 封禁

圖6 添加log_warnings=2


Fail2ban經過一周的公網測試,效果顯著,針對測試發生的問題進行以下解釋:
1.客戶忘記密碼,多次嘗試然后被封禁的問題。調整SSH的封禁策略,設置3次/秒登錄失敗即封禁,手速再快也很難每秒輸錯3次密碼,包括出口NAT的情景下,一般只有機器破解才會高頻率登錄失敗。此方案適用于SSH和MySQL等密碼登錄的保護。
2.Nginx和Apache的Web保護需要根據當前的環境配置正則表達式,筆者采用了只能通過域名訪問Web的控制,其余訪問皆返回403,如果想要防掃描,那就將deny all改為return 444。