คู่มือการจัดการรหัสผ่าน MySQL: วิธีตั้งค่า, เปลี่ยน, รีเซ็ต และทำให้รหัสผ่านปลอดภัย (Windows, Linux, Mac)

目次

1. บทนำ

ความสำคัญของการจัดการรหัสผ่าน MySQL

MySQL เป็นระบบจัดการฐานข้อมูลที่ใช้กันอย่างแพร่หลายทั่วโลก อย่างไรก็ตาม พื้นฐานของการจัดการความปลอดภัย อยู่ที่ การกำหนดค่าและการดูแลรหัสผ่านอย่างเหมาะสม หากไม่มีการจัดการรหัสผ่านที่เหมาะสม คุณอาจเผชิญกับ ความเสี่ยง ต่อไปนี้:

  • การเข้าถึงโดยไม่ได้รับอนุญาต : รหัสผ่านที่อ่อนแอทำให้ระบบของคุณเสี่ยงต่อการโจมตีจากภายนอก
  • การรั่วไหลของข้อมูล : ข้อมูลที่สำคัญอาจถูกเปิดเผยโดยผู้ใช้ที่มีเจตนาร้าย
  • การดัดแปลงระบบ : การลบหรือแก้ไขข้อมูลอาจส่งผลต่อการทำงานปกติของเว็บไซต์และแอปพลิเคชัน

เพื่อหลีกเลี่ยงความเสี่ยงเหล่านี้ จำเป็นต้อง ตั้งรหัสผ่านที่แข็งแรงและเปลี่ยนเป็นประจำ ในบทความนี้ เราจะอธิบายรายละเอียดของการจัดการรหัสผ่าน MySQL ดังต่อไปนี้:

วิธีตั้งรหัสผ่านสำหรับผู้ใช้ใหม่
วิธีเปลี่ยนรหัสผ่านสำหรับผู้ใช้ที่มีอยู่
วิธีรีเซ็ตรหัสผ่านที่ลืม
วิธีตรวจสอบความแข็งแรงของรหัสผ่าน
ข้อผิดพลาดทั่วไปและวิธีแก้ไข
การตั้งค่าที่แนะนำเพื่อเพิ่มความปลอดภัย

โดยการอ่านบทความนี้ คุณจะได้รับ ความรู้และทักษะที่จำเป็นในการจัดการรหัสผ่าน MySQL อย่างถูกต้อง ดังนั้นอย่าลืมอ่านจนจบ

2. วิธีตั้งค่าและเปลี่ยนรหัสผ่าน MySQL

การสร้างผู้ใช้ใหม่และตั้งรหัสผ่าน

ส่วนนี้อธิบายวิธีสร้างผู้ใช้ใหม่และตั้งรหัสผ่านใน MySQL

1. เข้าสู่ระบบ MySQL

ก่อนอื่นให้เข้าสู่ระบบในฐานะผู้ดูแล MySQL (เช่นผู้ใช้ root)

mysql -u root -p

-u root เป็นตัวเลือกเพื่อ เข้าสู่ระบบในฐานะผู้ใช้ root และ -p จะทำให้แสดง ข้อความขอรหัสผ่าน

2. สร้างผู้ใช้ใหม่และตั้งรหัสผ่าน

ใช้คำสั่ง CREATE USER เพื่อสร้างผู้ใช้ใหม่และตั้งรหัสผ่าน

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'secure_password';
  • 'newuser'@'localhost' : ระบุชื่อผู้ใช้ ( newuser ) และโฮสต์ ( localhost ) ที่ผู้ใช้สามารถเชื่อมต่อได้
  • 'secure_password' : รหัสผ่านที่ต้องตั้ง (ควรใช้รหัสผ่านที่แข็งแรง)

3. ให้สิทธิ์ที่เหมาะสม

