Score:0

Fail2ban บน CentOS 7 ที่มี Traefik ที่ขับเคลื่อนด้วย Docker แบนตกลงโดยไม่ต้องเพิ่มกฎ iptables

ธง fr

ฉันตั้งค่าอินสแตนซ์ Traefik ที่เรียกใช้โดยเครื่องมือ Docker ในโหมด Swarm ด้วยการกำหนดค่าแบบ "คลาสสิก" (ดูด้านล่าง เพื่อความกระชับ ฉันใส่เฉพาะส่วนที่เกี่ยวข้อง [สำหรับฉัน] เท่านั้น อย่าลังเลที่จะสอบถามรายละเอียดเพิ่มเติมหากคุณต้องการ).

ติดตั้ง Fail2Ban เช่นเดียวกับไฟร์วอลล์ (การกระจาย CentOS) จนถึงตอนนี้ ฉันได้ตั้งค่าตัวกรอง/คุกอย่างง่าย โดยส่วนใหญ่สำหรับการบล็อก DOS และ bruteforce โดยดูบันทึกการเข้าถึง Traefik

ปัญหาของฉัน : เมื่อฉันลองกับ นิกโต หรือ ไฮดราฉันเห็นว่า IP ที่พยายามของฉันถูกขึ้นบัญชีดำ:

# สถานะไคลเอนต์fail2ban symfony-auth
สถานะของคุก: symfony-auth
|- ตัวกรอง
| |- ล้มเหลวในปัจจุบัน: 3
| |- ทั้งหมดล้มเหลว: 906
| `- รายการไฟล์: /var/log/traefik/access.log
`- การกระทำ
   |- ถูกแบนในขณะนี้: 1
   |- ถูกแบนทั้งหมด: 2
   `- รายการ IP ที่ถูกแบน: 37.19.218.169

แต่ไม่มีอะไรเปลี่ยนแปลงในส่วนกฎของ iptables และฉันเห็นว่า IP ที่ระบุไม่ได้ถูกบล็อกนอกจากนี้ หากฉันพยายามนำทางไปยังเว็บไซต์จาก IP ที่ถูกแบน ฉันสามารถทำได้แม้ว่าจะถูกแบนก็ตาม

ฉันต้องเพิ่มที่ฉันมี ไฟล์ 00-firewalld.confพร้อมคำแนะนำเริ่มต้นเกี่ยวกับการดำเนินการสำหรับ distro นี้:

# cat /etc/fail2ban/jail.d/00-firewalld.conf
# ไฟล์นี้เป็นส่วนหนึ่งของแพ็คเกจ fail2ban-firewalld เพื่อกำหนดค่าการใช้งาน
# การกระทำ firewalld เป็นการกระทำเริ่มต้น คุณสามารถลบแพ็คเกจนี้ได้
# (พร้อมกับ meta-package ของ fail2ban ที่ว่างเปล่า) หากคุณไม่ได้ใช้ firewalld
[ค่าเริ่มต้น]
banaction = firewallcmd-rich-rules[ประเภทการกระทำ=<หลายพอร์ต>]
banaction_allports = firewallcmd-rich-rules[actiontype=<allports>]
แบ็กเอนด์ = systemd

สุดท้ายนี้ฉันไม่มีความแตกต่างของเวลาเช่นที่ระบุไว้ ที่นี่.

# หาง /var/log/messages
12 ก.ค. 13:28:05 น. ....
#วันที่เวลา
               เวลาท้องถิ่น: จันทร์ 2021-07-12 13:30:18 UTC
           เวลาสากล: จันทร์ 2021-07-12 13:30:18 UTC
                 เวลา RTC: จันทร์ 2021-07-12 13:30:13 น
                เขตเวลา: UTC (UTC, +0000)
นาฬิการะบบซิงโครไนซ์: ใช่
              บริการ NTP: เปิดใช้งาน
          RTC ใน TZ ท้องถิ่น: ไม่


เหตุใด IP ที่ถูกแบนของฉันจึงยังสามารถเข้าถึงเว็บไซต์เป้าหมายได้ ขอบคุณสำหรับการนำทางและการตรัสรู้ของคุณ

เกร็ดเล็กเกร็ดน้อย

เทรฟิค นักเทียบท่า-compose.yml

ส่วนการบันทึก

รุ่น: "3.3"

บริการ:
  พร็อกซีย้อนกลับ:
    รูปภาพ: "traefik:v2.4"
    สั่งการ:
      # บันทึกการกำหนดค่า
      #- "--log.level=DEBUG"
      - "--log.filepath=/var/log/traefik/traefik.log"
      - "--accesslog.filepath=/var/log/traefik/access.log"
     

ส่วนปริมาตร :

    # ...
    ปริมาณ:
      #เพื่อคงใบรับรอง
      - ใบรับรอง traefik:/letsencrypt
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - /var/log/traefik:/var/log/traefik/
    # ...

ล้มเหลว 2 แบน

ตัวกรองของฉัน

/etc/fail2ban/filter.d/my_filter.conf

[คำนิยาม]
failregex = ^<HOST>.*"(GET|POST|HEAD).*" (404|444|403|400|301) .*$
ละเว้นregex =

คุกของฉัน

[my_jail]
 เปิดใช้งาน = จริง
 พอร์ต = http,https
 ฟิลเตอร์ = my_filter
 logpath = /var/log/traefik/access.log
 สูงสุด = 10

สถานะลูกค้า

# สถานะไคลเอนต์fail2ban
สถานะ
|- จำนวนคุก: 2
`- รายชื่อคุก: sshd, my_jail
Score:1
ธง il

