Tuesday, June 4, 2024

หัดใช้ Fail2ban ใน Ubuntu

  • ประเด็นคือ late limit login failed สำหรับ web site ที่เราพัฒนาเอง
  • การทำงานก็จะประมาณมี service สักตัวคอยไป monitor log ไฟล์ ถ้าเจอสิ่งผิดปกติตามเงื่อนไขที่ตั้งไว้ตาม  filter เราก็จะให้ action อะไรบ้าง ประมาณนี้
  • สิ่งที่จะคอนฟิก คือ drop package ไว้ด้วย firewall สัก 1 ชั่วโมง ถ้า login web site ล้มเหลวประมาณ 5 ครั้งในระยะเวลาช่วง 10 นาที เป็นต้น
Env
  • Fail2Ban v0.10.2

Step

  • ติดตั้ง fail2ban ด้วยคำสั่ง

$ sudo apt install fail2ban

  • เมื่อติดตั้งเรียบร้อยตรวจสอบสถานะ (มันจะทำงานเป็น service ตัว 1 ในระบบเรา)

$ sudo systemctl status fail2ban 

  • ถ้ายังไปเปิดใช้ก็ start มันซะ

$ sudo systemctl start fail2ban

  • อ้างอิงที่ Ubuntu 22.04 มันจะตั้งค่า [default] ไว้ให้แล้วซึ่ง enabled = false ซึ่ง  [jail] แต่ละอันจะใช้ค่า default ก็ได้ หรือจะกำหนดสำหรับแต่ละ  jail ก็ได้เช่นกัน
  • ที่นี้เรามาสร้าง filter กันก่อนเลย
  • ขั้นแรกสร้างไฟล์ /etc/fail2ban/jail.local เพิ่ม

$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

  • กำหนด whitelist ip default เอาไว้ใช้กับทุก jail (ประมาณบรรทัดที่ 92)

$ sudo nano /etc/fail2ban/jail.local

  • มันถูก comment ไว้อยู่เอา  เช่น เราจะทำ whitelist ip ให้ range 192.168.1.0/24 หรือ อันเดียว 192.168.2.3 

ignoreip = 192.168.1.0/24 192.168.2.3

  • แต่เราสามารถตั้งค่า ignoreip ให้แต่ละ jail แยกกันก็ได้คือกัน โดยวาง ignoreip=xxx ไว้ภายใต้ [jail] แต่ละอัน
  • findtime อันนี้คือ ภายในกี่่นาที ที่เจอ filter เราตั้งค่าไว้ใน log (หน่วยคือ จำนวนครั้งที่นับได้จาก log file เราเงื่อนไขใน filter file ของเรา สามารถกำหนดยแยก jail  ได้เช่นกัน)
  • bantime คือ กำหนดเวลาในการ action ของเราเช่น สั่งให้ firewall block การเข้าถึง server เรากี่นาที่ นับการ monitor เจอ filter ใน log ครบตาม findtime (หน่วยถ้าไม่มีระบุต่อท้าย ค่าเริ่มต้นคือ วินาที สามารถกำหนดแยก jail ได้เช่นกัน)
  • เช่น bantime = 60 หรือ bantime = 60m , bantime = 1h 
  • เริ่มผูกการ monitor กับ web site ที่เราเขียนขึ้นมาโดย
  • เปิดไฟล์ jail.local เพิ่ม jail ของ site เรา

$ sudo nano /etc/fail2ban/jail.local

  • ตัวอย่างตั้งชื่อ jail ว่า[mysite1]
  • enabled = true ก่อนเลย
  • ให้ใช้ filter ชื่อ mysite1
  • ให้ใช้ action คือ iptable (block เลย), linenotify( อันนี้เพิ่ม  action เอง)
  • ให้เรียก monitor file ที่ /var/log/apache/mysite-access.log เช่น ถ้าพบ login failed ใน log

192.168.1.3 - - [04/Jun/2024:11:24:25 +0700] "GET /mygroup/user/loginerror HTTP/1.1" 200 581 "https://mysite.go.th/....

  • ตั้งค่า findtime = 10m คือ ภายในระยะเวลา 10 นาที ถ้า เจอ log ดังตัวอย่าง maxretry = 5 คือ 5 ครั้ง และ bantime = 60m ให้ทำการ block ip ที่พบใน log 60 นาที
  • ให้ action สั่ง iptable เพิ่ม policy block ip นั้น และ ส่ง line notify ให้ admin ด้วย
  • ที่นี้เราต้องเพิ่ม filter สำหรับ jail mysite1 เราโดย

