2025年7月16日 星期三

Mapleboard MP510-50 測試 (三十) : 安裝入侵偵測監控軟體 Fail2ban

在前面的測試中我已完成 Ubuntu 預設防火牆 ufw 的設定, 參考 : 


本系列全部的測試紀錄參考 :


從 ufw 的日誌檔 (預設的 log 等級為 low) 可觀察到, 主機每天都接收到非常多的不明訪問, 它們可能是正在掃描網路的駭客流量, 或使用暴力破解法企圖登入主機的惡意攻擊, 除了防火牆允入的服務埠外的封包基本上都應該被阻擋掉. 

為了進一步增強主機安全性, 今天在 Mapleboard 上安裝了一個入侵偵測軟體 Fail2ban, 這是一個以 Python 撰寫的開放原始碼入侵防禦工具, 其工作原理是利用正規表達式監控指定的日誌檔 (例如 ssh 的 /var/log/auth.log 或 Nginx 的 /var/log/nginx/error.log) 來偵測異常訪問行為, 若達到過濾規則之封鎖條件 (例如 5 次失敗的嘗試), 就執行預先定義的操作 (例如透過 iptables 或 ufw 暫時封鎖該 IP, 預設 10 分鐘), 這樣就可以有效避免主機密碼遭到字典暴力破解, 達到保護伺服器目的, 參考 : 


Fail2ban 支援多種服務, 包括 SSH, HTTP, HTTPS, FTP, VNC, RDP,  Apache, 與 Nginx 等, 提供命令列與 Web 介面來監控與設置選項 (例如要監控的日誌檔, 過濾規則, 要採取之封鎖操作, 封鎖時間, 與指定警告頁面等). 

Fail2ban 會持續監控系統的日誌檔 (log files), 使用內建或自定義的過濾規則 (filter) 來判斷是否有攻擊事件發生, 當發現有 IP 地址進行下列可疑行為,  就會自動採取行動 (例如透過 iptable 暫時封鎖該 IP, 或寫入防火牆規則以及傳送通知 email 等), 避免伺服器受到攻擊 : 
  • 多次密碼登入失敗 (暴力破解) 
  • 嘗試存取不存在的網頁 (Web 掃描器)
  • 傳送垃圾信或攻擊郵件伺服器
Fail2ban 最常見的用途是防止 SSH 暴力破解; 其次是阻擋駭客使用網站漏洞掃描工具對 Nginx/Apahe 伺服器提出異常請求, 或者用來保護內部服務 (FTP, Samba 等) 不被暴力登入. 


1. 安裝 fail2ban : 

首先更新系統的套件清單 (package list) :

tony1966@LX2438:~$ sudo apt update   
[sudo] tony1966 的密碼:

此指令是讓主機知道有哪些軟體版本是最新的並更新系統的套件資料庫而已, 並不會安裝或升級任何套件 (sudo apt upgrade 指令才會安裝更新版本). 

然後用下列指令安裝 fail2ban :

sudo apt install fail2ban   

