自建網站伺服器的簡易心得系列文(二) - 三個提升Server安全性的設定之Fail2ban篇
2024-03-27 17:29:56
**前言**
===
即使已經使用防火牆,為什麼還需要 Fail2ban 呢?因為通常會開放一些埠號,如 SSH,以供外部使用。因此,日誌中會記錄到一些嘗試暴力破解的行為。在這種情況下,Fail2ban 可以分析日誌信息,根據設置的規則來封鎖這些惡意登錄者的 IP 地址。這樣可以進一步提高伺服器的安全性。不過,需要注意設置規則時要小心,有時候甚至可能因為自己輸錯密碼而把自己的 IP 地址鎖在小黑屋裡。
Server Linux 版本: Ubuntu 22.04.3 LTS
**Fail2ban 簡單介紹**
===
Fail2ban 是一種用於防範惡意登入嘗試和拒絕服務攻擊的工具,它可以監視系統日誌文件,並在偵測到惡意行為後採取自動化措施來保護伺服器。
以下是Fail2ban 的基本運作原理和功能:
1. 監視日誌檔案:Fail2ban 會持續監視系統記錄文件,如SSH、Web 伺服器或其他服務的存取日誌。
2. 分析日誌:它會分析日誌檔案中的活動,偵測到惡意行為,例如多次失敗的登入嘗試、經常存取特定頁面等。
3. 動態阻止惡意IP:一旦發現惡意行為,Fail2ban 將根據預先定義的規則自動阻止相關IP 位址的訪問,可以將其新增至防火牆規則。
4. 自動解除封鎖:Fail2ban 也支援自動解除封鎖,即在一段時間後,自動解除封鎖IP 的限制。
5. 靈活的配置:Fail2ban 允許管理員定義自訂的規則和動作,以滿足特定的安全需求。可以設定監視的日誌檔案、偵測到的惡意行為、封鎖策略等。
透過以上機制,Fail2ban 可以大幅減少惡意存取和拒絕服務攻擊對伺服器的影響,並提高系統的安全性和穩定性。
**Fail2ban 基本安裝&設定指南**
===
#### **安裝 Fail2ban**
1. 安裝指令
``` bash
apt-get update && apt-get upgrade
sudo apt install fail2ban
```
2. 查看 Fail2Ban 狀態
``` bash
sudo systemctl status fail2ban
```
3. 如果沒有啟用,就把它打開
enable 代表未來系統重啟的話,也會自動啟動服務。
start 則是立即手動啟動,不用等待系統重啟。
``` bash
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
```
#### **Fail2Ban 設定**
Fail2Ban 的應用主要是要去根據需求去更改設定檔。
設定檔的位置 Ubuntu 系統位於 /etc/fail2ban/jail.conf。
`fail2ban.conf` 文件包含 Fail2Ban 的基本配置。通常會複製 `jail.conf` 的內容,然後創建一個 `fail2ban.local` 文件,將其用作主要的設定文件。
---
因為 fail2ban 有很多功能和複雜的設定,這邊今天只介紹一些簡單常用的設定:
1. **設定 IP 白名單**
`ignoreip` 的值可以是多個 IP 位址、CIDR 網段、DNS 主機名稱,各 IP 之間以空白分隔。
``` bash
ignoreip = 127.0.0.1/8 0.0.0.0
```
2. **設定封鎖時間**
`bantime` 參數可設定每一次阻擋攻擊來源的持續時間。
``` bash
ibantime = 7d
```
3. **惡意攻擊判斷標準**
`findtime` 參數表示一段觀察時間,而 `maxretry` 參數則是表示錯誤嘗試的次數。
當在 `fidntime` 所設定的時間內,達到 `maxretry` 所設定的錯誤次數時,就會被判定為惡意攻擊然後被封鎖。
``` bash
findtime = 10m
maxretry = 3
```
4. **各種預設服務**
預設的狀態只有啟用 sshd 服務的監控,所以設定好上面幾個簡單設定,就可以算是完成了基本的設定。其實在預設的設定檔中,還提供很多服務的預設設定,像是mysql, grafana, nginx-http-auth...。如果有需要可以再去開啟即可,因為大部分已經出現在設定檔案的服務的action, filter 早就已經寫好放在 `/etc/fail2ban/action.d/`, `/etc/fail2ban/filter.d/` 裡面。
#### **進階防護 - Fail2ban 結合 ufw 防火牆**
其實做好上一篇說的防火牆和設定基本的 Fail2ban 機制,已經可以做到一些基本的防護。 但如果要更近一步,我們可以把防火牆和 Fail2ban 做結合Fail2ban。 預期的效果會是,如果有人刻意訪問伺服器沒有公開的埠號時,也要建立機制把該 IP 封鎖。
但因為預設並沒有提供 ufw 的服務設定,我們就需要自己手動建立相關的 jail 和 filter 設定檔,那我們就來實做看看吧:
1. **jail.local 設定部分**
這隻檔案就是我們先前提到過的 Fail2ban 的主要設定檔,我們需要在裡面加入我們針對 ufw 的封鎖策略。
``` bash
[ufw]
enabled=true
filter=ufw.aggressive
action=iptables-allports
logpath=/var/log/ufw.log
maxretry=3
bantime=7d
```
2. **filter 設定部分**
現在要建立剛剛定義的 filter,在 `/etc/fail2ban/filter.d/` 新增一個
`ufw.aggressive.conf`。
``` bash
[Definition]
failregex = [UFW BLOCK].+SRC=<HOST> DST
ignoreregex =
```
3. **載入新的規則和檢查狀態**
剛剛已經把規則都設定好了,這時候需要讓它重新載入規則。
``` bash
sudo systemctl reload fail2ban
```
然後可以檢查一下現在新規則的狀態
``` bash
sudo fail2ban-client status ufw
```
#### **解除 Fail2ban 封鎖方法**
有時候當我們規則寫得越嚴謹,雖然會提高安全性,但也會增加把自己不小心誤封鎖的窘境。尤其結合防火牆去做封鎖時,小弟曾經因為一直想進去某個服務但忘記開啟該服務埠號,而慘遭封鎖。
當然如果有固定 IP,你就可以把該 IP永久加入白名單,就比較不會出現該問題。但如果沒有又不小心被封鎖了,可以依照以下步驟解除封鎖:
1. **先切換別的網路**
因為原本的 IP 被封鎖了,所以也無法透過 SSH 連線到 Server處理。
這邊特別注意在切換網路之前,先確保你剛剛在執行的服務有先關掉,不然你第二個 IP 有可能會馬上又被封鎖。
2. **如果知道自己被封鎖的 IP**
``` bash
sudo fail2ban-client unban <IP_ADDRESS>
```
如果不知道 IP 就執行下個步驟,查看封鎖資訊。
3. **查看封鎖的紀錄**
這邊要透過 Fail2ban 的 Log 來猜測自己可能是哪一個IP,所以最好在封鎖的時候看一下時間判斷一下,不然就要多嘗試幾個了。
``` bash
sudo cat /var/log/fail2ban.log
sudo less /var/log/fail2ban.log #查看更多資訊
```

