使用 Fail2Ban 擊退所有試圖未經授權存取伺服器的人!

6 min

language: ja bn en es hi pt ru zh-cn zh-tw

大家好,我是無能。從上一篇文章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-&LTname>  
              iptables -A f2b-&LTname> -j DROP  
              iptables -I INPUT -p all -j f2b-&LTname>  
              iptables -I FORWARD -p all -j f2b-&LTname>  
  
actionstop = iptables -D INPUT -p all -j f2b-&LTname>  
             iptables -D FORWARD -p all -j f2b-&LTname>  
             iptables -F f2b-&LTname>  
             iptables -X f2b-&LTname>  
  
actioncheck = iptables -n -L INPUT | grep -q 'f2b-&LTname>[     ]'  
  
actionban = iptables -I f2b-&LTname> -s &LTip> -j DROP  
  
actionunban = iptables -D f2b-&LTname> -s &LTip> -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"  
  

這樣即使伺服器重新啟動,程序也會自動啟動。


那麼今天就到這裡。順帶一提,我也在想,將至今為止的日誌中,有哪些使用者名稱嘗試登入的資訊顯示在圖表中,或許會很有趣。下次再見了。

Related Posts