วิธีป้องกัน WordPress Brute Force Attack ด้วย Cloudflare Rule

Brute Force Attack คืออะไร?

Brute Force Attack คือ วิธีการ Hack เว็บไซต์ประเภทหนึ่ง ที่ Hacker ก็ชอบใช้ ด้วยวิธีการเขียน Robots เข้ามาที่เว็บไซต์ของเราเพื่อสุ่มรหัสผ่านเข้าสู่ระบบ ในกรณีที่เป็น WordPress ก็คือ สุ่มรหัสผ่านเข้ามายังหน้า /wp-login.php และยังมีอีกช่องทางหนึ่งที่หลายๆคนอาจจะไม่ทราบ นั้นคือ สุ่ม Login ผ่านทาง XMLRPC ที่ลิงก์ /xmlrpc.php ด้วยการใช้ WordPress XML-RPC API ได้ด้วยนะเออ

WordPress Brute Force Attack

สำหรับเว็บไซต์ WordPress ที่ใช้งาน Cloudflare CDN ที่กำหนดให้ Traffic วิ่งผ่าน Cloudflare นั่น เราจะเจอปัญหาดังนี้

  1. IP ที่วิ่งเข้ามาที่ Server เป็น IP ของทาง Cloudflare ไม่ใช่ Real-IP ของผู้ใช้งานจริงๆ – แก้ไขได้ด้วยการ Config Server ให้แสดง Real-IP จาก Cloudflare ได้ แต่ต้องมีสิทธิ์เข้าถึง root เพื่อตั้งค่า Web Server (Cloudflare โชว์ IP จริงของผู้ใช้งานใน Nginx)
  2. จากข้อที่ 1 เมื่อเราได้ Real IP มาแล้ว วิธีการทั่วๆไปที่เราใช้งานกันก็คือ ติดตั้ง WordPress Plugin ที่มีความสามารถในการ Block IP ที่ทำการเชื่อมต่อเข้ามา Brute Force Attack ซึ่งก็จะมีหลากหลายตัวเลือก จะยังไม่กล่าวถึงในโพสๆนี้
  3. ใช้วิธีการป้องกันผ่านทาง Control Panel เช่น DirectAdmin (DA) มีโหมด “Parse service logs for brute force attacks” ซึ่งสามารถ Scan WordPress login log แล้วเอา IP ไป Block ที่ Firewall ได้ และสำหรับคนที่ใช้วิธีนี้ ผมบอกเลยว่าใช้ไม่ได้ครับ ถึงเราจะได้ Rea IP มา Block ก็จริง แต่ว่า Client เค้าเข้าผ่าน Cloudflate IP ซึ่งไม่ได้เข้ามาที่ Server เราตรงๆครับ ผ่าม! (DirectAdmin Firewall)

ปัญหาของ WordPress Plugin และ Server Security

คำถามคือ: ก็ป้องกันได้แล้วใช่ไหม หากผ่านทั้ง 2-3 ข้อข้างต้น? คำตอบคือ ใช่! แต่มันก็เหมือนปัญหาที่รอคอยวันที่จะระเบิดออกมา เพราะเราต้องคำนึงถึง Traffic ที่มันยังคงวิ่งผ่านเข้ามาที่ Server ของเราอยู่ดี ทำให้ Server ทำงานหนักโดยที่ไม่จำเป็น เพราะว่า Server มีการ Process Rule ต่างๆที่ WordPress Plugin ทำงาน ยิ่งโดน Brute Force Attack มากๆ จากหลายๆ IP ปัญหาก็คือ DB บวม (ถ้าเก็บ IP ใน Database),​ ไฟล์ .htaccess บวม (ในกรณี Block IP ผ่านทาง .htaccess) ส่งผลให้เว็บช้าลงเรื่อยๆ พอจะเห็นภาพแล้วใช่ไหมครับ

Cloudflare Brute Force Attack Rule

หลายคนอาจจะสงสัยว่า ก็ใช้ Cloudflare CDN แล้วหนิ Traffic ผ่านทาง Cloudflare แล้ว มันต้องกรอง Traffic ที่โจมตี Brute Force Attack ออกไปสิ! ผมแนะนำให้ลองกลับไปดู Access Log ของท่านด่วนครับ 555++

เพราะฉะนั้น เรามาเข้าเรื่องกันเลยครับ (เกริ่นมาซะเยอะเพื่อให้เห็นภาพชัดๆ) วิธีการตั้งค่า Cloudflare ให้ป้องกัน Brute Force Attack สำหรับ WordPress CMS ให้อยู่หมัด และ Traffic จะถูกกรองออกไปตั้งแต่ Cloudflare โดยที่ไม่เข้ามาถึง Server ของเราเลยครับ และไม่จำเป็นต้องติดตั้ง Plugin ป้องกัน Brute Force Attack แต่อย่างใด ให้ท่านไปที่ Cloudflare > Domain Name ของท่าน > Page Rules > Create Page Rule และตั้งค่าตามตัวอย่างด้านล่างนี้ครับ

Cloudflare ป้องกัน Brute Force Attack WordPress หน้า wp-login.php

Rule ที่ผมสร้างขึ้น หมายถึง การบังคับให้ wp-login.php เป็นโหมด “I’am Under Attack” ประมาณว่า เราถูกโจมตีอยู่นะ ทาง Cloudflare จะทำการเปิดระบบความปลอดภัยขึ้นมา 2 แบบ ดังนี้

