Fail2ban - Arch Linux 中文维基

跳至內容

# Fail2ban

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Fail2ban，最近一次同步於 2025-03-02，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- sshguard
- 安全

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

警告：

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

## 安裝

安裝以下軟體包之一：

- 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': []}]

## 配置

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

原因：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

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

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

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

## 參考

- 使用 Fail2Ban Jail 將用戶加入白名單
- Fail2Ban 過濾器優化
- Fail2Ban 與 sendmail
- Fail2Ban 與 iptables
- Fail2Ban 0.8.3 用法
- 監控 fail2ban 日誌

分類：​

- 防火牆
- SSH

Fail2ban
新增話題