คุณต้องมอบสิทธิ์ฐานข้อมูลให้กับผู้ใช้ใหม่ ตัวอย่างเช่นเพื่อมอบสิทธิ์ทั้งหมด

GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost' WITH GRANT OPTION;
  • ALL PRIVILEGES : มอบสิทธิ์ทั้งหมด
  • *.* : อนุญาตให้เข้าถึงฐานข้อมูลและตารางทั้งหมด
  • WITH GRANT OPTION : อนุญาตให้ผู้ใช้มอบสิทธิ์ต่อให้ผู้ใช้คนอื่นได้

4. ใช้สิทธิ์ที่กำหนด

เรียกใช้ FLUSH PRIVILEGES เพื่อให้การเปลี่ยนแปลงมีผล

FLUSH PRIVILEGES;

คุณได้สร้างผู้ใช้ใหม่พร้อมรหัสผ่านที่ปลอดภัยและสิทธิ์ที่เหมาะสมเรียบร้อยแล้ว

การเปลี่ยนรหัสผ่านของผู้ใช้ที่มีอยู่

ส่วนนี้อธิบายวิธีเปลี่ยนรหัสผ่านของผู้ใช้ MySQL ที่มีอยู่แล้ว

1. เข้าสู่ระบบ MySQL

เข้าสู่ระบบด้วยสิทธิ์ผู้ดูแลระบบ

mysql -u root -p

2. เปลี่ยนรหัสผ่านโดยใช้ ALTER USER (MySQL 5.7 และรุ่นต่อไป)

ALTER USER 'existinguser'@'localhost' IDENTIFIED BY 'new_secure_password';
  • 'existinguser'@'localhost' : ชื่อผู้ใช้และโฮสต์ที่ต้องแก้ไข
  • 'new_secure_password' : รหัสผ่านใหม่

3. เปลี่ยนรหัสผ่านโดยใช้ SET PASSWORD (MySQL 5.6 และรุ่นก่อนหน้า)

SET PASSWORD FOR 'existinguser'@'localhost' = PASSWORD('new_secure_password');

การใช้ฟังก์ชัน PASSWORD() จะทำให้มั่นใจว่ารหัสผ่านถูกเข้ารหัสอย่างถูกต้องก่อนบันทึก

4. ใช้การเปลี่ยนแปลง

อย่าลืมเรียกใช้ FLUSH PRIVILEGES;

FLUSH PRIVILEGES;

คุณสามารถเปลี่ยนรหัสผ่านของผู้ใช้ที่มีอยู่ได้อย่างปลอดภัยโดยใช้วิธีนี้

3. วิธีรีเซ็ตรหัสผ่าน MySQL หากคุณลืม

แม้ว่าคุณจะลืมรหัสผ่าน MySQL ของคุณ คุณก็สามารถรีเซ็ตได้โดยทำตามขั้นตอนที่ถูกต้อง ส่วนนี้อธิบายวิธีรีเซ็ตรหัสผ่านบน Windows, Linux, และ Mac

วิธีรีเซ็ตรหัสผ่าน MySQL บน Windows

บน Windows วิธีทั่วไปในการรีเซ็ตรหัสผ่าน root ของ MySQL คือการใช้ skip-grant-tables option.

1. Stop the MySQL Service

ก่อนแรก ให้หยุดบริการ MySQL ที่กำลังทำงานอยู่บน Windows.

net stop mysql

หรือคุณสามารถเปิด services.msc และหยุดบริการ MySQL ด้วยตนเอง หยุดบริการ MySQL.

2. Start MySQL Using mysqld --skip-grant-tables

mysqld --skip-grant-tables --skip-networking

3. Log in to MySQL

mysql -u root

4. Set a New Password

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';

หรือ สำหรับ MySQL 5.6 และก่อนหน้า ให้ใช้ SET PASSWORD.

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_secure_password');

5. Restart MySQL

net stop mysql
net start mysql

How to Reset a MySQL Password on Linux / Mac

