การไม่ซ่อนหน้า wp-login.php ในเว็บไซต์ WordPress บน Production เป็นประเด็นที่สำคัญในด้านความปลอดภัย แม้ว่าจะเป็นเพียงหนึ่งในหลาย ๆ มาตรการที่ควรนำมาปฏิบัติ การซ่อนหน้า wp-login.php สามารถช่วยลดความเสี่ยงจากการโจมตีแบบ Brute Force ซึ่งเป็นการพยายามสุ่มรหัสผ่านเพื่อเข้าสู่ระบบ นอกจากจะเพิ่มความเสี่ยงต่อการถูกแฮกแล้ว ยังอาจทำให้เซิร์ฟเวอร์ทำงานหนักขึ้นจากการโจมตีด้วยการสุ่มรหัสผ่านอย่างต่อเนื่อง
หากต้องการเปิดหน้า wp-login.php เอาไว้ก็สามารถทำได้ แต่ควรมีการตั้งค่าจำกัดจำนวนครั้งในการพยายามเข้าสู่ระบบ และหากเกินจำนวนที่กำหนดก็สามารถตั้งค่าให้แบน IP ได้ วิธีนี้ดีกว่าการเปิดไว้โดยไม่มีการจำกัดอะไรเลย เนื่องจาก bot มักจะวิ่งหา wp-login.php โดยอัตโนมัติและพยายามเข้าสู่ระบบ หากเราเปลี่ยน URL ของหน้าล็อกอิน ก็จะช่วยถ่วงเวลาให้ bot หาหน้าล็อกอินได้ยากขึ้น ซึ่งช่วยเพิ่มความปลอดภัยให้กับเว็บไซต์ได้มากขึ้น
คำแนะนำเรื่องการป้องกัน Brute Force จาก WordPress
โดยตามคำแนะนำเป็นทางการของ WordPress เรื่องการป้องกัน Brute Force แนะนำให้ทั้งหมดดังนี้
- เปลี่ยน URL การเข้าสู่ระบบ – เปลี่ยน URL จาก wp-login.php เพื่อหลีกเลี่ยงการโจมตีโดยตรง
- ใช้รหัสผ่านที่แข็งแกร่ง – สร้างรหัสผ่านที่คาดเดายากและเปลี่ยนรหัสผ่านบ่อยๆ
- จำกัดความพยายามในการเข้าสู่ระบบ – ใช้ปลั๊กอินที่ช่วยจำกัดจำนวนครั้งในการเข้าสู่ระบบที่ล้มเหลว
- ใช้ระบบการยืนยันตัวตนแบบสองขั้นตอน – เพิ่มความปลอดภัยโดยการใช้ระบบยืนยันตัวตนแบบสองขั้นตอน (2FA)
- บล็อก IP ที่น่าสงสัย – บล็อก IP ที่มีพฤติกรรมน่าสงสัยเพื่อป้องกันการโจมตี
วิธีการสร้าง .htpasswd เพื่อป้องกันการเข้าถึง wp-login โดยตรง
วิธีการซ่อนการเข้าถึง wp-login.php โดยไม่ต้องลง Plugin เพิ่ม ซึ่งแนะนำจาก WordPress Best Practice เพียงแค่เขียนโค้ดไม่กี่บรรทัด โดยเราจะสร้าง Layer อีกหนึ่งชั้นเพื่อป้องกันการเข้าถึงหน้าล็อกอิน ด้วยการใช้ความสามารถจาก AppServe และ NGINX
ทุกครั้งที่เข้าหน้า wp-login.php จะมี Prompt Login เด้งขึ้นมาเพื่อให้กรอกรหัสผู้ใช้ และรหัสผ่านขึ้นมา โดยถ้ากรอกผิดจะทำให้ไม่สามารถเข้าไปยังหน้าล็อคอินของ WordPress ได้ วิธีการตั้งค่าจะต้องทำการสร้าง .htpasswd และแก้ไขไฟล์ .htacess ร่วมกัน
ขั้นตอนแรกต้องสร้าง .htpasswd โดยสามารถคลิกที่ ลิงก์ นี้
กรอกรหัสผู้ใช้ และรหัสผ่านที่ใช้ในการยืนยันตนสำหรับใช้ใน Prompt Login และจากน้ันให้เลือก Bcrypt (Apache v2.4 onwards ) กดปุ่ม Create .htpasswd file แล้วจะได้ text ชุดนึงมา ซึ่งมีลักษณะเหมือนด้านล่าง
demo:$2y$10$mHPbKdzE4up1TsWmaKurCeJQmPMeMeIiMHc7hQL5jJ64PbA1mAOIu
สร้างไฟล์ “.htpasswd” ขึ้นมา ที่ root directory ของ Host สังเกตได้ว่าจะเป็นที่เดียวกับ .htaccess ที่ไฟล์ WordPress สร้างมาให้เราตั้งแต่แรก จากนั้นให้นำชุด Text ที่ได้จากการ Generate ที่ได้ไปใส่ไว้ที่ไฟล์ .htpasswd และไปสู่ขั้นตอนถัดไป
แก้ไขไฟล์ .htacess กำหนดเงื่อนไข ให้ prompt login ก่อนการเข้าถึง wp-login เท่านั้น
หากเซิฟเวอร์ใช้ Apache ให้นำโค้ดนี้ไปวางไว้ด้านบนสุด ที่ไฟล์ .htaccess โดยโค้ด tag <Files wp-login.php> จะเป็นตัวกำหนดว่า ถ้าใครเข้า URL นี้ จำเป็นต้องล็อคอินก่อนเท่านั้น
# เริ่มการตั้งค่าการป้องกันไฟล์ wp-login.php <Files wp-login.php> # ระบุไฟล์ที่เก็บข้อมูลผู้ใช้และรหัสผ่าน AuthUserFile ~/.htpasswd # ระบุชื่อที่จะแสดงเมื่อขอให้ผู้ใช้ใส่ข้อมูลการเข้าสู่ระบบ AuthName "Private access" # กำหนดประเภทการยืนยันตัวตนเป็น Basic AuthType Basic # ระบุชื่อผู้ใช้ที่ได้รับอนุญาตให้เข้าถึงไฟล์ wp-login.php # demo = user ที่เราสร้างขึ้นมา require user demo </Files>
.htaccess
สำหรับ NGINX ให้นำโค้ดด้านล่างไปใส่ไว้ใน nginx.conf แทนซึ่งจะทำงานแบบเดียวกัน
location /wp-login.php { auth_basic "Private access"; # ข้อความที่จะแสดงในกล่องการยืนยันตัวตน auth_basic_user_file .htpasswd; # ไฟล์ที่เก็บข้อมูลชื่อผู้ใช้และรหัสผ่าน }
nginx.conf
ปัญหาที่เจอบ่อยคือ .htacess ไม่พบเจอตัว .htpasswd ซึ่งขึ้นอยู่กับเซิฟเวอร์นั้นๆ บางที่ใช้ . (จุด = ตำแหน่งปัจจุบันที่อยู่ไฟล์เดียวกับ .htaccess) ก็เจอแล้ว หรือบางที่ต้องกรอก absolute path ของไฟล์นั้นๆ ถึงจะเจอ หากใครไม่ทราบ absolute path สามารถติดต่อผู้ให้บริการเซิฟเวอร์เพื่อช่วยเหลือได้ครับ
ข้อสรุป
โดยหลังจากที่เราวางไฟล์ .htpasswd และแก้ไขไฟล์ .htaccess เรียบร้อยแล้ว เมื่อเราไปเข้าพยายามไปเข้าไปด้านหลังด้วยการพิมพ์ /wp-login.php ตรงๆ หรือเข้าไปยัง /wp-admin ระบบจะทำการดีดออกมาที่ wp-login.php จะเจอหน้าต่าง Prompt เข้าสู่ระบบอยู่ดี ถ้าหากเรากรอกรหัสผู้ใช้ และรหัสผ่านไม่ถูก ก็จะไม่สามารถเข้าถึงหน้าเข้าสู่ระบบของ WordPress ได้ เปรียบเสมือนเกราะป้องกันอีกชั้นนึง
โดยตัว Prompt เข้าสู่ระบบจะไม่ได้กันการ Brute force ได้ 100% ผู้ให้บริการบางเจ้าจึงติดตั้ง Fail2Ban ร่วมด้วยเพื่อเพิ่มระดับความปลอดภัยให้กับระบบ โดย Fail2Ban จะช่วยตรวจสอบและบล็อก IP ที่พยายามโจมตีหรือเข้าสู่ระบบล้มเหลวหลายครั้ง ซึ่งช่วยลดโอกาสที่ผู้โจมตีจะทำการ brute-force สำเร็จ
ซึ่งการป้องกันการโจมตี Brute force เป็นอีกวิธีหนึ่งเท่านั้น ในการทำให้ WordPress ปลอดภัย แต่ยังมีวิธีอีกมากมาย หากคุณสนใจสามารถอ่านรายละเอียดเพิ่มเติมได้ ที่นี่