สคริปต์ป้องกัน Brute Force แบบ Universal

การโจมตีแบบ Brue force ก็คือการลองผิดลองดูรหัสผ่านไปเรื่อยๆ โดยมักจะใช้รหัสผ่านยอดนิยม เช่น admin/1234 หรืออื่นๆ เทียบกับได้เราทำบัตร ATM ตก เมื่อมีใครสักคนเก็บได้ก็เอาไปใส่ตู้ ATM แล้วลองกดรหัสดู แต่ที่บัตร ATM ดูจะมีความปลอดภัยหน่อยก็คือถ้าเรากดรหัสผ่านผิดเกิน 3 ครั้งเครื่องก็จะยึดบัตรใบนั้นไป ในขณะที่ Router หรือ Mikrotik ยังยอมให้ลองผิดลองถูกได้เรื่อยๆ แบบไม่มีข้อจำกัด

ดังนั้นเราจะใช้ firewall rules ด้านล่างนี้จำกัดจำนวนลองผิดลองถูกในการป้อนรหัสผ่านเข้ามาในระบบของเราเป็นจำนวน 3 ครั้งเช่นกัน

เป็นสคริปต์ป้องกัน Brute Force แบบสารพัดประโยชน์ สามารถนำไปประยุกต์ใช้ได้กับหลายบริการ เพียงแค่เพิ่มหมายเลข Port ของบริการเข้าไป เช่นในตัวอย่าง กำหนดเป็น port ซึ่งเป็นบริการ SSH แต่ถ้าต้องการให้ป้องกันครอบคลุมบริการอื่นอีก เช่น Winbox (port 8291) หรือบริการที่โดน Brute force บ่อยมากอย่าง PPTP Server ซึ่งทำงานอยู่ที่ port 1723 ก็เพียงแต่ไปแก้ไข dst-port=22 ของแต่ละบรรทัดให้เป็น dst-port=22,8291,1723

การทำงานของสคริปต์นี้จะตรวจสอบว่า ถ้า IP เดิมพยายามเข้ามา Login ซ้ำๆ ในเวลา 1 นาที ครบ 3 ครั้งก็จะทำการบล็อก IP ดังกล่าวเป็นเวลา 1 วัน อันนี้เป็นข้อดีของสคริปต์นี้เมื่อเทียบกับหลายๆ สคริปต์ที่ใช้กันอยู่ ซึ่งจะบล็อคเลยทันที เนื่องจากเวลาเอาไปใช้งานจริง มีโอกาสเป็นไปได้ว่า พนักงานหรือแม้แต่เราเองที่ต้องใช้ VPN บางทีก็กรอกรหัสผ่านผิด ซึ่งถ้าครั้งเดียวแล้วล็อกเลย ก็จะเป็นภาระกับผู้ดูแลระบบที่จะต้องคอยมาเคลียร์ระบบให้กับยูสเซอร์ที่กรอกรหัสผิดพลาด หรือถ้าผู้ดูแลระบบกรอกผิดเองแล้วไม่สามารถเข้าระบบได้ก็ยิ่งแย่เข้าไปใหญ่ 🙂

 

/ip firewall filter
add chain=input protocol=tcp dst-port=22 src-address-list=ssh_blacklist action=drop comment="drop ssh brute forcers" disabled=no
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage3 action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=1d disabled=no
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage2 action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=1m disabled=no
add chain=input protocol=tcp dst-port=22 connection-state=new src-address-list=ssh_stage1 action=add-src-to-address-list address-list=ssh_stage2 address-list-timeout=1m disabled=no
add chain=input protocol=tcp dst-port=22 connection-state=new action=add-src-to-address-list address-list=ssh_stage1 address-list-timeout=1m disabled=no