ป้องกัน Brute Force บน Ubuntu Server อย่างเป็นระบบ ด้วย Fail2ban

ป้องกัน Brute Force บน Ubuntu Server อย่างเป็นระบบ ด้วย Fail2ban

การโจมตีแบบ Brute Force คือการลองรหัสผ่านซ้ำ ๆ เพื่อเดารหัสให้ถูก โดยมักพุ่งเป้าไปที่บริการยอดนิยมอย่าง SSH, Web Login, SMTP/IMAP หากปล่อยไว้จะเสี่ยงทั้ง “ถูกเดารหัสผ่านสำเร็จ” และ “กินทรัพยากรเครื่องจนช้า/ล่ม” ได้ แนวทางที่ทำได้เร็วและคุ้มมากคือใช้ Fail2ban ซึ่งจะคอยอ่าน Log แล้ว “แบน IP” ที่พฤติกรรมผิดปกติอัตโนมัติผ่านไฟร์วอลล์

1) ติดตั้ง Fail2ban (Ubuntu/Debian)

sudo apt update

sudo apt install -y fail2ban

sudo systemctl enable --now fail2ban

– ตรวจสอบสถานะ Fail2ban

sudo systemctl status fail2ban

sudo fail2ban-client status
 

2) หลักการตั้งค่า: “อย่าแก้ jail.conf”

Fail2ban จะมีไฟล์หลัก /etc/fail2ban/jail.conf (ค่าเริ่มต้น)

