- ประเด็นคือ 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