tony1966@LX2438:~$ sudo apt install fail2ban   
正在讀取套件清單... 完成
正在重建相依關係... 完成  
正在讀取狀態資料... 完成  
以下套件為自動安裝,並且已經無用:
  libatk1.0-0:armhf libavahi-client3:armhf libavahi-common-data:armhf libavahi-common3:armhf libbrotli1:armhf libbsd0:armhf libcairo-gobject2:armhf
  libcairo2:armhf libcups2:armhf libdatrie1:armhf libdbus-1-3:armhf libdeflate0:armhf libdrm-amdgpu1:armhf libdrm-nouveau2:armhf
  libdrm-radeon1:armhf libdrm2:armhf libedit2:armhf libegl-mesa0:armhf libegl1:armhf libegl1-mesa:armhf libelf1:armhf libexpat1:armhf libffi8:armhf
  libfontconfig1:armhf libfreetype6:armhf libfribidi0:armhf libgail-common:armhf libgail18:armhf libgbm1:armhf libgdk-pixbuf-2.0-0:armhf
  libgl1:armhf libgl1-amber-dri:armhf libgl1-mesa-dri:armhf libglapi-mesa:armhf libglib2.0-0:armhf libglvnd0:armhf libglx-mesa0:armhf libglx0:armhf
  libgnutls30:armhf libgraphite2-3:armhf libgtk2.0-0:armhf libharfbuzz0b:armhf libhogweed6:armhf libicu70:armhf libjbig0:armhf libjpeg-turbo8:armhf
  libjpeg8:armhf libllvm15:armhf libmd0:armhf libnettle8:armhf libp11-kit0:armhf libpango-1.0-0:armhf libpangocairo-1.0-0:armhf
  libpangoft2-1.0-0:armhf libpixman-1-0:armhf libpng16-16:armhf librsvg2-2:armhf librsvg2-common:armhf libsensors5:armhf libstdc++6:armhf
  libtasn1-6:armhf libthai0:armhf libtiff5:armhf libwayland-client0:armhf libwayland-server0:armhf libwebp7:armhf libx11-6:armhf libx11-xcb1:armhf
  libxau6:armhf libxcb-dri2-0:armhf libxcb-dri3-0:armhf libxcb-glx0:armhf libxcb-present0:armhf libxcb-randr0:armhf libxcb-render0:armhf
  libxcb-shm0:armhf libxcb-sync1:armhf libxcb-xfixes0:armhf libxcb1:armhf libxcomposite1:armhf libxcursor1:armhf libxdamage1:armhf libxdmcp6:armhf
  libxext6:armhf libxfixes3:armhf libxi6:armhf libxinerama1:armhf libxkbfile1:armhf libxml2:armhf libxrandr2:armhf libxrender1:armhf
  libxshmfence1:armhf libxtst6:armhf libxxf86vm1:armhf
使用 'sudo apt autoremove' 將之移除。
下列的額外套件將被安裝:
  python3-pyinotify whois
建議套件:
  mailx monit sqlite3 python-pyinotify-doc
下列【新】套件將會被安裝:
  fail2ban python3-pyinotify whois
升級 0 個,新安裝 3 個,移除 0 個,有 10 個未被升級。
需要下載 473 kB 的套件檔。
此操作完成之後,會多佔用 2,482 kB 的磁碟空間。
是否繼續進行 [Y/n]? [Y/n] Y
下載:1 http://ports.ubuntu.com jammy/universe arm64 fail2ban all 0.11.2-6 [394 kB]
下載:2 http://ports.ubuntu.com jammy/main arm64 python3-pyinotify all 0.9.6-1.3 [24.8 kB]
下載:3 http://ports.ubuntu.com jammy/main arm64 whois arm64 5.5.13 [53.7 kB]
取得 473 kB 用了 3s (164 kB/s)  
選取了原先未選的套件 fail2ban。
(讀取資料庫 ... 目前共安裝了 289158 個檔案和目錄。)
正在準備解包 .../fail2ban_0.11.2-6_all.deb……
解開 fail2ban (0.11.2-6) 中...
選取了原先未選的套件 python3-pyinotify。
正在準備解包 .../python3-pyinotify_0.9.6-1.3_all.deb……
解開 python3-pyinotify (0.9.6-1.3) 中...
選取了原先未選的套件 whois。
正在準備解包 .../whois_5.5.13_arm64.deb……
解開 whois (5.5.13) 中...
設定 whois (5.5.13) ...
設定 fail2ban (0.11.2-6) ...
設定 python3-pyinotify (0.9.6-1.3) ...
執行 man-db (2.10.2-1) 的觸發程式……

