เสริมความ"แข็งแกร่ง" ให้ SSH ด้วย fail2ban
จากตอนที่แล้ว เราเล่าในเรื่องของการ Harden Security ของ SSH Service ของเราด้วยการปรับการตั้งค่าบางอย่างเพื่อลด Attack Surface ที่อาจจะเกิดขึ้นได้ หากใครยังไม่ได้อ่านก็ย้อนกลับไปอ่านกันก่อนเด้อ วันนี้เรามาเล่าวิธีการที่มัน Advance มากขึ้น อย่างการใช้ fail2ban
Fail2Ban คืออะไร ?
โดยปกติ หากความผิดปกติพวกนี้เกิดขึ้น ตัวเครื่องมันจะไม่สามารถทำอะไรได้ สิ่งที่ทำได้คือ การเอาคน มานั่งตั้งพวก Firewall Rule หรือเปลี่ยน Config บางอย่างเพื่อให้มัน Drop Connection ที่ทำให้เกิดความผิดปกตินั้นไปได้ ซึ่งแน่นอนว่า ใคร มัน จะ ไป นั่ง อยู่ กับ Server ทั้ง วัน วะ ถ้าไม่ใช่ NOC น่ะ
Fail2ban เข้ามาช่วยเหลือเราตรงจุดนี้แหละ มันเป็นโปรแกรมตัวนึงที่ทำหน้าที่ในการ Spot ความผิดปกติที่อาจจะเกิดขึ้นในขั้นตอนการทำ Authentication เช่น การเกิด Authentication Failure รัว ๆ มันย่อมเป็นเรื่องผิดปกติ มีบางอย่างเกิดขึ้นอย่างแน่นอน
โดยวิธีการของมัน ไม่ได้ซับซ้อนอะไรมากมาย เริ่มจากการ Sensing ความผิดปกติก่อน ตัวมันไม่ได้ Attach หรือ Piggyback Process ใด ๆ แต่มันใช้วิธีการอ่าน Log File ที่เกิดขึ้นว่าใครทำอะไรที่ไหนอย่างไร โดยเราอาจจะต้องเป็นคนบอกมันว่า เราจะให้มันหาอะไร เช่น Authentication Failure จากนั้น เราจะต้องตั้งไปอีกว่า หากเจอเท่าไหร่ แล้วจะให้ Block IP นั้นไปนานเท่าไหร่ เช่น หากเจอ IP นี้เกิด Authentication Failure 10 ครั้งใน 1 ชั่วโมง ให้ Block IP นั้นไปเลยอีก 1 ชั่วโมง และเราอาจะให้มันส่งแจ้งเตือนไปยังผู้ดูแลระบบว่า มีไอ้งามไส้มาเล่นกูแล้ว
Installing and Configuring Fail2Ban
sudo apt install fail2ban
Fail2Ban ไม่ได้เป็น Package ที่ติดมากับ Linux ดังนั้น เราจำเป็นที่จะต้องติดตั้งผ่าน Package Manager ของ Distro ที่เราใช้งานเลย ตัวอย่างในวันนี้เราจะใช้งานเป็น Ubuntu เป็นหลักเด้อ
sudo vim /etc/fail2ban/jail.conf
โดยไฟล์ที่เก็บการตั้งค่าพวกเงื่อนไขการ Bonk Go to Jail อยู่ในไฟล์ชื่อว่า jail.conf
bantime = 10m
การตั้งค่าแรกที่ตั้งได้คือ bantime หรือจำนวนเวลาที่เมื่อ IP Address นั้นเข้าเงื่อนไข มันจะทำการ Ban นานเท่าไหร่ ค่าเริ่มต้นเขาเซ็ตมาที่ 10 นาทีด้วยกัน ถามว่าแล้วจริง ๆ เราควรเซ็ตไว้เท่าไหร่ เราคิดว่าพื้นฐาน 10 นาทีกำลังดีละ แต่ถ้าเรามีความเสี่ยงที่จะเจอการโจมตีรูปแบบต่าง ๆ เราอาจจะต้องตั้งเพื่อให้มันสามารถครอบคลุมลักษณะการโจมตีนั้น ๆ ได้ โดยกระทบต่อ User ให้น้อยที่สุด
findtime = 10m
maxretry = 5
ค่าต่อไปคือ findtime และ maxretry อันนี้มันจะทำงานด้วยกัน เป็นส่วนหนึ่งของเงื่อนไขในการ Ban โดยค่าด้านบนเป็นการบอกว่า มันจะต้องเกิด Failure 5 ครั้ง ในกรอบเวลา 10 นาที หากเข้าเงื่อนไขนี้ก็ Go to jail
action = %(action_)s
และสุดท้ายคือ เมื่อมันเข้าเงื่อนไขแล้ว เราจะให้มันทำอะไร ตรงนี้แหละว่า อย่างที่บอกคือ เราสามารถทำได้หลายอย่างมาก เช่น เราอาจจะ Ban IP นั้นเฉย ๆ
# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
# to the destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", l
หรือเราจะใช้งานร่วมกับ Postfix เพื่อส่งเมล์แจ้งเตือนพร้อมกับข้อมูลต่าง ๆ ให้กับผู้ดูแลรับรับทราบ หรือกระทั่งเว็บใครที่อยู่หลัง Cloudflare เราสามารถส่ง IP นั้นให้ Cloudflare จัดการ Ban ก่อนจะถึงตัวเราได้ก่อนซะอีก เรียกว่าจะให้มันทำอะไร มันอยู่ที่การตั้งค่าของเราเลย แต่โดยการทำงานพื้นฐาน เขาเขียน Script มาให้เราหมดละ เราสามารถหยิบหรือเอาสิ่งที่เขาเขียนมาให้ดัดแปลง แล้วเอามาใช้ได้เลย
[sshd]
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
เมื่อเราเลื่อนลงมาเรื่อย ๆ เราจะเจอกับ หลาย ๆ Section แต่ละ Section มันจะเป็นการ Monitor ในแต่ละ Application โดยเขาจะเขียน Config ที่จำเป็นกับ Application ที่น่าจะได้ใช้งานเป็นประจำแล้วละ เช่น sshd ก็คือ SSH Demon หรือ Process ที่ใช้จัดการ SSH Server นั่นเอง
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
โดยเราสามารถเปิดการใช้งาน fail2ban บน SSH ได้โดยการเติม enabled=true ไว้ ดั่งด้านบนได้เลย เราอาจจะเห็นคำว่า logpath เดาไม่ยาก มันคือ ที่อยู่ของ SSH Log นั่นเอง แต่เอ๊ะ มันไม่ได้เป็นที่อยู่นิ จริง ๆ มันเป็นตัวแปรที่ถูก Pre-define ไว้ก่อนแล้ว แต่ถ้าเราไปหาเท่าไหร่ เราจะหาไม่เจอว่า มันถูก Define ไว้ตรงไหน ถ้าเราลองเลื่อนขึ้นไปบน ๆ เราจะเจอบรรทัดที่เขียนว่า before อยู่ตรงนั้นแหละ ลองเปิดไฟล์ที่มันอ้างถึงดู แล้วไล่ขึ้นไปเรื่อย ๆ เราก็จะเจอเอง
ทำให้สุดท้ายแล้ว หากเรามี Service ที่ต้องการใช้งาน Fail2Ban เราสามารถเขียน Section ใหม่ขึ้นมา แล้วทำการเขียน Config บอกพวก Log Path ต่าง ๆ กับบอกมันว่าต้องมองหาอะไร เท่านั้นก็เรียบร้อยแล้ว เช่น เราอาจจะทำพวก DOS Protection บน Nginx เราก็สามารถทำได้เช่นกัน
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
หลังจากเราตั้งค่าเรียบร้อยแล้ว เราจะสั่งให้มันเปิดใช้งาน fail2ban Service ทุกครั้งที่เปิดเครื่อง และ สั่ง Start ด้วยตัวเองในรอบนี้ด้วยคำสั่งด้านบน
sudo systemctl status fail2ban
เพื่อความชัวร์ เราอาจจะขอดูสถานะการทำงานของ fail2ban Service จากคำสั่งด้านบน
● fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor pres>
Active: active (running) since Sun 2024-10-20 16:58:50 UTC; 2s ago
Docs: man:fail2ban(1)
Main PID: 1178170 (fail2ban-server)
Tasks: 5 (limit: 4556)
Memory: 12.9M
CPU: 238ms
CGroup: /system.slice/fail2ban.service
└─1178170 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Oct 20 16:58:50 portalserver systemd[1]: Started Fail2Ban Service.
Oct 20 16:58:50 portalserver fail2ban-server[1178170]: Server ready
หากสถานะการทำงานของมันโอเค ทำงานได้ตามปกติ ก็เท่ากับว่า การตั้งค่าของเราโอเคละ สามารถทำงานได้แล้ว หากเราต้องการตั้งค่าอะไรเพิ่มก็กลับไปทำใน jail.conf ได้เหมือนเดิม แต่อย่าลืม Restart fail2ban Service ด้วยเด้อ ไม่งั้น Config ใหม่จะไม่ได้รับการทำงานเด้อ
Ban or Unban IP Address
แต่เราสามารถที่จะสั่ง Ban หรือ Unban IP Address นั้น ๆ ด้วยตัวเองได้เช่นกัน
fail2ban-client set sshd banip <ip-address>
เราสามารถใช้คำสั่งด้านบนในการสั่ง Ban IP ที่เราต้องการได้ หรือถ้าเราใช้กับ Service อื่น ๆ แค่เปลี่ยน sshd ไปเป็น Jail ที่เราต้องการได้เลย
fail2ban-client set sshd unbanip <ip-address>
และการ Unban ก็ทำด้วยวิธีการคล้าย ๆ กันใช้คำสั่งเดียวกัน แค่เปลี่ยนจาก banip เป็น unbanip เท่านั้นเอง
Fail2ban ไม่ใช่ Silver Bullet
เราต้องเข้าใจก่อนนะว่า มันไม่ใช่ Silver Bullet ที่จะเข้ามาแก้ไขปัญหาเรื่อง Security ทั้งหมด มันเป็นเพียงเครื่องมือที่ช่วยแก้ปัญหาการโดน Brute Force เมื่อเราตั้งกฏที่เหมาะสมด้วยนะ เรายังจำเป็นที่จะต้องจัดการเรื่องพวก Authentication Method และ Policy ที่แข็งแรง ควบคู่กันไปด้วย
สรุป
Fail2ban เป็นเครื่องมือนึงที่จะเข้ามาช่วยเราจัดการกับ Brute Force Attack ที่มักจะเกิดขึ้นกับ SSH โดยการเข้าไปอ่านใน Authentication Log หากพบความผิดปกติมันจะ Ban IP Address นั้นออกไป ทำให้ IP Address นั้น ๆ ไม่สามารถยิงเข้ามาได้ชั่วคราว ลดโอกาสที่จะโจมตีสำเร็จออกไปได้ในระยะเวลาหนึ่ง และเรายังสามารถนำมาใช้กับ Service อื่น ๆ ภายในเครื่องของเราก็ได้ หรือจะเป็น Application ต่าง ๆ เพียงแค่เราบอกที่อยู่ของ Log File ที่ต้องการให้มันอ่าน รวมไปถึงจะ Ban อะไรยังไง เท่านี้ก็เรียบร้อยแล้ว แต่ต้องอย่าลืมว่า มันก็มีข้อจำกัดของมัน ไม่ได้ทำให้เราวางใจได้ 100% ดังนั้นการวางระบบ Authentication ที่แข็งแรงยังคงเป็นเรื่องจำเป็นอยู่เหมือนเดิมเด้อ