1. Stop the MySQL Service

sudo systemctl stop mysql

2. Start MySQL in --skip-grant-tables Mode

sudo mysqld_safe --skip-grant-tables --skip-networking &

3. Log in to MySQL

mysql -u root

4. Reset the Password

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';

5. Restart MySQL

sudo systemctl start mysql

Changes in Password Reset Methods in MySQL 8.0 and Later

ใน MySQL 8.0, กลไกการจัดการรหัสผ่านได้เปลี่ยนแปลง ดังนั้นคุณควรสังเกตจุดต่อไปนี้.

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_secure_password';

สิ่งนี้ทำให้คุณสามารถ ใช้วิธีการตรวจสอบรหัสผ่านแบบเก่า เมื่อจำเป็น.

4. Troubleshooting Common Errors When Changing MySQL Passwords

คุณอาจพบข้อผิดพลาดเมื่อพยายามเปลี่ยนรหัสผ่าน MySQL ส่วนนี้อธิบายสาเหตุและวิธีแก้ไขสำหรับข้อผิดพลาดทั่วไป.

ERROR 1045 (28000): Access denied for user

Cause of the Error

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

ข้อผิดพลาดนี้เกิดขึ้นเมื่อเข้าสู่ระบบ MySQL หาก รหัสผ่านไม่ถูกต้อง หรือ สิทธิ์ไม่เพียงพอ.

Solution

  1. ตรวจสอบรหัสผ่านที่คุณใส่ใหม่
  2. ระบุชื่อผู้ใช้และโฮสต์ที่ถูกต้อง
    SELECT User, Host FROM mysql.user;
    
  1. รีเซ็ตรหัสผ่าน (ดูส่วนการรีเซ็ตรหัสผ่าน)
  2. กำหนดสิทธิ์อย่างเหมาะสม
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    

ERROR 1133: Can’t find any matching row in the user table

Cause of the Error

ERROR 1133: Can't find any matching row in the user table

ข้อผิดพลาดนี้เกิดขึ้นเมื่อ ผู้ใช้ที่ระบุไม่มีอยู่.

Solution

  1. ตรวจสอบรายการผู้ใช้ปัจจุบัน
    SELECT User, Host FROM mysql.user;
    
  1. สร้างผู้ใช้ใหม่
    CREATE USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
    
  1. ระบุโฮสต์ที่ถูกต้อง (ใช้ localhost หรือ % อย่างเหมาะสม)

ERROR 1820: You must reset your password

Cause of the Error

ERROR 1820: You must reset your password using ALTER USER statement before executing this statement.

ข้อผิดพลาดนี้เกิดขึ้นเมื่อ รหัสผ่านหมดอายุ.

Solution

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';

เพื่อปิดการหมดอายุของรหัสผ่าน:

SET GLOBAL default_password_lifetime = 0;

ERROR 2059: Plugin caching_sha2_password could not be loaded

Cause of the Error

ERROR 2059: Plugin caching_sha2_password could not be loaded

ใน MySQL 8.0 และรุ่นต่อไป, ปลั๊กอินการตรวจสอบสิทธิ์เริ่มต้นเปลี่ยนเป็น caching_sha2_password ซึ่งอาจทำให้เกิดข้อผิดพลาดกับบางไคลเอนต์.

Solution

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_secure_password';

หรือเพิ่มต่อไปนี้ในไฟล์กำหนดค่า MySQL (my.cnf หรือ my.ini) แล้วรีสตาร์ท MySQL.

[mysqld]
default_authentication_plugin=mysql_native_password

รีสตาร์ท MySQL:

sudo systemctl restart mysql

5. การเสริมความปลอดภัยของ MySQL และการตั้งค่าที่แนะนำ

