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