Wordpress โดน Hack | 1412 https://xvlnw.com I'm on my way Sat, 30 Dec 2023 17:05:53 +0000 th hourly 1 https://wordpress.org/?v=5.5.13 คอร์สเรียน WordPress ออนไลน์ https://xvlnw.com/topic/730 Wed, 25 Nov 2020 20:19:00 +0000 https://xvlnw.com/?p=730 ครอสเรียน WordPress ออนไลน์ฉบับมืออาชีพ จะสอนเกี่ยวกับระบบ WordPress อย่างละเอียด ตั้งแต่เริ่มต้นแบบมือใหม่ จนถึงระบบแบบมืออาชีพ ซึ่งประกอบไปด้วย 3 บทเรียนหลักๆ ดังนี้ WordPress Basic – จะสอนเกี่ยวกับระบบพื้นฐานการสร้างเว็บไซต์ด้วย WordPress ตั้งแต่แรก จนคุณมีเว็บไซต์เป็นของตัวเองได้ สอนทั้งเช…

The post คอร์สเรียน WordPress ออนไลน์ first appeared on 1412.]]>
Full WordPress Learning

ครอสเรียน WordPress ออนไลน์ฉบับมืออาชีพ จะสอนเกี่ยวกับระบบ WordPress อย่างละเอียด ตั้งแต่เริ่มต้นแบบมือใหม่ จนถึงระบบแบบมืออาชีพ ซึ่งประกอบไปด้วย 3 บทเรียนหลักๆ ดังนี้

  1. WordPress Basic – จะสอนเกี่ยวกับระบบพื้นฐานการสร้างเว็บไซต์ด้วย WordPress ตั้งแต่แรก จนคุณมีเว็บไซต์เป็นของตัวเองได้ สอนทั้งเช่า Cloud Server ติดตั้งระบบ WordPress สอนทำเว็บไซต์ขายสินค้าออนไลน์ สอนติดตั้ง Theme สวยๆ Plugin ที่ทำให้เว็บไซต์ของคุณดูหรูหรามีราคา
  2. WordPress SEO & Google PageSpeed Insights – สอนการทำ SEO บนระบบเว็บไซต์ที่สร้างขึ้นด้วย WordPress CMS และสอนทำคะแนน Google PageSpeed Insights ให้อยู่ในระดับ 90 – 100 ทั้งใน Desktop และ Mobile
  3. WordPress Security – สอนเซตระบบ WordPress ให้ปลอดภัย ไม่โดนแฮก ใครที่มีปัญหา WordPress โดนแฮก ต้องเรียนครอสนี้แล้วคุณจะรู้วิธีการป้องกันแฮกเกอร์เจาะระบบเว็บไซต์ของคุณ (ใช้ได้กับระบบ CMS หรือ Script อื่นๆอีกด้วย)

The post คอร์สเรียน WordPress ออนไลน์ first appeared on 1412.]]>
Security Header ของมันต้องมี https://xvlnw.com/topic/642 Sat, 12 Sep 2020 10:44:08 +0000 https://xvlnw.com/?p=642 Header ที่ควรจะมีใน Nginx config เพื่อเพิ่มความปลอดภัยให้กับเว็บไซต์ของเรา เอาไปไว้ในส่วนของ server { … } นะครับ แล้วถ้าไม่ได้ใช้ Nginx หละ ทำยังไง? เราสามารถใช้ .htaccess rewrite rule ใน Apache ได้ครับ สามารถใช้ได้กับทุกเว็บ ทุก CMS เช่น WordPress เป็นต้น ทดสอบ HTTP Header Validation ได้ที่ลิ…

The post Security Header ของมันต้องมี first appeared on 1412.]]>
Header ที่ควรจะมีใน Nginx config เพื่อเพิ่มความปลอดภัยให้กับเว็บไซต์ของเรา เอาไปไว้ในส่วนของ server { … } นะครับ

