จากบทความอื่นในซีรีส์ CSF&LFD จะเน้นการตั้งค่าความปลอดภัยพื้นฐานให้กับการทำงานตามปกติของเซิฟเวอร์ หรือเซอร์วิสยอดนิยมต่างๆที่ CSF รู้จักอยู่แล้ว แต่ในบทความนี้จะพูดถึงการตั้งค่าให้ CSF เพื่อป้องกันการ Brute force หรือการกระทำอื่นๆของผู้บุกรุกที่มีต่อแอพพลิเคชั่น หรือโปรแกรม หรือเว็บไซต์ของเราซึ่งในกรณีนี้ CSF ไม่รู้จักแอพพลิเคชั่นของเรา ดังนั้นจึงต้องทำการตั้งค่าให้ CSF รู้ถึงความเป็นไปในแอพพลิเคชั่นของเรา และตรวจสอบความผิดปกติที่เราต้องการบล๊อคได้
โดยปกติการทำงานของ CSF&LFD ในการป้องกันการ Brute force นั้น มีขั้นตอนการทำงานคร่าวๆดังนี้
- CSF&LFD จะอ่านค่าในไฟล์ log ต่างๆที่อยู่บนเซิฟเวอร์เพื่อหาแบบแผนของการพยายามเข้าระบบโดยไม่ได้รับอนุญาต เช่น อ่านค่าจากไฟล์ log ของ FTP
- เมื่อพบ log ที่แจ้งว่ามีลอคอินด้วยรหัสผ่านที่ไม่ถูกต้อง ก็จะจดจำ IP ของผู้บุกรุกไว้ และหากตรวจพบถึงจำนวนครั้งที่กำหนด ภายในเวลาที่กำหนด (เช่น ป้อนรหัสผ่านผิด 10 ครั้ง ภายใน 1 ชั่วโมง) ก็จะเพิ่ม IP ของผู้บุกไปยังไฟล์ blocklist เพื่อให้ไฟร์วอลล์ทำการบล๊อคไอพีดังกล่าวต่อไป
ซึ่ง CSF&LFD นั้น จะสามารถตั้งค่าให้ไปอ่านไฟล์ log ตามที่เรากำหนด และสามารถใช้ Regex ตรวจหาแบบแผนของข้อความในไฟล์ log ดังกล่าว เพื่อให้ไฟร์วอลล์ทำการบล๊อคผู้บุกรุกที่มีการพยายามเข้าใช้งานระบบของเราได้ โดยจะต้องมีการทำงานร่วมกันสองส่วน คือ
- เมื่อมีการพยายามเข้าระบบด้วยข้อมูลที่ผิด แอพพลิเคชั่นจะต้องเขียนข้อมูลลงในไฟล์ log เช่น ตอบกลับเป็น Error 401 ซึ่งจะทำให้เว็บเซิฟเวอร์เขียนไฟล์ log นั้นๆ
- ตั้งค่าให้ CSF&LFD อ่านไฟล์ log และหากพบ pattern การ Error 401 เกินจำนวนครั้งที่กำหนด ให้บล๊อคไอพีดังกล่าวไม่ให้เข้าถึงเซิฟเวอร์
การเขียนไฟล์ Log โดยแอพพลิเคชั่น
การเขียนไฟล์ Log สามารถทำได้หลายวิธี ขึ้นอยู่กับภาษาหรือเฟรมเวิคที่ใช้ โดยอาจจะเป็นเขียนไฟล์ log ตรงๆ หรือใช้คำสั่ง response status code ซึ่งก็จะทำให้ Web server ทำการเขียนข้อมูลดังกล่าวลงไปใน log โดยอัตโนมัติ
การอ่านไฟล์ Log และบล๊อคไอพีเมื่อเข้าเงื่อนไข
สร้างไฟล์ csf regex.custom.pm โดยใช้คำสั่ง
sudo vi /etc/csf/regex.custom.pm
แล้วเขียน Pattern เพื่อ เช่น
if (($globlogs{HTACCESS_LOG}{$lgfile}) and ($line =~ /(\S+).] "POST ." 401/)) {
return ("Application 401 error from",$1,"app401","20","80,443","3600");
}
อธิบายโค้ท
if (($globlogs{HTACCESS_LOG}{$lgfile})
คือให้อ่านไฟล์ HTACCESS_LOGand ($line =~ /(\S+).] "POST ." 401/))
คือ หาก HTTP method เป็น POST แล้วเซิฟเวอร์ Response เป็น 401return ("Application 401 error from",$1,"app401","20","80,443","3600");
- ตอบกลับว่า Error
- เลข 20 คือ หากมีตรงเงื่อนไขในข้อ 2 เกิน 20 ครั้งขึ้นไป
- 80,443 คือ บล๊อคพอร์ท HTTP, HTTPS
- 3600 คือจำนวนวินาทีที่ต้องการบล๊อค
เมื่อเรียบร้อยแล้ว ทำการรีสตาร์ท โดยใช้คำสั่ง
sudo service lfd restart
sudo service csf restart