$ sudo /etc/fail2ban/filter.d/mysite1.conf

  • เพิ่มประมาณนี้ และ บันทึกไฟล์ให้เรียบร้อย
  • สุดท้ายเพิ่ม action config file อันที่เราจะใช้ส่ง linenotify อันนี้เราต้องสร้างเอง (action iptables-multiport ใช้สำหรับ block โดย ip อันนี้เป็น action ที่มีให้แล้วแค่เรียกใช้มัน)
$ sudo /etc/fail2ban/action.d/send-line.conf
  • ตัวอย่าง send-line.conf ตอนแรกใช้ curl ส่งเลย แต่มันไม่สะดวก เลยเขียน shell script แยกแล้วเรียกใช้แทนเมื่อ ban และ unban
  • บันทึกให้เรียบร้อย และสั่ง restart service

$ sudo /etc/init.d/fail2ban restart

  • ตรวจสอบสถานะการทำกงาน

$ sudo fail2ban-client status mysite1


  • ถ้าทุกอย่างปกติ จะขั้น detail การ monitor ของ jail นั้นๆ ดังภาพตัวอย่าง

เพิ่มเติม

  • คำสั่งสำหรับดูการทำการว่ามี jail อะไรใช้งานอยู่บ้าง

$ sudo fail2ban-client status

  • ดูเป็นราย jail ด้วยคำสั่ง

$ sudo fail2ban-client status mysite1

  • ดู activity ของ service ทำงานอย่างไรบ้าง 

$ sudo fail2ban-client -d

  • สั่งให้ ban / unban โดยตรงโดย

$ sudo fail2ban-client set [jail-name] ban|unbanip [ip]

$ sudo fail2ban-client set myjail unbanip 192.168.1.2

$ sudo fail2ban-client set myjail banip 192.168.1.2 

  • ลองเปลี่ยนจาก iptable มาใช้ ufw แทนโดย เปลี่ยนค่าของแต่ะล jail ในไฟล์ jail.local
action = iptables-multiport[name=http, port="http,https", protocol=tcp, http-status=429]
action = ufw[application=Apache] # ถ้าเราไม่ใส่ [] มันจะ reject ทุก port (Apache Full ใส่แล้วไม่ทำงานซะงั้น ต้องไปสร้าง ufw app profile name เพิ่มเอานะคับ)

  • บันทึกและ restart service และ ตรวจสอบ ufw status

$ sudo systemctl restart fail2ban

$ sudo ufw status verbose 

  • เพิ่มให้อีกนิด เราจะดู app list ของ ufw โดย

$ sudo ufw app list

  • แล้วถ้าเราต้องการ custom applist ของเราเอาโดย 

$ sudo nano /etc/ufw/applications.d/apache2-utils.ufw.profile 

[MYHTTP]

title=Web Server (HTTP,HTTPS)

description=Apache v2 is the next generation of the omnipresent Apache web server.

ports=80,443/tcp

  • เราก็นำชื่อ application profile ใหม่นี้ไปกำหนด ufw ใน jail เช่น
action = ufw[application=MYHTTP] # reject port 80, 443 เป็นต้น  

  • หรือเราจะสร้าง คอนฟิกไฟล์ profile ใหม่ แล้ววางไว้ภายใต้ /etc/ufw/applications.d/myprofile แล้วเอา section ด้านบนใส่ในไฟล์แล้วบันทึก ก็จะได้ profile ใหม่มาใช้ได้เช่นกัน

Ref

  • https://bornoe.org/blog/2023/09/basic-fail2ban-commands/
  • https://zaiste.net/security/howtos/how-to-setup-fail2ban-ubuntu-18-04/
  • https://confluence.atlassian.com/adminjiraserver0820/using-fail2ban-to-limit-login-attempts-1095777624.html
  • https://araideesite.wordpress.com/2017/03/26/linenotify-part8/
  • https://manpages.debian.org/testing/fail2ban/jail.conf.5.en.html
  • https://serverfault.com/questions/285256/how-to-unban-an-ip-properly-with-fail2ban
  • https://bobcares.com/blog/fail2ban-unban-ip/
  • https://www.youtube.com/watch?v=tCHLrC93KhE
  • https://askubuntu.com/questions/409013/how-do-you-create-an-app-profile-for-ufw

No comments:

Post a Comment