範例圖

前兩條資訊代表`fail2ban`的`filter`模組監視日誌文件,當偵測到某個IP 位址頻繁出現並符合特定的規則時,它會記錄相關資訊。
1. `[ufw] Found 51.178.249.89`表示`fail2ban`
在日誌中發現了IP 位址為 `51.178.249.89` 的活動。
2. `[ufw] Ban 51.178.249.89`
表示`fail2ban`將IP `51.178.249.89`位址為的主機加入了`ufw`規則(jail)的封鎖清單中。
如果找到了就可以用第一個步驟的指令來解除封鎖。
4. **小補充 - 如果要解封被特定 Jail 封鎖的 IP**
剛剛第一步驟的指令是解除所有 Jail 封鎖的 IP,但如果今天只是要幫特定人員解除某個服務的封鎖,像是只想幫他解除 mysql 服務的封鎖,但 SSH想繼續封鎖他的 IP。就要指定 Jail 來下指令:
``` bash
sudo fail2ban-client set <JAIL_NAME> unbanip <IP_ADDRESS>
```
### **資料來源**
[搭配 Fail2ban 來使用 UFW | fernvenue's Blog](https://blog.fernvenue.com/zh/archives/ufw-with-fail2ban/)
[GitHub - Fail2ban](https://github.com/fail2ban/fail2ban)
[Linux作業系統如何限制SSH在一段時間內的嘗試登入次數,來避免被暴力破解登入? | MagicLen](https://magiclen.org/fail2ban-ssh/#google_vignette)
[Fail2Ban- 使用 Fail2Ban 保護您的 Linux 伺服器 - TAKI官方部落格](https://www.taki.com.tw/blog/%E4%BD%BF%E7%94%A8-fail2ban-%E9%85%8D%E7%BD%AE%E4%BF%9D%E8%AD%B7%E6%82%A8%E7%9A%84-linux-%E4%BC%BA%E6%9C%8D%E5%99%A8/)
[運用 Fail2ban 自動封鎖攻擊者的 IP | 艦長,你有事嗎?](https://chengweichen.com/2021/12/fail2ban-log4shell-log4j.html)
###### tags: `server` `fail2ban` `ufw`
點擊複製文章連結
X