สำหรับท่านที่ใช้ Cloudflare CDN อยู่แล้ว สามารถดูวิธีป้องกันได้จากลิงก์นี้ครับ https://xvlnw.com/topic/370
แต่สำหรับผู้ที่ไม่ได้ใช้งาน Cloudflare เราสามารถใช้งานการตั้งค่า Limit Req ใน Nginx ช่วยได้ครับ โดยหลักการก็คือ เราจะทำการ Limit การเรียกใช้งาน wp-login.php ไม่ให้โดนเรียกเร็วเกินไป หรือเกินกว่าที่ควรจะเป็น โดยตั้งสมติฐานว่า หากเราเป็นผู้ใช้งานทั่วไป เรียกหน้า wp-login.php พิมพ์ User + Pass แล้วก็ Login น่าจะใช้เวลาเร็วสุด ราวๆ 5 – 10 วินาที เพราะฉะนั้น หากเร็วกว่านี้ แสดงว่าเป็นบอทแน่นอน มาดูการตั้งค่ากันเลยครับ
เพิ่ม Limit zone ในส่วนของ http { } โดนค่า 10r/m คือ 10 Req/นาที หรือ 6 Req/วินาที
http{ # เก็บ Log error_log /var/log/nginx/error.log warn; ... # Limits limit_req_log_level warn; limit_req_zone $binary_remote_addr zone=login:10m rate=10r/m; ... }
เพิ่ม Rule ที่ต้องการเรียกใช้ limit_req ไว้ในส่วนของ server{ … } แนะนำให้วางไว้ก่อน location / หรือแล้วแต่การวาง Config ของแต่ละคนนะครับ
server{ ... # WordPress: throttle wp-login.php location = /wp-login.php { limit_req zone=login burst=2 nodelay; # ส่ง Req ไปยัง Backend #proxy_pass http://127.0.0.1:8000 // กรณีใช้ Nginx + Apache หรือ Upstream Backend #fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; // กรณีใช้ Nginx + PHP-FPM # } location / { ... } .. }
ทดสอบ Rule ด้วย nginx -t และโหลด Config ด้วย nginx -s reload ตามลำดับ
วิธีการทดสอบ เราสามารถใช้ curl ทดสอบได้ด้วยคำสั่งนี้ โดยเรียกซ้ำๆหลายๆครั้ง เราจะเห็นว่า http status ที่ Return กลับมาจะไม่ใช่ 200 จนกว่าเวลาจะถึงที่อนุญาตให้เรียกใช้งาน ตามที่เรากำหนดไว้
curl -I http://domain.com/wp-login.php
อาการก็จะประมาณนี้ครับ
การตั้งค่า Nginx แบบนี้ จะไม่กระทบกับผู้ใช้งานด้วย แทบจะไม่รู้เลยครับ นอกจากพิมพ์รหัสผ่านเข้าระบบเร็วเกินไป T_T และสำหรับ Hacker ก็จะมีผลทำให้ถ่วงเวลาในการ Bruteforce ลงไปได้ และไม่ทำให้ Server ทำงานหนัก เพราะว่าโดนตัดการเชื่อมต่อตั้งแต่ด่านหน้าที่เป็น Nginx และยังไม่เข้าไปถึง Backend นั่นเองครับ
สำหรับ Nginx Rate Limit ยังสามารถนำเอาไปปรับปรุงใช้กับ Page อื่นๆที่ไม่ต้องการให้เรียกถี่เกินไปก็ได้นะครับ แล้วแต่ว่าระบบเราจะออกแบบไว้แบบไหน ซึ่งก็ถือว่ามีประโยชน์มากๆครับกับ Feature นี้
The post WordPress ป้องกัน Brute Force wp-login.php ด้วย Nginx Rate Limit first appeared on 1412.]]>