Linux、網絡和安全服務器、網絡和安全對于一個成熟的網站來說,每天沒有受到幾次攻擊是說不過去的。
之前我寫過一個shell script,實現過“主動式防火墻”,即從訪問特征中找到潛在的威脅,通過iptables防火墻直接deny。大致原理也很簡單:
cat 日志,并通過awk從日志中分離出來源ip
通過sort + uniq -c 對IP和訪問數量進行統計
獲取訪問量最高的幾個來源,一旦達到閥值啟動iptables策略進行封堵。
這樣一個腳本只要定期通過cron服務調用就可以實現主動防火墻的效果。但時間一長,這個方法的弊端就體現出來,首先是不夠靈活,對于時間的粒度調整和黑白名單的設置上就很麻煩;其次是這種方法僅能針對某一種服務,例如apache的80號,對于類似全端口掃描之類的聯合攻擊反而起不到應有的作用。
本來我打算用python寫一個綜合的入侵日志分析+iptables調用框架,沒想到確實有先人已經早我很久實現了,這就是本文要介紹的fail2ban。
安裝fail2ban
還是ubuntu,apt庫中就有這個項目apt-get install fail2ban
service fail2ban start 啟動這個服務。
如果確實需要源碼編譯,可以到該項目的主頁下載源碼,安裝過程更接近于python擴展的安裝。需要說明的是fail2ban是基于gamin服務框架的,編譯時需要安裝python-gamin的支持庫。
配置服務
apt方式安裝后,/etc/fail2ban目錄下有幾個配置文件 fail2ban.conf 主要是定義了服務器的日志和監聽端口什么的,可以不去理會,直接打開jail.conf
[DEFAULT]為默認的配置配置參數很多,主要介紹幾個常用的吧:
ignoreip = 127.0.0.1/8 白名單地址,支持網段,多個地址之間用空格隔開。此地址段的地址不會被封堵。
bantime = 600 封堵時間,單位是秒
maxretry = 3 個人覺得這個配置有點誤導,其實是過濾器(后面說)過濾出來的日志中符合規則需要封堵的次數。
我們用默認的[ssh]服務來介紹針對于某一個服務的配置:
enabled = true 是否啟用,沒什么好說的
port = ssh 封堵端口,支持端口號和協議名兩種方式,多個端口用逗號隔開
filter = sshd 過濾器名稱,默認的過濾器在/etc/fail2ban/filter.d目錄下,以.conf結尾,本例中針對/etc/fail2ban/filter.d/sshd.conf
logpath = /var/log/auth.log 日志路徑
maxretry = 6 最大重試次數,同上
過濾器的配置其實很簡單,需要懂得使用正則表達式來進行日志過濾,
failregex = reject: RCPT from (.*)[]: 554 過濾的正則表達式,可以通過多行表示多個規則。
fail2ban還有一個客戶端工具叫做 fail2ban-client ,可以通過它完成整個fail2ban的配置,相對來說比較簡單,這里也就不累述了。
其他
個人覺得這個fail2ban是很方便的一個工具,幾乎不需要太多的配置。可能有的人需要通過程序端,例如php進行防火墻的操作,正如我現在所做的一樣,程序會定期將IP寫入一個文件中,通過過濾器直接取出ip進行封堵即可。