安裝完成後可在 /etc/fail2ban 目錄下找到 Fail2ban 的設定檔與模組化設定資料夾 : 
  • 主設定檔範本 : /etc/fail2ban/jail.conf (勿直接修改)
  • 過濾器規則 : /etc/fail2ban/filter.d/*.conf
  • 模組化設定機制資料夾 : /etc/fail2ban/*.d/
tony1966@LX2438:~$ ls -ls /etc/fail2ban  
總用量 64
 4 drwxr-xr-x 2 root root  4096 Jul 16 06:38 action.d
 4 -rw-r--r-- 1 root root  2816 Nov 24  2020 fail2ban.conf
 4 drwxr-xr-x 2 root root  4096 Mar 11  2022 fail2ban.d
 4 drwxr-xr-x 3 root root  4096 Jul 16 06:38 filter.d
28 -rw-r--r-- 1 root root 25071 Mar 11  2022 jail.conf 
 4 drwxr-xr-x 2 root root  4096 Jul 16 06:38 jail.d
 4 -rw-r--r-- 1 root root   645 Nov 24  2020 paths-arch.conf
 4 -rw-r--r-- 1 root root  2827 Nov 24  2020 paths-common.conf
 4 -rw-r--r-- 1 root root   650 Mar 11  2022 paths-debian.conf
 4 -rw-r--r-- 1 root root   738 Nov 24  2020 paths-opensuse.conf

其中 jail.conf 是 Fail2ban 套件原始預設值 (勿直接修改其內容), 通常只啟用 sshd 這個 jail 而已, 實務上我們應建立自己的 jail. 

在 Fail2ban 裡 jail 是指一種監控規則 (例如 sshd 或 nginx 等); filter 是指定義攻擊行為樣式的正規表達式 (regex), action 則是發現攻擊後的處理方式. 

Fail2ban 安裝完成後就可以用下表中的常用指令進行操作與設定 : 


 Fail2ban 常用指令  說明
 sudo fail2ban-client status  查看 Fail2Ban 整體狀態與目前啟用的 jail 列表
 sudo fail2ban-client status <jail名稱>  查看指定 jail 的詳細狀態,例如封鎖次數與 IP
 sudo fail2ban-client set <jail名稱> banip <IP>  手動將指定 IP 加入封鎖清單
 sudo fail2ban-client set <jail名稱> unbanip <IP>  手動解除已被封鎖的 IP
 sudo systemctl status fail2ban  檢查 Fail2Ban 服務狀態
 sudo systemctl start fail2ban  啟動 Fail2Ban 服務
 sudo systemctl restart fail2ban  重新啟動 Fail2Ban(套用設定變更)
 sudo systemctl enable fail2ban  設定開機自動啟動 Fail2Ban
 sudo fail2ban-client reload  重新載入 jail 設定,不會中斷服務
 sudo fail2ban-client ping  檢查 fail2ban 是否正在運作(應回傳 pong)
 sudo fail2ban-client flush <jail名稱>  清除指定 jail 所有封鎖紀錄(不推薦輕易使用)


首先用下列指令檢查服務狀態 :

sudo systemctl status fail2ban  

tony1966@LX2438:~$ sudo systemctl status fail2ban  
○ fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled)
     Active: inactive (dead)
       Docs: man:fail2ban(1)

可見預設 fail2ban 未啟動. 


2. 啟動 fail2ban 與設定開機自動啟動 : 

手動啟動 fail2ban 指令如下 :

sudo systemctl start fail2ban 

tony1966@LX2438:~$ sudo systemctl start fail2ban    
tony1966@LX2438:~$ 

再次檢查 fail2ban 服務狀態 :

tony1966@LX2438:~$ sudo systemctl status fail2ban  
● fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled)
     Active: active (running) since Wed 2025-07-16 06:49:50 CST; 42s ago
       Docs: man:fail2ban(1)
   Main PID: 462222 (fail2ban-server)
      Tasks: 5 (limit: 4213)
     Memory: 13.4M
        CPU: 1.044s
     CGroup: /system.slice/fail2ban.service
             └─462222 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Jul 16 06:49:50 LX2438 systemd[1]: Started Fail2Ban Service.
Jul 16 06:49:51 LX2438 fail2ban-server[462222]: Server ready

可見程式已啟動運行中. 

然後用下列指令將此服務設定為開機自動啟動 : 

sudo systemctl enable fail2ban 

tony1966@LX2438:~$ sudo systemctl enable fail2ban   
Synchronizing state of fail2ban.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable fail2ban
Created symlink /etc/systemd/system/multi-user.target.wants/fail2ban.service → /lib/systemd/system/fail2ban.service.

最後用下列指令確認 fail2ban 是否正在工作 : 

sudo fail2ban-client status  

tony1966@LX2438:~$ sudo fail2ban-client status  
Status
|- Number of jail: 1
`- Jail list: sshd

Number of jail:1 表示目前有 1 個 jail (監控規則) 正在執行; 而 Jail list: sshd 則表示一個名為 sshd 的 jail 正在運作, 專門用來保護 SSH 登入, 它會觀察日誌檔 /var/log/auth.log 監控登入失敗次數. 

在 Fail2Ban 裡每個 jail 就是一個獨立的監控單位, 負責觀察某個服務的日誌 (例如 SSH, Nginx, Postfix 等), 根據 filter 過濾規則偵測攻擊行為並執行 "action 封鎖". 可以用下列指令查看有哪些 IP 被 Fail2ban 封鎖 : 

sudo fail2ban-client status sshd

tony1966@LX2438:~$ sudo fail2ban-client status sshd  
[sudo] tony1966 的密碼: 
Status for the jail: sshd
|- Filter
|  |- Currently failed: 4
|  |- Total failed: 487
|  `- File list: /var/log/auth.log
`- Actions
   |- Currently banned: 2
   |- Total banned: 66
   `- Banned IP list: 151.80.146.76 79.124.8.120  

可見嘗試已有兩個 IP 因為嘗試利用 ssh 登入我的主機超過 6 次而被封鎖. 


3. 建立自訂的設定檔 jail.local : 

上面安裝啟用 Fail2ban 後套用的是系統預設的設定檔 jail.conf, 此設定檔通常只開啟 sshd 而已. 實務上系統管理者應建立自訂的設定檔 jail.local, 不應該直接去修改 jail.conf, 因為在 Fail2ban 升版更新後 jail.conf 會被覆蓋掉, 而 jail.local 則不會. 

當系統重開機啟動 Fail2ban 後首先會載入 jail.conf, 然後是 jail.d/ 資料夾下的模組設定片段 *.conf , 最後如果有自訂的 jail.local 則載入並覆蓋在 jail.conf 中的對應設定, 所以 jail.local 的內容只要設定需要變更的部分參數即可. 

用 nano 建立 /etc/fail2ban/jail.local 檔 : 

tony1966@LX2438:~$ sudo nano /etc/fail2ban/jail.local   
[sudo] tony1966 的密碼: 

輸入如下監控 sshd 的設定資料 : 

[sshd]
enabled = true
port = ssh
logpath = /var/log/auth.log
maxretry = 5
bantime = 1h
findtime = 10m

此處 enabled = true 表示啟用 sshd 的監控規則; port=ssh 表示監控預設的 ssh 埠 (亦可直接填埠號 22), logpath 用來指定 SSH 登入日誌檔路徑, Ubuntu 為 /var/log/auth.log; maxretry 用來設定容許登入失敗次數, 此處超過 5 次就封鎖; bantime 設定封鎖時間, 1h 為一小時; findtime 用來設定登入失敗發生的時間跨度, 10m 為十分鐘內超過 5 次就封鎖. 

按 Ctrl+O 存檔後按 Ctrl+X 跳出 nano, 用下列指令重新啟動 Fail2ban :

tony1966@LX2438:~$ sudo systemctl restart fail2ban   

用下列指令確認 fail2ban 是否正在工作 :

tony1966@LX2438:~$ sudo fail2ban-client status   
Status
|- Number of jail: 1
`- Jail list: sshd

可見 sshd 正在運作中, 但這是使用 jail.local 的 sshd 設定 (覆蓋掉預設的 jail.conf 中 sshd 的設定). 用下列指令查看目前有哪些 IP 被 Fail2ban 封鎖 :

tony1966@LX2438:~$ sudo fail2ban-client status   
Status
|- Number of jail: 1
`- Jail list: sshd

查看有哪些 IP 被 Fail2ban 封鎖 :

tony1966@LX2438:~$ sudo fail2ban-client status sshd   
Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed: 107
|  `- File list: /var/log/auth.log
`- Actions
   |- Currently banned: 11
   |- Total banned: 16
   `- Banned IP list: 45.134.225.119 8.134.137.169 64.23.249.58 85.209.134.43 152.32.191.75 123.30.249.49 125.20.16.22 103.183.75.90 195.178.110.108 59.68.63.123 195.178.110.160

可見攻擊者非常多呀! 

沒有留言 :