ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home ป้องกันการเดารหัสผ่าน SSH ด้วย Fail2ban

ป้องกันการเดารหัสผ่าน SSH ด้วย Fail2ban

Fail2ban เป็นโปรแกรมที่คอยอ่าน Log ของบริการต่าง ๆ เมื่อพบ IP ใดเข้าสู่ระบบผิดซ้ำหลายครั้งในช่วงเวลาสั้น ๆ จะสั่ง Firewall ให้บล็อก IP นั้นชั่วคราวโดยอัตโนมัติ เหมาะกับเซิร์ฟเวอร์ที่เปิด SSH สู่อินเทอร์เน็ต ซึ่งมักถูกบอตสุ่มเดารหัสผ่านอยู่ตลอดเวลา

Fail2ban ช่วยลดภาระและลดความเสี่ยง แต่ไม่ได้แทนการใช้ SSH Key ควรใช้ทั้งสองอย่างร่วมกัน คู่มือนี้ใช้ได้กับ Ubuntu 22.04/24.04 และ AlmaLinux/Rocky Linux 8-9

สิ่งที่ต้องเตรียม

  • สิทธิ์ root หรือผู้ใช้ที่ใช้ sudo ได้
  • Firewall ที่ทำงานอยู่ ได้แก่ UFW บน Ubuntu หรือ firewalld บน AlmaLinux/Rocky (Fail2ban บน Ubuntu ใช้ iptables/nftables ได้โดยตรงแม้ไม่ได้เปิด UFW)
  • IP สาธารณะของสำนักงานหรือบ้านคุณ เพื่อใส่เป็นข้อยกเว้นไม่ให้ตัวเองถูกแบน ดูได้จากเว็บไซต์ตรวจ IP หรือจากคำสั่ง who บนเซิร์ฟเวอร์ขณะเชื่อมต่ออยู่

ขั้นตอนที่ 1: ติดตั้ง Fail2ban

Ubuntu

sudo apt update
sudo apt install -y fail2ban python3-systemd

python3-systemd ทำให้ Fail2ban อ่าน Log จาก systemd journal ได้โดยตรง ซึ่งเชื่อถือได้กว่าการอ่านไฟล์ Log

AlmaLinux / Rocky Linux

Fail2ban อยู่ใน Repository EPEL ต้องเปิด EPEL ก่อน

sudo dnf install -y epel-release
sudo dnf install -y fail2ban

แพ็กเกจนี้ติดตั้ง fail2ban-firewalld มาด้วย ซึ่งตั้งให้ Fail2ban สั่งบล็อกผ่าน firewalld โดยอัตโนมัติ (ดูได้ที่ /etc/fail2ban/jail.d/00-firewalld.conf)

ขั้นตอนที่ 2: สร้างไฟล์ตั้งค่า jail.local

ห้ามแก้ไฟล์ /etc/fail2ban/jail.conf โดยตรง เพราะจะถูกเขียนทับเมื่ออัปเดตแพ็กเกจ ให้สร้างไฟล์ jail.local ซึ่งจะถูกอ่านทับค่าใน jail.conf

sudo nano /etc/fail2ban/jail.local

ใส่ค่าต่อไปนี้ เปลี่ยน 198.51.100.25 เป็น IP ของคุณ (ใส่ได้หลาย IP คั่นด้วยช่องว่าง)

[DEFAULT]
# IP ที่จะไม่ถูกแบนเด็ดขาด
ignoreip = 127.0.0.1/8 ::1 198.51.100.25
# แบนนาน 1 ชั่วโมง
bantime = 1h
# นับจำนวนครั้งที่ผิดภายในช่วง 10 นาที
findtime = 10m
# ผิดครบ 5 ครั้งจึงแบน
maxretry = 5

[sshd]
enabled = true
port = ssh
backend = systemd

ความหมายของค่าหลัก

ค่าความหมาย
bantimeระยะเวลาที่ IP ถูกบล็อก ใช้หน่วย m, h, d ได้ ค่า -1 คือแบนถาวร (ไม่แนะนำ)
findtimeช่วงเวลาที่ใช้นับจำนวนครั้งที่ผิด
maxretryจำนวนครั้งที่ผิดภายใน findtime ก่อนถูกแบน
portPort ที่จะบล็อกสำหรับ IP ที่ถูกแบน ssh หมายถึง 22

ถ้าคุณเปลี่ยน SSH Port แล้ว ให้ใส่เลข Port จริง เช่น port = 2222 มิฉะนั้น Fail2ban จะบล็อกที่ Port 22 ซึ่งไม่ได้ใช้ และผู้โจมตียังเข้ามาที่ Port ใหม่ได้

