จัดการ MySQL User และ Privileges ใน cPanel

อย่าให้ User ทุกตัวมีสิทธิ์ ALL PRIVILEGES จัดการสิทธิ์ฐานข้อมูลให้ปลอดภัยขึ้น

จัดการ MySQL User และ Privileges ใน cPanel MySQL

MySQL User คืออะไร?

MySQL User คือบัญชี (Account) ที่ใช้สำหรับเชื่อมต่อเข้า MySQL Database เช่นเดียวกับ Username/Password ของคอมพิวเตอร์ Windows ที่ต่างกัน MySQL User ก็มี Username และ Password ที่แตกต่างกัน และแต่ละ User สามารถกำหนดสิทธิ์ (Privileges) ได้แตกต่างกัน

ตัวอย่าง MySQL User ของคุณ:

การมี MySQL User หลายตัว ที่แยกกันตามแต่ละ Database ช่วยลดความเสี่ยงจากการรั่วไหลข้อมูล ถ้า WordPress โดนแฮก และมีคนได้ Credential ของ Database ถ้า User นั้นมีสิทธิ์เฉพาะ Database ของ WordPress เท่านั้น คนแฮกก็ไม่สามารถเข้าถึง Database อื่น ๆ ได้

Privileges (สิทธิ์) ประเภทต่าง ๆ ใน MySQL

Privilege คือ "สิทธิ์" ที่บอกว่า User นั้นสามารถทำอะไรได้บ้าง Privilege มีหลายชนิด:

ตัวอย่าง Privilege ของ WordPress User:

วิธีสร้าง MySQL User ใหม่ใน cPanel

ขั้นตอน:

  1. Login เข้า cPanel https://yourdomain.com:2083
  2. หา Icon ชื่อ MySQL Databases (อยู่ในส่วน Databases)
  3. คลิก Add New User
  4. กรอก Username (ตัวอักษรและตัวเลขเท่านั้น ไม่มี Special Character)
  5. กรอก Password (ควรยาว 12+ ตัวอักษร มีตัวพิมพ์ใหญ่, ตัวพิมพ์เล็ก, ตัวเลข, Special Character)
  6. คลิก Create User

เมื่อสร้าง User เสร็จแล้ว ให้เลือก User นั้นและกำหนด Privilege ให้กับ Database ที่ต้องการ:

  1. ไปยังหัวข้อ Add User to Database
  2. เลือก User ที่สร้างใหม่
  3. เลือก Database ที่ต้องการ
  4. ตัวเลือก Privileges:
    • ถ้าต้องการให้ WordPress ใช้ → เลือก SELECT, INSERT, UPDATE, DELETE (ไม่เลือก ALL)
    • ถ้าต้องการ Plugin ในการสร้าง Table อัตโนมัติ → เพิ่ม CREATE, ALTER ด้วย
    • ไม่ให้เลือก DROP, GRANT ไม่ว่ากรณีไหนก็ตาม
  5. คลิก Add User to Database

แก้ไข Privilege ของ User ที่มีอยู่แล้ว

ถ้า User ใดใดมีสิทธิ์ที่เกินเกินความจำเป็น (เช่น มี DROP, GRANT, ALL PRIVILEGES) สามารถแก้ไขได้:

  1. ไปยัง cPanel MySQL Databases
  2. ในหัวข้อ Manage User Privileges ให้เลือก User ที่ต้องการแก้ไข
  3. ยกเลิก (Uncheck) Privilege ที่ไม่ต้องการ
  4. คลิก Update Privileges

หรือสามารถใช้ phpMyAdmin ได้ด้วย:

  1. เข้า phpMyAdmin ผ่าน cPanel
  2. ไปที่ User Accounts
  3. เลือก User ที่ต้องการแก้
  4. ปรับ Privileges ในแถบ Global Privileges และ Database-specific privileges
  5. บันทึกการเปลี่ยนแปลง
Tip: หลีกเลี่ยงการให้ root User ให้กับ Application (WordPress, Joomla, Magento) เพราะถ้ามีการแฮก Attacker จะได้ Full Control ของฐานข้อมูลทั้งหมด ควรสร้าง User แยกสำหรับแต่ละเว็บด้วยสิทธิ์จำกัด

ตรวจสอบว่า Privilege ถูกกำหนดอย่างถูกต้อง

สามารถตรวจสอบ Privilege ของ User ได้ใน phpMyAdmin:

-- 1. ดูสิทธิ์ของ User ทั้งหมด (ต้องใช้ root user)
SELECT user, host, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv FROM mysql.user WHERE user='username_ที่_ต้องการ_ดู';

-- 2. ดู Privilege ของ User บน Database เฉพาะตัว
SELECT user, host, select_priv, insert_priv, update_priv, delete_priv, create_priv, alter_priv FROM mysql.db WHERE user='username_ที่_ต้องการ_ดู';

