Wordpress Attack wp-login.php | 1412 https://xvlnw.com I'm on my way Fri, 04 Sep 2020 14:13:02 +0000 th hourly 1 https://wordpress.org/?v=5.5.13 WordPress ป้องกัน Brute Force wp-login.php ด้วย Nginx Rate Limit https://xvlnw.com/topic/612 Fri, 04 Sep 2020 14:13:00 +0000 https://xvlnw.com/?p=612 สำหรับท่านที่ตรวจสอบ Log แล้วพบว่ามีการเรียกใช้งาน wp-login.php แบบ POST /wp-login.php จำนวนมากๆ และแน่นอน ในวินาทีเดียวกัน ก็จะมีหลาย Req ด้วย เรียกได้ว่าโดน Access แบบรัวๆไม่ยั้ง เพื่อสุ่มรหัสผ่าน Login เข้าสู่ระบบ WordPress ของเรานั่นเอง สำหรับท่านที่ใช้ Cloudflare CDN อยู่แล้ว สามารถดูวิธีป้องกั…

The post WordPress ป้องกัน Brute Force wp-login.php ด้วย Nginx Rate Limit first appeared on 1412.]]>
สำหรับท่านที่ตรวจสอบ Log แล้วพบว่ามีการเรียกใช้งาน wp-login.php แบบ POST /wp-login.php จำนวนมากๆ และแน่นอน ในวินาทีเดียวกัน ก็จะมีหลาย Req ด้วย เรียกได้ว่าโดน Access แบบรัวๆไม่ยั้ง เพื่อสุ่มรหัสผ่าน Login เข้าสู่ระบบ WordPress ของเรานั่นเอง

สำหรับท่านที่ใช้ 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.]]>