การเสริมความปลอดภัยของ MySQL เป็นสิ่งสำคัญเพื่อปรับปรุงความปลอดภัยของฐานข้อมูลและ ป้องกันการเข้าถึงโดยไม่ได้รับอนุญาตและการละเมิดข้อมูล ส่วนนี้แนะนำ การกำหนดค่าที่แนะนำ เพื่อเพิ่มความปลอดภัยของ MySQL.

ตั้งรหัสผ่านที่แข็งแรง

การใช้รหัสผ่านที่อ่อนแอใน MySQL ทำให้ระบบของคุณเป็นเป้าหมายง่ายสำหรับผู้โจมตี ตั้งค่าการกำหนดค่าเพื่อ เพิ่มความแข็งแรงของรหัสผ่าน.

เปิดใช้งานนโยบายรหัสผ่าน

ตรวจสอบนโยบายรหัสผ่านปัจจุบัน:

SHOW VARIABLES LIKE 'validate_password%';

กำหนดนโยบายรหัสผ่านที่แข็งแรง:

SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;

ตั้งวันหมดอายุของรหัสผ่าน

การเปลี่ยนรหัสผ่านเป็นประจำช่วยเพิ่มความปลอดภัย.

ตรวจสอบการตั้งค่าวันหมดอายุของรหัสผ่านปัจจุบัน:

SHOW VARIABLES LIKE 'default_password_lifetime';

ตั้งวันหมดอายุของรหัสผ่านเป็น 90 วัน:

SET GLOBAL default_password_lifetime = 90;

เสริมความปลอดภัยของผู้ใช้ root

จำกัดการเข้าถึงระยะไกลสำหรับผู้ใช้ root

ตรวจสอบการกำหนดค่าโฮสต์ปัจจุบันสำหรับผู้ใช้ root:

SELECT User, Host FROM mysql.user WHERE User = 'root';

ปิดการเข้าถึงระยะไกลสำหรับ root:

UPDATE mysql.user SET Host='localhost' WHERE User='root';
FLUSH PRIVILEGES;

สร้างบัญชีผู้ดูแลระบบทางเลือกและปิดการใช้งาน root

CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'localhost' WITH GRANT OPTION;
RENAME USER 'root'@'localhost' TO 'disabled_root'@'localhost';
FLUSH PRIVILEGES;

จำกัดการเชื่อมต่อระยะไกลของ MySQL

แก้ไขไฟล์การกำหนดค่า (my.cnf หรือ my.ini):

[mysqld]
bind-address = 127.0.0.1

กำหนดค่าไฟร์วอลล์บน Linux:

sudo ufw deny 3306

อนุญาตเฉพาะที่อยู่ IP เฉพาะหนึ่งเท่านั้น:

sudo ufw allow from 192.168.1.100 to any port 3306

ลบบัญชีและสิทธิ์ที่ไม่จำเป็น

ตรวจสอบรายการผู้ใช้ปัจจุบัน:

SELECT User, Host FROM mysql.user;

ลบผู้ใช้ที่เป็นนิรนาม:

DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;

ลบฐานข้อมูลทดสอบที่ไม่จำเป็น:

DROP DATABASE test;
FLUSH PRIVILEGES;

เปิดการบันทึกของ MySQL

เปิดบันทึกข้อผิดพลาด:

[mysqld]
log_error = /var/log/mysql/error.log

เปิดบันทึกการสืบค้นทั่วไป:

general_log = 1
general_log_file = /var/log/mysql/general.log

รีสตาร์ท MySQL:

sudo systemctl restart mysql

6. คำถามที่พบบ่อย (FAQ)

ส่วนนี้สรุป คำถามและวิธีแก้ปัญหาที่พบบ่อย ที่เกี่ยวกับการตั้งค่า, การแก้ไข, และการรีเซ็ตรหัสผ่าน MySQL.

Q1: วิธีที่ง่ายที่สุดในการกู้คืนรหัสผ่าน root ของ MySQL ที่ลืมคืออะไร?