-- 3. ตรวจสอบว่า User สามารถ Connect ได้หรือไม่ (ในเทอร์มินัล ถ้าใช้ SSH)
mysql -u username_ที่_ต้องการ_ดู -p -h localhost
# ถ้า Connect ได้ แสดง mysql> prompt ถ้าไม่ได้ จะเห็น error "Access denied"
Tip: ถ้าใช้ Shared Hosting ส่วนใหญ่ไม่มี SSH Access ให้ใช้ phpMyAdmin GUI แทนการเรียน Command Line ดูได้ผ่าน User Accounts > Edit Privileges

แก้ปัญหาที่พบบ่อย

Error: "Access denied for user 'username'@'localhost' (using password: YES)"

เกิดเมื่อ WordPress หรือ Application พยายาม Connect ไป MySQL แต่ Password ไม่ถูก หรือ User ที่ User นั้นไม่มี Privilege ในฐานข้อมูลนั้น

วิธีแก้: ตรวจสอบไฟล์ wp-config.php (สำหรับ WordPress) ว่า Username, Password, Database Name ที่ใส่ไว้ตรงกับที่สร้างใน cPanel หรือไม่ ถ้าตรง ลองตรวจสอบว่า User นั้นมี Privilege กับ Database นั้นแล้วหรือยัง (ผ่าน cPanel Add User to Database)

Error: "Cannot connect to MySQL server. User 'xxx' doesn't have permission"

เกิดเมื่อ User ที่ Application ใช้ ไม่มี Privilege พอสำหรับการทำงาน เช่น Plugin ต้องการ CREATE TABLE แต่ User ไม่มี CREATE Privilege

วิธีแก้: ไปที่ cPanel Manage User Privileges เพิ่ม Privilege ที่ขาดหายไป (เช่น CREATE, ALTER) แต่ต้องประมาณว่าต้องใช้อะไรบ้าง ไม่ควรให้ ALL PRIVILEGES ทั้งหมด

Error: "User ถูกลบออกไป แต่ยังมีข้อมูลในฐานข้อมูล"

บางครั้งเมื่อลบ User ข้อมูลที่เห็นแต่ไม่อยู่ในฐานข้อมูล (ตัวอย่าง corrupt data) อาจยังคงอยู่ เมื่อสร้าง User ใหม่อีกครั้ง Application อาจสับสนกับข้อมูลเก่า

วิธีแก้: ลบ Database ทั้งหมดแล้วสร้างใหม่ ถ้าเป็น WordPress ให้ Reinstall Plugin Installer หรือลองใช้ SQL export/import เพื่อ Backup ข้อมูลก่อน

Error: "ให้ User มี ALL PRIVILEGES แล้วแต่ยังไม่ได้ Permission"

อาจเกิดจาก Plugin หรือ Script ต้อง Super User Privilege (SUPER, FILE, PROCESS) ซึ่ง Shared Hosting ปกติไม่อนุญาต หรือ User นั้นไม่มี Privilege บน Database นั้นจริง ๆ (เช่น Add User ไป Database ผิด)

วิธีแก้: ตรวจสอบใน phpMyAdmin ว่า User นั้นมีรายการใน mysql.db table ที่ชี้ไปยัง Database ที่ต้องการจริง ๆ หรือไม่

Error: "ต้องการลบ User แต่กลัวว่า Application จะหยุดทำงาน"

ถ้า User นั้นถูกใช้โดย Application ที่กำลังทำงาน การลบ User จะทำให้ Application ไม่สามารถ Connect ไป MySQL ได้อีก

วิธีแก้: ก่อนลบ User ให้ Transfer Application ไปใช้ User อื่นก่อน เปลี่ยน wp-config.php, config.php หรือไฟล์ตั้งค่าอื่นให้ใช้ User ใหม่ แล้วค่อยลบ User เก่า


คำถามที่พบบ่อย

Q: ต้องสร้าง User แยกให้แต่ละ Database หรือ ใช้ User เดียวกันได้?

A: ควรสร้าง User แยกให้แต่ละ Database ถ้าเป็นไปได้ ทำให้ความปลอดภัยสูงขึ้น ถ้า Hacker ได้รับ Credential ของ WordPress User เขาไม่สามารถเข้า Database ของบริการอื่น ได้ ส่วนใหญ่ Shared Hosting ไม่มีข้อจำกัด User ดังนั้นควรสร้างเป็นหลักความปลอดภัยแทนที่จะออม

Q: ลืมรหัสผ่าน MySQL User ทำไงดี?

A: ไปที่ cPanel MySQL Databases > Change Password แล้วกรอก User ที่ต้องการเปลี่ยน จากนั้นตั้งรหัสผ่านใหม่ ห้ามใช้ Brute Force หรือวิธีการแฮก เพียงแค่ Hosting Provider ให้การเปลี่ยน Password ได้ตามปกติ

Q: WordPress ต้องให้ Privilege อะไรบ้างให้ Plugin ทำงานปกติ?

A: ปกติ WordPress ต้องการ SELECT, INSERT, UPDATE, DELETE เพื่อบันทึก Post, Comments, User ถ้า Plugin ต้องสร้าง Table เองก็ต้อง CREATE, ALTER, DROP ด้วย แต่ DROP ควรให้ระมัดระวัง ส่วนใหญ่ WordPress ไม่จำเป็นต้อง GRANT ไม่ว่ากรณีไหนก็ตาม