Fail2ban 會檢查日誌文件(例如 /var/log/httpd/error_log
)並封禁存在惡意行為的 IP,例如大量身份驗證請求,漏洞掃描等。Fail2ban 通常會在防火牆規則上將這些 IP 封禁一段時間,但也可以配置像發送郵件等其它操作。
安裝
安裝一下軟體包之一:
- fail2ban包 - 最新的穩定版
- fail2ban-gitAUR - 包含添加到代碼庫的最新更改
用法
配置 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': []}]
配置
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
編輯 /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"]
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
CapabilityBoundingSet
的 CAP_DAC_READ_SEARCH
參數會允許 Fail2ban 讀取所有目錄和文件,CAP_NET_ADMIN
和 CAP_NET_RAW
會允許 Fail2ban 操作任何具有命令行解釋器界面的防火牆。具體信息請參考 capabilities(7)。
使用 ProtectSystem=strict
會使文件系統層次結構設為只讀,ReadWritePaths
會允許 Fail2ban 對特定路徑具有寫入權限。
最後重載 systemd 守護進程以應用對單元文件的修改,並重啟 fail2ban.service
。