แนะนำให้สร้างไฟล์ปรับแต่งของเราใน

  • /etc/fail2ban/jail.local หรือ

  • /etc/fail2ban/jail.d/*.local (แนะนำสำหรับแยกเป็นบริการ)

แนวทาง

– ปรับแต่งค่า
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
nano /etc/fail2ban/jail.local

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1  
findtime = 10m     # ช่วงเวลาที่ Fail2ban ใช้นับจำนวนความพยายามผิดพลาด
bantime = 10m      # ระยะเวลาที่ IP จะถูกแบน
maxretry = 5       # จำนวนครั้งที่อนุญาตให้ login ผิดพลาดได้


3) เปิดใช้การป้องกัน SSH (สำคัญที่สุด)

สร้างไฟล์

sudo nano /etc/fail2ban/jail.d/sshd.local

ใส่ค่าแนะนำ (ปรับได้ตามนโยบายการใช้งาน )

[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = systemd
 
maxretry = 5    # จำนวนครั้งที่อนุญาตให้ login ผิดพลาดได้ (ถ้า IP ใด login ผิด เกิน 5 ครั้ง ภายในช่วงเวลาที่กำหนด → จะถูกแบน)
findtime = 10m  # ช่วงเวลาที่ Fail2ban ใช้นับจำนวนความพยายามผิดพลาด (10m = 10 นาที) 
bantime = 1h    # ระยะเวลาที่ IP จะถูกแบน (1h = 1 ชั่วโมง เมื่อครบเวลาแล้วจะปลดแบนอัตโนมัติ)

– รีสตาร์ต Fail2ban

sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

แนะนำเสริมเพื่อความปลอดภัย: ใช้ Key-based login, ปิด password login, และจำกัดให้ SSH รับเฉพาะ IP ที่ไว้ใจได้ (ถ้าทำได้)


4) ผูก Fail2ban กับ Firewall (UFW หรือ iptables/nftables)

โดยปกติ Fail2ban จัดการได้เอง แต่บน Ubuntu นิยมใช้ UFW

เช็กว่าคุณใช้ UFW อยู่ไหม

sudo ufw status

ถ้าใช้ UFW ให้ตั้งค่า action เป็น ufw (ทางเลือกหนึ่งที่อ่านง่าย):
สร้างไฟล์

sudo nano /etc/fail2ban/jail.d/00-defaults.local

– ระบุ

[DEFAULT]
banaction = ufw

-แล้วรีสตาร์ต

sudo systemctl restart fail2ban

5) ป้องกัน Nginx/Web Login (กรณีมีหน้าเข้าสู่ระบบ)

Fail2ban มี jail สำเร็จรูปของ Nginx หลายแบบ เช่น nginx-http-auth, nginx-botsearch, nginx-limit-req (ชื่อที่มีให้ขึ้นกับแพ็กเกจ/ดิสโทร)

สร้างไฟล์

sudo nano /etc/fail2ban/jail.d/nginx.local

ตัวอย่างเปิดใช้ 2 ตัวที่พบบ่อย

[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
findtime = 10m
bantime = 1h
 
[nginx-botsearch]
enabled = true
port = http,https
logpath = /var/log/nginx/access.log
maxretry = 2
findtime = 10m
bantime = 6h

แล้วรีสตาร์ต

sudo systemctl restart fail2ban
sudo fail2ban-client status

6) ป้องกัน Mail (Postfix/Dovecot) ถ้ามีบริการอีเมล

– ตัวอย่าง jail

  • postfix / postfix-sasl

  • dovecot

– สร้างไฟล์

sudo nano /etc/fail2ban/jail.d/mail.local

ตัวอย่าง

[postfix-sasl]
enabled = true
port = smtp,submission,imap,imaps,pop3,pop3s
logpath = /var/log/mail.log
maxretry = 5
findtime = 10m
bantime = 4h
 
[dovecot]
enabled = true
port = imap,imaps,pop3,pop3s,submission,465,sieve
logpath = /var/log/mail.log
maxretry = 5
findtime = 10m
bantime = 4h

– รีสตาร์ต

sudo systemctl restart fail2ban

7) คำสั่งสำคัญสำหรับตรวจสอบ/ปลดแบน

– ดูสถานะทั้งหมด

sudo fail2ban-client status

– ดู jail ที่สนใจ

sudo fail2ban-client status sshd

– ดู IP ที่ถูกแบน

sudo fail2ban-client get sshd banip

– ปลดแบน IP

sudo fail2ban-client set sshd unbanip 1.2.3.4

8) แนวทาง “ตั้งค่าแบบมืออาชีพ” (แนะนำ)

  • bantime แบบไล่ระดับ: เริ่มแบนสั้น ๆ แล้วค่อยยาวขึ้น (ต้องตั้งค่าเพิ่ม) เหมาะกับการเจอ bot ถี่ ๆ

  • Whitelist IP (เช่น IP บ้าน/สำนักงาน/VPN)

    ใส่ใน [DEFAULT]

    ignoreip = 127.0.0.1/8 ::1 <YOUR_PUBLIC_IP>/32
  • อย่าตั้ง maxretry ต่ำเกินไป สำหรับระบบที่ผู้ใช้จริงเยอะ เดี๋ยวแบนทีมงาน staff บ่อย

  • จับคู่กับการ Harden SSH: ปิด root login, ใช้ key, เปลี่ยนพอร์ต (เป็นตัวช่วยเสริม ไม่ใช่หัวใจหลัก), เปิด 2FA ถ้าเหมาะสม


แนวทางปรับค่าให้เหมาะกับงานจริง

Server Production (แนะนำ)

maxretry = 3
findtime = 5m
bantime = 6h

Server ภายใน / ห้องแล็บ

maxretry = 5
findtime = 15m
bantime = 30m

ทดสอบ

ทดสอบการทำงานของ Fail2ban  ใช้โปรแกรม Putty ทำการล็อกอินเข้าระบบตามจำนวนครั้งที่กำหนด

– ตรวจสอบ log ของ Fail2ban ด้วยคำสั่ง
tail /var/log/fail2ban.log

– ตรวจสอบ log ของFail2ban ด้วยคำสั่ง
tail /var/log/fail2ban.log

กรณี login กินค่าที่กำหนดไว้ระบบจะขึ้นดังภาพ


สรุป

Fail2ban คือเครื่องมือที่ “คุ้มที่สุด” สำหรับกัน Brute Force เพราะทำงานอัตโนมัติจาก Log แล้วแบน IP ทันที เหมาะกับ SSH, Nginx/Web, Mail และปรับความเข้มงวดได้ตามสภาพแวดล้อมจริง


เขียนและรวบรวมโดย
Dr.Arnut Ruttanatirakul
Technology Lecturer, KMITL
4 January 2025