Linode上的CentOS 7 安裝fail2ban

身為Web developer,手上應該都會因為專案需求或者是單純玩耍用的主機,當然,如果只是單純地租用VPS服務想要拿來做簡單測試用,上面的資料或是伺服器本身完全不重要,壞了直接重新配置也無所謂的話,付點小錢馬上就可以完成這些動作,不過在絕大多數的情況下我們都會需要做防止伺服器被攻擊的手段。

暴力破解是常見的攻擊手法,簡單且有效,而為了延長被破解的時間,通常在配置伺服器時習慣會將密碼的複雜度盡可能的提高,但這並不是完全解決問題的方法,最多只能做到拖延時間,讓攻擊者感到攻擊行為不符效益知難而退,而除了設置複雜的密碼以外,fail2ban能幫助防止攻擊者能不斷的重複嘗試正確密碼。

Linode在初始選擇OS時有推薦使用的新版OS,考量安全性的問題上我選擇了比以往我熟悉的CentOS還要來得新版的CentOS 7,由於CentOS 7推出的時間有點短,一些package目前為止還並不是那麼完整,很多情況下都還必須自行編譯安裝,其他還有像是一些常用指令的變更與系統設定不同讓我吃了一些苦頭,不過很幸運的fail2ban基本上在CentOS 7上已經準備好了,所以只要使用yum進行安裝便可。

為你的CentOS加上EPEL

在開始使用yum進行安裝前,我們得先安裝EPEL repository for CentOS 7.x,才能從yum找到fail2ban,詳細文章可以參考Install EPEL and additional repositories on CentOS and Red Hat

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-2.noarch.rpm
sudo rpm -Uvh epel-release-7*.rpm
安裝fail2ban
yum install fail2ban

在此基本上就已經完成了,過去在CentOS 5, 6上我曾參考過 CentOS安裝fail2ban記事 來完成設定,不過在CentOS 7上安裝的 fail2ban 0.9-9.el7 與前版本有些異動調整,這會在後面提到。

配置fail2ban

開啟fail2ban.conf (/etc/fail2ban/fail2ban.conf),找到 logtarget 修改log檔存放目標。

logtarget = /var/log/fail2ban.log

這個動作主要是特別指定fail2ban的log個別紀錄,以便要是fail2ban在執行上出問題時方便找紀錄,雖然在過去透過yum安裝的fail2ban版本在logtarget上會設定SYSLOG,但這次透過yum安裝的fail2ban原先的設定值已經分開,其他像是 socket, dbfile ...等等設定基本上並沒有必要修改,所以實際上並不用修改fail2ban.config。

為fail2ban設置拒絕連線的設定 (jail - 監獄)

修改jail.conf (/etc/fail2ban/jail.conf) ,最直覺的設定是這樣做沒錯,不過在官方建議下我們不應該直接修改jail.conf,應該要另外使用不同的檔案例如jail.local,或是把分開的.conf放在jail.d資料夾底下

Line 5 in file jail.conf.
# Changes: in most of the cases you should not modify this file, but provide customizations in jail.local file, or separate .conf files under jail.d/ directory

因此,我需要先將jail.conf複製一份成jail.local,而若是想要讓設定更清楚地分開,可以在jail.d下新增像是 /etc/fail2ban/jail.d/sshd.conf 的檔案。

cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

請注意,jail.local將會直接覆蓋jail.conf的所有設定,因此,不能因為在jail.local內只設定你想客製的區塊,其他仰賴jail.conf的預設。

準備好之後開始修改jail.local,配置需要的設定。首先先找到 [DEFAULT] 區塊,將一些預設動作做些修改。

[DEFAULT]
# 忽略過濾ip使用空白隔開加上自己常用的ip網段,以免哪天要是忘了登入密碼可以多試幾次,沒錯,只是多試幾次,真的忘了也沒救XD
ignoreip = 127.0.0.1/8 your.host1.ip your.host2.ip
# 將重複測試的處罰時間加長,這邊是以秒數計算,設置為0則永久禁止連線
bantime = 1209600    # 14天、2週
# 在超過最多可以重複錯誤的次數後要在幾秒內被封鎖
findtime = 600       # 預設值不動
# 最多可以重複錯誤的次數
maxretry = 3         # 預設值5次讓我覺得不上不下,因此改成3次算是個人偏好,選3好像牽扯到心理學來著但其實不是這麼了解
backend = auto       # 這個項目維持不變

再來找到 [sshd] ,或是加上區塊。 這邊與過去的版本不同,並沒有 [sshd-iptable] 如果使用舊版本請修改 [sshd-iptables] ,可以參考 CentOS安裝fail2ban記事

# 如果是直接複製jail.conf成jail.locale可以在jail.locale的前幾行找到這塊,將註解取消即可。
[sshd]
enabled = true

到此就設定完成了,不過記得要將服務開啟並掛上開機啟動。

systemctl start fail2ban
systemctl enable fail2ban

檢查fail2ban是否有正常啟動。

fail2ban-client status

如果正常啟動可以在Jail list裡面找到剛才開啟的sshd。
fail2ban-client-status

如何手動解除fail2ban的封鎖

fail2ban限制連線上預設使用iptables,在當某個ip被禁止後可以在iptables內發現fail2ban新增了一些規則。
banned-list-in-iptables

如果管理者需要手動允許將某個被禁止的ip再次連線,直覺反應是我們可以從iptable內刪除規則,這可行,但並不建議這麼做,在此強烈建議各位不要從iptable增刪f2d-sshd的規則我們可以使用fail2ban-client去進行相關的動作

解除fail2ban的封鎖

fail2ban-client set sshd unbanip you.wantto.unban.ip

手動加入封鎖

fail2ban-client set sshd banip you.wantto.ban.ip

而實際上也可以透過fail2ban-client來看目前有哪些ip被禁止連線

fail2ban-client status sshd

其他的fail2ban-client指令則可以參考 fail2ban-client commands wiki

Banned ip list真不知道要不要show出來,感覺好像公布攻擊者的ip也無所謂