使用 Fail2Ban 擊退所有試圖未經授權存取伺服器的人!
大家好,我是無能。從上一篇文章https://soulminingrig.com/blog/what\-country\-is\-the\-person\-trying\-to\-gain\-unauthorized\-access\-to\-my\-server\-via\-ssh/中,我確認到在短短一天內有來自太多 IP 的存取嘗試。雖然我一直以來都漫不經心地運作著,而且實際上從未被未經授權存取過,但還是應該採取對策。
話說回來,日誌文件累積太多變得難以查看也讓我有點不悅。因此,我打算導入 Fail2Ban,它是我以前安裝 iRedMail 時作為依賴項安裝的,當時我就對它很感興趣。
這是什麼?
透過日誌審核,當達到設定的嘗試次數時,可以封鎖整個 IP。
此外,當有嘗試時,也可以透過 iptables 丟棄封包本身。[安裝
這次我是以 root 身份登入,所以不使用 sudo。我搜尋 pkg 後出現了以下套件,所以將其安裝。
pkg install py311-fail2ban-1.1.0
基本上不建議更改 fail2ban.conf 本身設定檔,而是建議建立並編輯 jail.conf。因此這次我將針對
SSH, Postfix, Dovecot
這三個服務的登入嘗試進行設定,因為我非常討厭這些嘗試。
此外,我查閱了許多網站,發現不僅可以設定秒數,還能設定 1w (一週) 和 1d (一天),所以我將進行大膽的設定。我會毫不留情地封鎖一週。
~ # cat /usr/local/etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
bantime = 1w
findtime = 1d
maxretry = 5
[postfix]
enabled = true
port = smtp,ssmtp,submission
logpath = /var/log/maillog
bantime = 1w
findtime = 1d
maxretry = 10
action = block-drop[name=postfix, port=smtp, protocol=tcp]
[dovecot]
enabled = true
port = pop3,pop3s,imap,imaps,submission
logpath = /var/log/maillog
bantime = 1w
findtime = 1d
maxretry = 10
action = block-drop[name=dovecot, port=imap, protocol=tcp]
雖然似乎最好建立一個 [default] 區塊,但我會先觀察,只對這三個服務進行設定,如果需要再添加。順帶一提,設定為一週的原因是:
-
因為我現在是透過金鑰認證登入,所以不可能出錯。
-
郵件伺服器一旦登入後會持續保持登入狀態一段時間,所以很少會手動嘗試登入。
-
一旦被封鎖,我希望連同封包一起丟棄。
-
一天內登入錯誤超過 5 次本身就很奇怪。
所以這算是相當嚴格?還是寬鬆呢?我不喜歡縮短封鎖時間而消耗資源,所以才這樣設定。順帶一提,HTTP 伺服器似乎也能封鎖 GET 方法。https://hana-shin.hatenablog.com/entry/2023/05/24/210949由於我只將這台伺服器作為中間伺服器使用,所以尚未導入,但如果需要的話,我可能會嘗試導入。此外,我額外設定了 action = block-drop,其設定如下。
# cat /usr/local/etc/fail2ban/action.d/block-drop.conf
[Definition]
actionstart = iptables -N f2b-<name>
iptables -A f2b-<name> -j DROP
iptables -I INPUT -p all -j f2b-<name>
iptables -I FORWARD -p all -j f2b-<name>
actionstop = iptables -D INPUT -p all -j f2b-<name>
iptables -D FORWARD -p all -j f2b-<name>
iptables -F f2b-<name>
iptables -X f2b-<name>
actioncheck = iptables -n -L INPUT | grep -q 'f2b-<name>[ ]'
actionban = iptables -I f2b-<name> -s <ip> -j DROP
actionunban = iptables -D f2b-<name> -s <ip> -j DROP
基本上,一旦封鎖,我就會讓封包直接被丟棄 (Drop)。我回想起來也有 Reject 這個選項,重新查看後發現https://serverfault.com/questions/157375/reject-vs-drop-when-using-iptables結果是,Reject 應該在你想讓對方知道被拒絕時使用,所以這次是封鎖,我決定毫不留情地將封包連同其本身一起丟入黑暗中。
啟動與正常性確認
因為是 FreeBSD,所以用這個啟動
service fail2ban start
如果顯示 'Server ready' 就表示正常。查看日誌以確認是否正常運作。
# tail /var/log/fail2ban.log
2024-07-24 13:34:05,654 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:05,755 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:05,884 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:06,000 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:05
2024-07-24 13:34:06,317 fail2ban.actions [39963]: WARNING [sshd] already banned
2024-07-24 13:34:06,731 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:34:06
2024-07-24 13:37:14,327 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:37:14
2024-07-24 13:42:12,266 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:12
2024-07-24 13:42:17,389 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:17
2024-07-24 13:42:23,357 fail2ban.filter [39963]: INFO [sshd] Found - 2024-07-24 13:42:23
雖然原本會顯示 IP 位址,但這次我已經妥善隱藏了。這麼快就被封鎖了,上鉤了!!!!小鬼!!!!我在心裡這樣吶喊著。
(反正對方是機器人,對著機器想什麼呢?) 我把這種無聊的勝利姿勢收起來,並在 /etc/rc.conf 中添加以下內容,讓它能自動啟動。
fail2ban_enable="YES"
這樣即使伺服器重新啟動,程序也會自動啟動。
那麼今天就到這裡。順帶一提,我也在想,將至今為止的日誌中,有哪些使用者名稱嘗試登入的資訊顯示在圖表中,或許會很有趣。下次再見了。