เหตุใด IP ที่ถูกแบนของฉันจึงยังสามารถเข้าถึงเว็บไซต์เป้าหมายได้

อาจมี 3 เหตุผลสำหรับสิ่งนั้น:

  1. ของคุณ ไฟร์วอลล์ แบ็กเอนด์ (iptables?) ไม่เหมาะที่จะจัดการเรื่องนี้ ดู https://github.com/fail2ban/fail2ban/issues/1609#issuecomment-303085942 (หรือ https://github.com/firewalld/firewalld/issues/44#issuecomment-408211978) สำหรับรายละเอียด ไม่นาน แบ็กเอนด์ nftables ใหม่ของ firewalld สามารถจัดการสิ่งนี้ได้อย่างเหมาะสม ดังนั้นคุณอาจต้องเปลี่ยนไปใช้สิ่งนี้ หรือ ...
    สิ่งนี้อาจนำเราไปสู่เหตุผลสองประการถัดไป (ข้อแรกมีความเกี่ยวข้องมากกว่าประการต่อมา):

  2. หากระบบย่อยของเครือข่ายของคุณมีกฎ white-listing (และฉันเดาว่าเป็นเช่นนั้น) เช่น กฎ conntrack ข้ามการเชื่อมต่อที่สร้างไว้แล้วก่อนห่วงโซ่ของ fail2ban จากนั้นเพิ่มกฎลงในตาราง Failed2ban ปฏิเสธ IP จะไม่ส่งผลกระทบต่อสิ่งนี้ จัดตั้งขึ้น การเชื่อมต่อ (เช่น ในกรณีของ Keep-alive) เฉพาะการเชื่อมต่อใหม่เท่านั้นที่จะถูกปฏิเสธ จากนั้น... ในกรณีนี้ ตรวจสอบให้แน่ใจว่าได้ปฏิเสธการเชื่อมต่อในเว็บเซิร์ฟเวอร์หลังจากการตรวจสอบสิทธิ์ล้มเหลว หรือจัดลำดับเชนใหม่ (เชนของ fail2ban ก่อน white- กฎการแสดงรายการ) หรือปิดการเชื่อมต่อด้วยคำสั่งพิเศษใน การดำเนินการห้าม, เช่น. ss -K dst "[<ip>]" หรือ conntrack -D -s <ip>ฯลฯ ดู https://github.com/fail2ban/fail2ban/pull/3018/commits/8f6a8df3a45395620e434fd15b4ede694a1d00aa (หรือ https://github.com/fail2ban/fail2ban/commit/bbfff1828061514e48395a5dbc5c1f9f81625e82) สำหรับปัญหาที่คล้ายกันกับ ufw;

  3. เนื่องจากมีการเทียบท่า คุณจึงต้องกำหนด ห่วงโซ่ = DOCKER-USER หรือคล้ายกันแค่การกระทำ firewallcmd-rich-กฎ ไม่เหมาะกับสิ่งนั้น (ไม่มีพารามิเตอร์ โซ่ เลย)... ใช้การดำเนินการแบนอื่น (เช่น net-filters แบบเนทีฟ เช่น iptables/ipset หรือ nftables) ที่สนับสนุนสิ่งนั้น

อย่างไรก็ตาม คุณต้องตรวจสอบว่าทราฟฟิกขาเข้า (รวมถึงการสร้างแล้ว) ไปถึง chains/tables ที่เป็นผลลัพธ์ที่ fail2ban สร้างขึ้นสำหรับการแบน IP ได้อย่างไร โดยพิจารณาจาก chain/tables ของ docker และ firewalld ที่กำหนดไว้ล่วงหน้าทั้งหมด
อีกทางหนึ่งคือใช้การดำเนินการแบนสำหรับระบบย่อยตัวกรองเน็ตแบบเนทีฟ เช่น iptables+ipset หรือ nftables (เช่น ด้วยตารางเป้าหมายที่เหมาะสมสำหรับเชนที่ล้มเหลว เช่น นักเทียบท่า-ผู้ใช้ แทน ป้อนข้อมูล).

fr flag
ขอบคุณสำหรับคำตอบที่มีรายละเอียดอย่างน่าทึ่งของคุณ ประเด็นคืออันที่สามของคุณ ฉันพลาดเครือข่ายหลายอันเกี่ยวกับ Iptables ไปโดยสิ้นเชิง การเพิ่ม `chain = DOCKER-USER` ทำให้ใช้งานได้โดยไม่มีปัญหา

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา