跳至內容
出自 Arch Linux 中文维基

Fail2ban 會檢查日誌文件(例如 /var/log/httpd/error_log)並封禁存在惡意行為的 IP,例如大量身份驗證請求,漏洞掃描等。Fail2ban 通常會在防火牆規則上將這些 IP 封禁一段時間,但也可以配置像發送郵件等其它操作。

警告:
  • IP 封禁軟體可以防止一些簡單的攻擊,但依賴於額外的守護進程和正確的日誌記錄配置。
  • 在類似為 sshd 啟用僅接受公鑰認證等情況下,沒有必要使用 fail2ban。
  • 這不是 VPN 的替代品,請儘量不要將服務暴露到網際網路上。
  • 如果攻擊者知道你的 IP,他們可以發送修改了源地址頭欄位的包使你的 IP 被伺服器封禁,因此務必將你的 IP 添加到 ignoreip 中。

安裝

安裝一下軟體包之一:

用法

配置 Fail2ban 並啟用/啟動 fail2ban.service

fail2ban-client

fail2ban-client 可以用於管理 jail 的狀態(包括重新加載、重啟、查看狀態等)。要查看所有可用命令:

$ fail2ban-client

要查看已啟用的 jail:

# fail2ban-client status

要查看 jail 的狀態(以 sshd 為例):

# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     9
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   0.0.0.0

要查看所有 jail 的簡略信息(包括已封禁的 IP):

# fail2ban-client banned
[{'sshd': ['192.168.100.50']}, {'apache-auth': []}]

配置

這篇文章的某些內容需要擴充。

原因:Add a note about dbpurgeage, see [1]. (在 Talk:Fail2ban 中討論)

jail.conf(5) § CONFIGURATION FILES FORMAT 建議用戶創建 /etc/fail2ban/jail.local 文件,否則在更新時可能會為 /etc/fail2ban/jail.conf 創建新的 Pacnew 和 Pacsave 文件

以將默認封禁時間設為一天為例:

/etc/fail2ban/jail.local
[DEFAULT]
bantime = 1d

也可以在 /etc/fail2ban/jail.d 目錄下創建單獨的 name.local 文件(例如 /etc/fail2ban/jail.d/sshd.local)。

重載 fail2ban.service 以應用配置更改。

啟用 jail

所有 jail 默認都是禁用的。要啟用 jail,需要在對應項添加 enabled = true。以啟用 OpenSSH jail 為例:

/etc/fail2ban/jail.local
[sshd]
enabled = true

具體配置請參考 #配置 SSH jail

接收告警郵件

如果你想在封禁時收到郵件提醒,需要參考下方配置 SMTP 客戶端(例如 msmtp)並修改默認操作:

/etc/fail2ban/jail.local
[DEFAULT]
destemail = yourname@example.com
sender = yourname@example.com

# to ban & send an e-mail with whois report to the destemail.
action = %(action_mw)s

# same as action_mw but also send relevant log lines
#action = %(action_mwl)s

防火牆和服務

Fail2ban 默認使用 iptables,但要配置大部分防火牆和服務也很簡單,以 nftables 為例:

/etc/fail2ban/jail.local
[DEFAULT]
banaction = nftables
banaction_allports = nftables[type=allports]

其它示例請參考 /etc/fail2ban/action.d/,例如 ufw.conf

小技巧

配置 SSH jail

警告:如果攻擊者知道你的 IP,他們可以發送修改了源地址頭欄位的包使你的 IP 被伺服器封禁。SSH 密鑰為解決暴力攻擊提供了簡潔的方案,而不會產生這些問題。

編輯 /etc/fail2ban/jail.d/sshd.local,添加以下內容,並在 ignoreip 中修改可信 IP 清單:

/etc/fail2ban/jail.d/sshd.local
[sshd]
enabled   = true
filter    = sshd
banaction = iptables
backend   = systemd
maxretry  = 5
findtime  = 1d
bantime   = 2w
ignoreip  = 127.0.0.1/8
注意:
  • 為使 fail2ban 具有完整監控能力,可能需要在 /etc/ssh/sshd_config 中設置 LogLevel VERBOSE,否則像密碼錯誤等可能不會被正確記錄。
  • Fail2ban 從 0.10 版本開始支持 IPv6,請按需調整防火牆(例如啟動/啟用 ip6tables.service)。
  • 在使用 journal 命名空間(即在單元文件中使用 LogNamespace=something)時,可以像這樣配置 backend 來讓 fail2ban 讀取這些日誌:backend = systemd[journalfiles="/var/log/journal/*.something/system.journal"]
提示:
  • 如果使用像 ufw 這樣的 iptables 前端,可以使用 banaction = ufw 替代 iptables。
  • 在使用 Shorewall 時,可以在 /etc/shorewall/shorewall.conf 中使用 banaction = shorewall,並將 BLACKLIST 設為 ALL,否則新的 IP 封禁規則只會影響新連接。

Systemd 後端:journald 過濾

When using the systemd backend to improve performance, configure a filter with journalmatch. For example, to parse only kernel-level log messages:

/etc/fail2ban/filter.d/fwdrop.local
[Definition]
failregex = ^.*DROP_.*SRC=<ADDR> DST=.*$
journalmatch = _TRANSPORT=kernel

See also systemd.journal-fields(7).

服務加固

現在 Fail2ban 只能以根用戶權限運行。因此,你可能回想使用 systemd 加固進程。

fail2ban.service 創建附加配置片段文件:

/etc/systemd/system/fail2ban.service.d/override.conf
[Service]
PrivateDevices=yes
PrivateTmp=yes
ProtectHome=read-only
ProtectSystem=strict
ReadWritePaths=-/var/run/fail2ban
ReadWritePaths=-/var/lib/fail2ban
ReadWritePaths=-/var/log/fail2ban.log
ReadWritePaths=-/var/spool/postfix/maildrop
ReadWritePaths=-/run/xtables.lock
CapabilityBoundingSet=CAP_AUDIT_READ CAP_DAC_READ_SEARCH CAP_NET_ADMIN CAP_NET_RAW

CapabilityBoundingSetCAP_DAC_READ_SEARCH 參數會允許 Fail2ban 讀取所有目錄和文件,CAP_NET_ADMINCAP_NET_RAW 會允許 Fail2ban 操作任何具有命令行解釋器界面的防火牆。具體信息請參考 capabilities(7)

使用 ProtectSystem=strict 會使文件系統層次結構設為只讀,ReadWritePaths 會允許 Fail2ban 對特定路徑具有寫入權限。

最後重載 systemd 守護進程以應用對單元文件的修改,並重啟 fail2ban.service

參考