I am Under Attack Lv1 – รอ 5 วินาที เราก็จะไปยังหน้า Login
I am Under Attack Lv2 – ต้องยืนยันว่าเป็น I am human ด้วย CAPTCHA

อธิบาย Rule ที่ผมใช้นี้ ผมจะใส่ * ไว้ทั้งข้างหน้า หมายถึง รวมทั้ง HTTP/HTTPS และรวมทุกๆ Sub Domain ที่ผมจะสร้างขึ้นในอนาคต ก็จะมีผลกับ Rule นี้ และข้างหลัง หมายถึง หากมี Parameter GET อะไรก็ตาม ก็ Bypass ผ่าน Rule นี้ไม่ได้ครับ และสำหรับใครที่ไม่ได้ใช้งาน WordPress XML-RPC API ผมแนะนำให้เพิ่มอีก Rule โดยการใส่ xmlrpc.php แทน wp-login.php นะครับ

Cloudflare Page Rules – สร้างได้ฟรี 3 Rules

เมื่อ Save and Deploy เสร็จ ก็จะได้ตามตัวอย่างเลยครับ จากนั้น วิธีการดู Access Log ที่เราตั้ง Rule ไว้ สามารถดูได้ที่เมนู Firewall > Overview เราจะเห็น Firewall Events สามารถคลิกดูรายละเอียดได้ครับ

เป็นอันเสร็จสิ้นแล้วครับ สำหรับวิธีการนี้ ยังสามารถเอาไปประยุกต์ใช้กับหน้า Login ของ Script ที่เราใช้งานกันอยู่ได้นะครับ และการตั้งค่านี้ ใช้ได้เฉพาะ Cloudflare CDN ถ้าใช้ Cloudflare DNS อย่างเดียว จะใช้งานไม่ได้นะครับ 😉

DirectAdmin เพิ่มความปลอดภัยด้วย Firewall (iptables, firewalld)

สำหรับ DA ที่ติดตั้งมาใหม่ๆ จะไม่มี iptables rule มาให้ เช่น block port, block bruteforce เป็นต้น สำหรับใครที่ต้องการ iptables เพื่อเสริมพลังความปลอดภัยให้กับระบบ DA รองรับ CentOS 6, CentOS 7 สามารถดูได้ตามลิงก์ตี้ https://help.directadmin.com/item.php?id=380

Note: ในกรณีที่ลิงก์ใช้งานไม่ได้ ให้ทำตามขั้นตอนนี้

สำหรับ CentOS 6 (init.d) เวอร์ชั่น 2.2

cd /etc/init.d
mv iptables iptables.backup
wget http://files.directadmin.com/services/all/block_ips/2.2/iptables
chmod 755 iptables

/etc/init.d/iptables restart

cd /usr/local/directadmin/scripts/custom
wget -O block_ip.sh http://files.directadmin.com/services/all/block_ips/2.2/block_ip.sh
wget -O show_blocked_ips.sh http://files.directadmin.com/services/all/block_ips/2.2/show_blocked_ips.sh
wget -O unblock_ip.sh http://files.directadmin.com/services/all/block_ips/2.2/unblock_ip.sh
chmod 700 block_ip.sh show_blocked_ips.sh unblock_ip.sh

touch /root/blocked_ips.txt
touch /root/exempt_ips.txt

cd /usr/local/directadmin/scripts/custom
wget -O brute_force_notice_ip.sh http://files.directadmin.com/services/all/block_ips/2.2/brute_force_notice_ip.sh
chmod 700 brute_force_notice_ip.sh

สำหรับ CentOS 7 (systemd) เวอร์ชั่น 2.2

systemctl mask firewalld
systemctl stop firewalld
yum -y install iptables-services
systemctl enable iptables

cd /usr/libexec/iptables
mv iptables.init iptables.init.backup
wget -O iptables.init http://files.directadmin.com/services/all/block_ips/2.2/iptables
chmod 755 iptables.init

systemctl reload iptables

cd /usr/local/directadmin/scripts/custom
wget -O block_ip.sh http://files.directadmin.com/services/all/block_ips/2.2/block_ip.sh
wget -O show_blocked_ips.sh http://files.directadmin.com/services/all/block_ips/2.2/show_blocked_ips.sh
wget -O unblock_ip.sh http://files.directadmin.com/services/all/block_ips/2.2/unblock_ip.sh
chmod 700 block_ip.sh show_blocked_ips.sh unblock_ip.sh

touch /root/blocked_ips.txt
touch /root/exempt_ips.txt

cd /usr/local/directadmin/scripts/custom
wget -O brute_force_notice_ip.sh http://files.directadmin.com/services/all/block_ips/2.2/brute_force_notice_ip.sh
chmod 700 brute_force_notice_ip.sh

ปิดการแจ้งเตือน Brute Force ใน Message

/usr/local/directadmin/directadmin set hide_brute_force_notifications 1

หลังจากติดตั้งเสร็จหมดแล้ว ให้ไปเปิด Auto Block IP ได้ที่ Administrator Settings > Parse service logs for brute force attacks นะครับ ซึ่ง Firewall ตัวนี้จะมีการป้องกัน DA Login, SMTP Login, FTP Login, phpMyAdmin Login, SSH Login ได้หมดเลย และสำหรับ WordPress CMS เราสามารถเปิดโหมด “Scan for WordPress attacks” เพื่อป้องกันการโดนสุ่มเข้าสู่ระบบได้ด้วยครับ