วิธีแก้ไข

  1. หยุด MySQL
    sudo systemctl stop mysql
    
  1. เริ่ม MySQL ในโหมด skip-grant-tables
    sudo mysqld_safe --skip-grant-tables --skip-networking &
    
  1. เข้าสู่ระบบ MySQL
    mysql -u root
    
  1. ตั้งรหัสผ่านใหม่
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
    
  1. รีสตาร์ท MySQL
    sudo systemctl restart mysql
    

Q2: ควรทำอย่างไรหากเห็นข้อความ “ERROR 1045 (28000): Access denied for user”?

วิธีแก้ไข

  1. ตรวจสอบรหัสผ่านที่คุณป้อน
    mysql -u root -p
    
  1. ยืนยันว่าผู้ใช้นั้นมีอยู่
    SELECT User, Host FROM mysql.user;
    
  1. รีเซ็ตรหัสผ่าน (ดูคำแนะนำก่อนหน้า)

  2. มอบสิทธิ์ที่เหมาะสม

    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    

Q3: มีความแตกต่างระหว่าง MySQL 5.6 และ 8.0 เมื่อเปลี่ยนรหัสผ่านหรือไม่?

การเปลี่ยนรหัสผ่านใน MySQL 5.6 และก่อนหน้า

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_secure_password');

การเปลี่ยนรหัสผ่านใน MySQL 8.0 และรุ่นต่อไป

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';

ใน MySQL 8.0 เนื่องจาก caching_sha2_password เป็นวิธีการตรวจสอบสิทธิ์เริ่มต้น ลูกค้าเก่าอาจต้องการการปรับเปลี่ยนต่อไปนี้:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_secure_password';

Q4: ฉันจะเสริมความแข็งแกร่งให้กับนโยบายรหัสผ่านของ MySQL อย่างไร?

กำหนดนโยบายรหัสผ่านที่แข็งแรง

SET GLOBAL validate_password.policy = STRONG;
SET GLOBAL validate_password.length = 12;
SET GLOBAL validate_password.mixed_case_count = 1;
SET GLOBAL validate_password.number_count = 1;
SET GLOBAL validate_password.special_char_count = 1;

Q5: การปิดการใช้งานผู้ใช้ root ของ MySQL ปลอดภัยหรือไม่?

วิธีแก้ไข

  1. สร้างบัญชีผู้ดูแลระบบ
    CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'secure_password';
    GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'localhost' WITH GRANT OPTION;
    
  1. ปิดการใช้งานบัญชี root
    RENAME USER 'root'@'localhost' TO 'disabled_root'@'localhost';
    FLUSH PRIVILEGES;
    

Q6: มีเครื่องมือใดบ้างที่ช่วยจัดการรหัสผ่าน MySQL อย่างปลอดภัย?

วิธีแก้ไข

  1. mysql_config_editor (เครื่องมืออย่างเป็นทางการของ MySQL)
    mysql_config_editor set --login-path=local --host=localhost --user=root --password
    

สิ่งนี้ทำให้คุณสามารถเข้าสู่ระบบโดยไม่ต้องพิมพ์รหัสผ่านอย่างชัดเจน.

mysql --login-path=local
  1. โปรแกรมจัดการรหัสผ่าน (Bitwarden, 1Password, KeePass ฯลฯ) * มีประโยชน์สำหรับการสร้างและจัดเก็บรหัสผ่านที่แข็งแรงอย่างปลอดภัย.

Q7: ฉันสามารถบันทึกการเปลี่ยนแปลงรหัสผ่าน MySQL ได้หรือไม่?

วิธีแก้ไข

เปิดใช้งาน General Query Log

[mysqld]
general_log = 1
general_log_file = /var/log/mysql/general.log

รีสตาร์ท MySQL:

sudo systemctl restart mysql

7. สรุป

