iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
Odoo

Odoo 部署策略系列 第 29

阻止暴力破解攻擊:在 Docker 環境下保護 odoo 的 Fail2ban 實踐

  • 分享至 

  • xImage
  •  

⚠️🚧 Work in Progress 🚧⚠️
🛠️ This article is currently under construction.
📅 Some sections may still be incomplete or subject to revision.
🔄 Please check back later for updates!
💡 Feel free to follow along, but note that some information might change as the article is updated.

這兩天去高雄拍音樂祭,今天預計來做 Fail2ban 但是車上網路實在太爛沒辦法實驗,只能先貼預計的做法

概述

  • 目標:讓 Fail2ban 容器在不授予過多權限的情況下,能夠有效地封鎖惡意 IP。
  • 方法:使用 Docker 的 DOCKER-USER 鏈和自定義的 f2b-docker 鏈,讓 Fail2ban 修改特定的 iptables 鏈,從而封鎖惡意 IP。

步驟詳解

步驟 1:在宿主機上創建自定義 iptables 鏈

  1. 創建 f2b-docker

    在宿主機終端執行以下命令:

    sudo iptables -N f2b-docker
    
  2. f2b-docker 鏈插入到 DOCKER-USER

    sudo iptables -I DOCKER-USER -j f2b-docker
    

    說明

    • DOCKER-USER 鏈是在 Docker 啟動時自動創建的,用於允許用戶在 Docker 處理其自身的規則之前插入自定義規則。
    • 通過將 f2b-docker 鏈插入到 DOCKER-USER 鏈,我們可以確保所有進入 Docker 的流量都先經過 f2b-docker 鏈。

步驟 2:配置 Fail2ban 的過濾器

  1. 創建過濾器文件

    在項目目錄下創建 fail2ban/filter.d 目錄(如果尚未存在),並在其中創建一個名為 odoo.conf 的過濾器文件。

    文件路徑./fail2ban/filter.d/odoo.conf

    內容

    [Definition]
    failregex = ^ .*INFO .* odoo.addons.base.res.res_users: Login failed for db:\S+ login:\S+ from <HOST>
    ignoreregex =
    

    說明

    • failregex 定義了匹配 Odoo 登入失敗日誌的正則表達式。
    • <HOST> 是 Fail2ban 用於捕獲 IP 地址的佔位符。
  2. 確保正則表達式正確

    請確認您的 Odoo 日誌格式與上述正則表達式匹配,必要時進行調整。

步驟 3:配置 Fail2ban 的 Jail

  1. 創建 Jail 配置文件

    在項目目錄下創建或更新 fail2ban/jail.local 文件。

    文件路徑./fail2ban/jail.local

    內容

    [odoo]
    enabled = true
    filter = odoo
    logpath = /var/log/odoo/odoo-server.log  # 根據實際日誌路徑調整
    maxretry = 5
    bantime = 3600
    findtime = 600
    action = iptables[name=odoo, port=all, protocol=all, chain=f2b-docker]
    

    說明

    • filter = odoo:使用我們在前一步創建的過濾器。
    • logpath:指定 Odoo 日誌文件的路徑。
    • action:指定使用 iptables 動作,並將規則添加到我們的 f2b-docker 鏈中。

步驟 4:調整 Docker Compose 配置

  1. 更新 docker-compose.yml

    添加或修改 Fail2ban 服務的配置:

    services:
      fail2ban:
        image: fail2ban/fail2ban:latest
        container_name: fail2ban
        volumes:
          - ./fail2ban/jail.local:/etc/fail2ban/jail.local
          - ./fail2ban/filter.d:/etc/fail2ban/filter.d
          - ./odoo/log:/var/log/odoo  # 掛載 Odoo 日誌
        cap_add:
          - NET_ADMIN
          - NET_RAW
        network_mode: "host"
    

    說明

    • cap_add:授予容器網絡管理和原始套接字的權限,允許修改 iptables
    • network_mode: "host":讓容器與宿主機共享網絡命名空間。
  2. 確保其他服務配置正確

    檢查 Odoo、Nginx、PostgreSQL 等服務的配置,確保它們正常運行。

步驟 5:確保 Fail2ban 使用正確的 Action

  1. 檢查 iptables.conf

    在 Fail2ban 容器內的 /etc/fail2ban/action.d/iptables.conf 文件中,確保它支持指定自定義的 chain。通常默認的配置已經支持,但為了確保,我們可以在 Definition 部分添加或確認以下內容:

    [Definition]
    actionstart = iptables -N f2b-<name>
                  iptables -A f2b-<name> -j RETURN
                  iptables -I <chain> -p <protocol> --dport <port> -j f2b-<name>
    actionstop = iptables -D <chain> -p <protocol> --dport <port> -j f2b-<name>
                 iptables -F f2b-<name>
                 iptables -X f2b-<name>
    actioncheck =
    actionban = iptables -I f2b-<name> 1 -s <ip> -j DROP
    actionunban = iptables -D f2b-<name> -s <ip> -j DROP
    

    說明

    • <chain> 會被替換為我們在 Jail 中指定的 chain,即 f2b-docker
    • 這些動作確保 Fail2ban 只修改我們指定的鏈,避免影響其他 iptables 規則。

步驟 6:啟動服務並測試

  1. 啟動容器

    docker-compose up -d
    
  2. 測試封鎖機制

    • 模擬失敗登入:從同一個 IP 多次嘗試錯誤的登入,超過 maxretry(此例為 5 次)。

    • 檢查 iptables 規則

      sudo iptables -L f2b-docker -n
      

      您應該看到被封鎖的 IP 地址列在規則中。

  3. 驗證封鎖效果

    • 從被封鎖的 IP 嘗試訪問 Odoo,應該無法連接。
    • 從其他未被封鎖的 IP 訪問,應該正常。

步驟 7:確保 iptables 規則的持久性

  1. 安裝 iptables-persistent(可選)

    在宿主機上執行:

    sudo apt-get install iptables-persistent
    sudo netfilter-persistent save
    

    說明

    • 這將在宿主機重啟後自動恢復 iptables 規則。

注意事項

  • 時區同步:確保 Fail2ban 容器的時區與宿主機一致,以避免因時間差異導致的問題。

  • 防火牆工具:如果宿主機使用了其他防火牆管理工具(如 ufwfirewalld),需要確保它們與 iptables 規則協同工作,避免規則被覆蓋。

  • 安全性:雖然我們授予了容器修改網絡規則的權限,但通過限制其修改的鏈,我們將風險降至最低。仍然建議定期更新容器映像,並監控容器的安全狀態。


上一篇
docker compose 和 certbot:(半)自動化 Let's Encrypt 憑證申請
下一篇
odoo 部署上線:系列文章完結
系列文
Odoo 部署策略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言