# Security headers
add_header X-Frame-Options           "SAMEORIGIN" always;
add_header X-XSS-Protection          "1; mode=block" always;
add_header X-Content-Type-Options    "nosniff" always;
add_header Referrer-Policy           "no-referrer-when-downgrade" always;
add_header Content-Security-Policy   "default-src 'self' http: https: data: blob: 'unsafe-inline' 'unsafe-eval'" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

แล้วถ้าไม่ได้ใช้ Nginx หละ ทำยังไง? เราสามารถใช้ .htaccess rewrite rule ใน Apache ได้ครับ

# Security headers
Header add X-Frame-Options           "SAMEORIGIN" always;
Header add X-XSS-Protection          "1; mode=block" always;
Header add X-Content-Type-Options    "nosniff" always;
Header add Referrer-Policy           "no-referrer-when-downgrade" always;
Header add Content-Security-Policy   "default-src 'self' http: https: data: blob: 'unsafe-inline' 'unsafe-eval'" always;
Header add Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

สามารถใช้ได้กับทุกเว็บ ทุก CMS เช่น WordPress เป็นต้น ทดสอบ HTTP Header Validation ได้ที่ลิงก์ https://securityheaders.com

สำหรับความหมายของแต่ละค่า ลองเอาไปค้นหาเพิ่มเติมกันดูนะครับ

The post Security Header ของมันต้องมี first appeared on 1412.]]>
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.]]>
วิธีป้องกัน WordPress Brute Force Attack ด้วย Cloudflare Rule https://xvlnw.com/topic/370 Fri, 17 Jul 2020 18:49:14 +0000 https://xvlnw.com/?p=370 Brute Force Attack คืออะไร? Brute Force Attack คือ วิธีการ Hack เว็บไซต์ประเภทหนึ่ง ที่ Hacker ก็ชอบใช้ ด้วยวิธีการเขียน Robots เข้ามาที่เว็บไซต์ของเราเพื่อสุ่มรหัสผ่านเข้าสู่ระบบ ในกรณีที่เป็น WordPress ก็คือ สุ่มรหัสผ่านเข้ามายังหน้า /wp-login.php และยังมีอีกช่องทางหนึ่งที่หลายๆคนอาจจะไม่ทราบ นั้น…

The post วิธีป้องกัน WordPress Brute Force Attack ด้วย Cloudflare Rule first appeared on 1412.]]>
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

แก้ไข1: แก้ไข Rule จาก *xvlnw.com/wp-login.php* => *xvlnw.com/*wp-login.php* แทนนะครับ เนื่องจากมี Log พบว่าสามารถ Brute Force มายัง xvlnw.com//wp-login.php ได้ ซึ่ง Rule ตามรูปยังไม่เข้ากฏ เลยปล่อยผ่านได้นั่นเอง

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 อย่างเดียว จะใช้งานไม่ได้นะครับ 😉

The post วิธีป้องกัน WordPress Brute Force Attack ด้วย Cloudflare Rule first appeared on 1412.]]>
DirectAdmin เพิ่มความปลอดภัยด้วย Firewall (iptables, firewalld) https://xvlnw.com/topic/274 Thu, 28 Jun 2018 10:27:11 +0000 https://xvlnw.com/?p=274 สำหรับ DA ที่ติดตั้งมาใหม่ๆ จะไม่มี iptables rule มาให้ เช่น block port, block bruteforce เป็นต้น สำหรับใครที่ต้องการ iptables เพื่อเสริมพลังความปลอดภัยให้กับระบบ DA รองรับ CentOS 6, CentOS 7 สามารถดูได้ตามลิงก์ตี้ https://help.directadmin.com/item.php?id=380 Note: ในกรณีที่ลิงก์ใช้งานไม่ได้ ให้ทำตา…

The post DirectAdmin เพิ่มความปลอดภัยด้วย Firewall (iptables, firewalld) first appeared on 1412.]]>
สำหรับ 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” เพื่อป้องกันการโดนสุ่มเข้าสู่ระบบได้ด้วยครับ

The post DirectAdmin เพิ่มความปลอดภัยด้วย Firewall (iptables, firewalld) first appeared on 1412.]]>