บทความนี้อธิบาย ทุกอย่างตั้งแต่พื้นฐานจนถึงเทคนิคขั้นสูง ของการจัดการรหัสผ่าน MySQL ด้านล่างเป็นสรุปของประเด็นสำคัญพร้อมกับ เช็คลิสต์เพื่อการจัดการรหัสผ่าน MySQL อย่างเหมาะสม.

ประเด็นสำคัญของการจัดการรหัสผ่าน MySQL

การกำหนดค่าและการจัดการรหัสผ่านที่เหมาะสมเป็นพื้นฐานของความปลอดภัย
ตั้งรหัสผ่านที่แข็งแรงเมื่อสร้างผู้ใช้ใหม่
เปลี่ยนรหัสผ่านเป็นประจำและกำหนดนโยบายการหมดอายุ
เข้าใจกระบวนการกู้คืนสำหรับรหัสผ่านที่ลืม
แก้ไขข้อผิดพลาดอย่างเหมาะสมระหว่างการเปลี่ยนรหัสผ่าน
ปรับแต่งการเข้าถึงระยะไกลและการจัดการผู้ใช้ root เพื่อเสริมความปลอดภัย
เปิดใช้งานการบันทึกเพื่อติดตามกิจกรรมที่เกี่ยวกับรหัสผ่าน

เช็คลิสต์การจัดการรหัสผ่าน MySQL

Checklist ItemStatus
Have you set a strong root password for MySQL?✅ / ❌
Do you use the CREATE USER command when creating new users?✅ / ❌
Have you enabled the validate_password plugin and configured a strong password policy?✅ / ❌
Do you regularly change passwords and set expiration policies?✅ / ❌
Have you disabled remote access for the root user?✅ / ❌
Have you removed unnecessary or anonymous accounts?✅ / ❌
Do you understand how to reset passwords using skip-grant-tables mode?✅ / ❌
Do you understand how to resolve ERROR 1045 and ERROR 1820 during password changes?✅ / ❌
Have you enabled MySQL logs (general_log and error_log)?✅ / ❌

ขั้นตอนต่อไปที่แนะนำหลังจากอ่านบทความนี้

  1. ตรวจสอบนโยบายรหัสผ่านปัจจุบันของคุณและเสริมความแข็งแกร่งหากจำเป็น
    SHOW VARIABLES LIKE 'validate_password%';
    SET GLOBAL validate_password.policy = STRONG;
    SET GLOBAL validate_password.length = 12;
    
  1. ลบบัญชีที่ไม่จำเป็น
    DELETE FROM mysql.user WHERE User='';
    DROP DATABASE test;
    FLUSH PRIVILEGES;
    
  1. จำกัดการเข้าถึงระยะไกลสำหรับผู้ใช้ root
    UPDATE mysql.user SET Host='localhost' WHERE User='root';
    FLUSH PRIVILEGES;
    
  1. กำหนดการหมดอายุรหัสผ่านเป็นประจำ
    SET GLOBAL default_password_lifetime = 90;
    
  1. เปิดใช้งานการบันทึกเพื่อการเฝ้าระวัง
    [mysqld]
    log_error = /var/log/mysql/error.log
    general_log = 1
    general_log_file = /var/log/mysql/general.log
    

รีสตาร์ท MySQL:

sudo systemctl restart mysql

บทความที่เกี่ยวข้องสำหรับการเรียนรู้เพิ่มเติม

📌 คู่มือโดยละเอียดการจัดการสิทธิ์ผู้ใช้ MySQL
📌 ขั้นตอนการสำรองและกู้คืน MySQL
📌 วิธีการปรับแต่งฐานข้อมูล MySQL
📌 การกำหนดค่า MySQL ด้วยการตรวจสอบสิทธิ์ภายนอก (LDAP หรือ OAuth)

ความคิดสุดท้าย

MySQL password management is ความรู้ที่จำเป็น for protecting database security.
Apply the practices covered in this guide and ensure การจัดการฐานข้อมูลที่ปลอดภัย! 💪