ขั้นตอนที่ 3: ตรวจไฟล์และเริ่มใช้งาน

ตรวจไวยากรณ์ของไฟล์ตั้งค่าทั้งหมดก่อน

sudo fail2ban-client -t

ถ้าถูกต้องจะได้ข้อความ OK: configuration test is successful จากนั้นเปิดใช้งานและตั้งให้เริ่มเมื่อบูต

sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban

ใช้ restart ด้วยเพื่อให้ค่าใน jail.local มีผล ในกรณีที่แพ็กเกจเริ่ม Service ไปแล้วตั้งแต่ติดตั้ง

ตรวจสอบผลลัพธ์

sudo fail2ban-client status
sudo fail2ban-client status sshd

คำสั่งแรกต้องแสดง Jail list: sshd คำสั่งที่สองแสดงสถิติของ Jail ตัวอย่าง

Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed:     37
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 3
   |- Total banned:     9
   `- Banned IP list:   192.0.2.11 192.0.2.47 203.0.113.99

เซิร์ฟเวอร์ที่เปิดสู่อินเทอร์เน็ตมักเห็นตัวเลข Total failed เพิ่มขึ้นภายในไม่กี่นาทีหลังเปิดใช้งาน ดู Log การแบนได้ด้วย

sudo tail -f /var/log/fail2ban.log

บรรทัดที่มีคำว่า Ban ตามด้วย IP แสดงว่าระบบทำงานแล้ว หากเครื่องของคุณไม่มีไฟล์นี้ ให้ดูจาก sudo journalctl -u fail2ban -f แทน

การปลดแบนและการจัดการที่ใช้บ่อย

ปลดแบน IP ที่ถูกบล็อกโดยไม่ตั้งใจ

sudo fail2ban-client set sshd unbanip 198.51.100.25

แบน IP ด้วยตนเอง

sudo fail2ban-client set sshd banip 192.0.2.50

สำหรับผู้โจมตีที่กลับมาซ้ำหลังพ้นโทษ สามารถเปิด Jail recidive ที่ตรวจ Log ของ Fail2ban เองและแบนนานขึ้นได้ โดยเพิ่มท้ายไฟล์ jail.local

[recidive]
enabled = true
bantime = 1w
findtime = 1d
maxretry = 3

แล้วรัน sudo fail2ban-client -t และ sudo systemctl restart fail2ban Jail นี้อ่านจากไฟล์ /var/log/fail2ban.log จึงใช้ได้เมื่อ Fail2ban เขียน Log ลงไฟล์นั้น (ดูค่า logtarget ใน /etc/fail2ban/fail2ban.conf)

ปัญหาที่พบบ่อย

Fail2ban เริ่มทำงานไม่ได้

ดูสาเหตุด้วย sudo journalctl -u fail2ban -n 50 ข้อความ Have not found any log file for sshd jail แปลว่า Fail2ban พยายามอ่านไฟล์ Log ที่ไม่มีอยู่ ให้ตรวจว่าใส่ backend = systemd ในส่วน [sshd] แล้ว และบน Ubuntu ติดตั้ง python3-systemd แล้ว

Jail ทำงานแต่ไม่เคยแบนใคร

ตรวจค่า port ให้ตรงกับ Port ที่ SSH ใช้จริง และตรวจว่า Total failed เพิ่มขึ้นหรือไม่ ถ้าไม่เพิ่มเลย ลองจำลองเข้าผิดจากเครื่องอื่นที่ไม่ได้อยู่ใน ignoreip ถ้ายังไม่เพิ่ม ให้ดูว่า Journal มีข้อความจาก SSH หรือไม่ด้วย sudo journalctl -u ssh -n 20 (Ubuntu) หรือ -u sshd (AlmaLinux/Rocky)

ตัวเองถูกแบน

เข้าเซิร์ฟเวอร์จากเครือข่ายอื่นหรือผ่าน Console Server ผ่าน Web UI แล้วรันคำสั่ง unbanip ด้านบน จากนั้นเพิ่ม IP ของคุณลงใน ignoreip ถ้า IP บ้านหรือสำนักงานเปลี่ยนบ่อย ให้ใช้ SSH Key แทนการเพิ่ม IP

หากติดตั้งแล้วระบบยังไม่แบน IP ตามที่คาด หรือถูกล็อกออกจากเซิร์ฟเวอร์ ติดต่อทีมซัพพอร์ต THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security