Hướng Dẫn Quản Lý Mật Khẩu MySQL: Cách Đặt, Thay Đổi, Đặt Lại và Bảo Mật Mật Khẩu (Windows, Linux, Mac)

目次

1. Giới thiệu

Tầm quan trọng của Quản lý Mật khẩu MySQL

MySQL là một hệ quản trị cơ sở dữ liệu được sử dụng rộng rãi trên toàn thế giới. Tuy nhiên, nền tảng của việc quản lý bảo mật của nó nằm ở cấu hình và quản trị mật khẩu đúng cách. Nếu không có quản lý mật khẩu thích hợp, bạn có thể gặp phải các rủi ro sau:

  • Truy cập trái phép : Mật khẩu yếu làm cho hệ thống của bạn dễ bị tấn công từ bên ngoài.
  • Rò rỉ dữ liệu : Thông tin nhạy cảm có thể bị kẻ xấu lộ ra.
  • Can thiệp hệ thống : Việc xóa hoặc sửa đổi dữ liệu có thể ảnh hưởng đến hoạt động bình thường của các trang web và ứng dụng.

Để tránh những rủi ro này, việc đặt mật khẩu mạnh và thay đổi chúng thường xuyên là rất quan trọng. Trong bài viết này, chúng tôi sẽ giải thích chi tiết các khía cạnh sau của việc quản lý mật khẩu MySQL:

Cách đặt mật khẩu cho người dùng mới
Cách thay đổi mật khẩu cho người dùng hiện có
Cách đặt lại mật khẩu đã quên
Cách kiểm tra độ mạnh của mật khẩu
Các lỗi thường gặp và cách khắc phục
Cài đặt đề xuất để tăng cường bảo mật

Bằng cách đọc bài viết này, bạn sẽ nắm được kiến thức và kỹ năng cần thiết để quản lý mật khẩu MySQL một cách đúng đắn, vì vậy hãy đọc đến cuối cùng.

2. Cách Đặt và Thay Đổi Mật Khẩu MySQL

Tạo Người Dùng Mới và Đặt Mật Khẩu

Phần này giải thích cách tạo người dùng mới và đặt mật khẩu trong MySQL.

1. Đăng nhập vào MySQL

Đầu tiên, đăng nhập với tư cách quản trị viên MySQL (ví dụ như người dùng root).

mysql -u root -p

-u root là tùy chọn để đăng nhập dưới quyền người dùng root, và -p hiển thị yêu cầu nhập mật khẩu.

2. Tạo Người Dùng Mới và Đặt Mật Khẩu

Sử dụng lệnh CREATE USER để tạo người dùng mới và đặt mật khẩu.

CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'secure_password';
  • 'newuser'@'localhost' : Xác định tên người dùng ( newuser ) và máy chủ ( localhost ) mà người dùng có thể kết nối từ đó.
  • 'secure_password' : Mật khẩu sẽ được đặt (hãy chắc chắn sử dụng mật khẩu mạnh).

3. Cấp Quyền Phù Hợp

Bạn phải cấp quyền truy cập cơ sở dữ liệu cho người dùng mới. Ví dụ, để cấp tất cả quyền:

GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost' WITH GRANT OPTION;
  • ALL PRIVILEGES : Cấp tất cả các quyền.
  • *.* : Cho phép truy cập vào tất cả các cơ sở dữ liệu và bảng.
  • WITH GRANT OPTION : Cho phép người dùng cấp quyền cho người dùng khác.

4. Áp Dụng Các Quyền

Thực thi FLUSH PRIVILEGES để áp dụng các thay đổi.

FLUSH PRIVILEGES;

Bạn đã tạo thành công một người dùng mới với mật khẩu bảo mật và các quyền phù hợp.

Thay Đổi Mật Khẩu của Người Dùng Đã Tồn Tại

Phần này giải thích cách thay đổi mật khẩu của một người dùng MySQL hiện có.

1. Đăng nhập vào MySQL

Đăng nhập với quyền quản trị.

mysql -u root -p

2. Thay Đổi Mật Khẩu Bằng ALTER USER (MySQL 5.7 và Sau này)

ALTER USER 'existinguser'@'localhost' IDENTIFIED BY 'new_secure_password';
  • 'existinguser'@'localhost' : Tên người dùng và máy chủ cần sửa đổi.
  • 'new_secure_password' : Mật khẩu mới.

3. Thay Đổi Mật Khẩu Bằng SET PASSWORD (MySQL 5.6 và Trước đó)

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

Sử dụng hàm PASSWORD() đảm bảo mật khẩu được mã hoá đúng cách trước khi lưu trữ.

4. Áp Dụng Các Thay Đổi

Đừng quên thực thi FLUSH PRIVILEGES;.

FLUSH PRIVILEGES;

Bây giờ bạn có thể thay đổi mật khẩu của người dùng hiện có một cách an toàn bằng phương pháp này.

3. Cách Đặt Lại Mật Khẩu MySQL Khi Bạn Quên

Ngay cả khi bạn quên mật khẩu MySQL, bạn vẫn có thể đặt lại nó bằng cách thực hiện đúng quy trình. Phần này giải thích cách đặt lại mật khẩu trên Windows, Linux và Mac.

Cách Đặt Lại Mật Khẩu MySQL trên Windows

Trên Windows, một cách tiếp cận phổ biến để đặt lại mật khẩu root của MySQL là sử dụng tùy chọn skip-grant-tables.

1. Dừng dịch vụ MySQL

Đầu tiên, dừng dịch vụ MySQL đang chạy trên Windows.

net stop mysql

Ngoài ra, bạn có thể mở services.mscdừng dịch vụ MySQL một cách thủ công.

2. Khởi động MySQL bằng cách sử dụng mysqld --skip-grant-tables

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

3. Đăng nhập vào MySQL

mysql -u root

4. Đặt mật khẩu mới

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

Hoặc, đối với MySQL 5.6 và các phiên bản trước, sử dụng SET PASSWORD.

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

5. Khởi động lại MySQL

net stop mysql
net start mysql

Cách đặt lại mật khẩu MySQL trên Linux / Mac

1. Dừng dịch vụ MySQL

sudo systemctl stop mysql

2. Khởi động MySQL ở chế độ --skip-grant-tables

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

3. Đăng nhập vào MySQL

mysql -u root

4. Đặt lại mật khẩu

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

5. Khởi động lại MySQL

sudo systemctl start mysql

Thay đổi trong các phương pháp đặt lại mật khẩu trong MySQL 8.0 và các phiên bản sau

Trong MySQL 8.0, cơ chế quản lý mật khẩu đã thay đổi, vì vậy bạn nên lưu ý điểm sau.

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

Điều này cho phép bạn tiếp tục sử dụng phương pháp xác thực mật khẩu legacy khi cần.

4. Khắc phục các lỗi thường gặp khi thay đổi mật khẩu MySQL

Bạn có thể gặp lỗi khi cố gắng thay đổi mật khẩu MySQL. Phần này giải thích nguyên nhân và giải pháp cho các lỗi thường gặp.

LỖI 1045 (28000): Truy cập bị từ chối cho người dùng

Nguyên nhân của lỗi

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

Lỗi này xảy ra khi đăng nhập vào MySQL nếu mật khẩu không đúng hoặc quyền hạn không đủ.

Giải pháp

  1. Kiểm tra lại mật khẩu bạn đã nhập
  2. Chỉ định tên người dùng và máy chủ đúng
    SELECT User, Host FROM mysql.user;
    
  1. Đặt lại mật khẩu (xem phần đặt lại mật khẩu)
  2. Cấu hình quyền hạn một cách đúng đắn
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    

LỖI 1133: Không thể tìm thấy bất kỳ hàng nào phù hợp trong bảng user

Nguyên nhân của lỗi

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

Lỗi này xảy ra khi người dùng được chỉ định không tồn tại.

Giải pháp

  1. Kiểm tra danh sách người dùng hiện tại
    SELECT User, Host FROM mysql.user;
    
  1. Tạo lại người dùng
    CREATE USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
    
  1. Chỉ định máy chủ đúng (sử dụng localhost hoặc % một cách thích hợp)

LỖI 1820: Bạn phải đặt lại mật khẩu của mình

Nguyên nhân của lỗi

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

Lỗi này xảy ra khi mật khẩu đã hết hạn.

Giải pháp

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

Để tắt việc hết hạn mật khẩu:

SET GLOBAL default_password_lifetime = 0;

LỖI 2059: Không thể tải plugin caching_sha2_password

Nguyên nhân của lỗi

ERROR 2059: Plugin caching_sha2_password could not be loaded

Trong MySQL 8.0 và các phiên bản sau, plugin xác thực mặc định đã thay đổi thành caching_sha2_password, điều này có thể gây lỗi với một số client.

Giải pháp

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

Hoặc thêm các dòng sau vào tệp cấu hình MySQL (my.cnf hoặc my.ini) và khởi động lại MySQL.

[mysqld]
default_authentication_plugin=mysql_native_password

Khởi động lại MySQL:

sudo systemctl restart mysql

5. Tăng cường bảo mật MySQL và các cài đặt đề xuất

Tăng cường bảo mật MySQL là cần thiết để cải thiện an toàn cơ sở dữ liệu và ngăn chặn truy cập trái phép và vi phạm dữ liệu. Phần này giới thiệu các cấu hình đề xuất để nâng cao bảo mật MySQL.

Đặt mật khẩu mạnh

Sử dụng mật khẩu yếu trong MySQL khiến hệ thống của bạn trở thành mục tiêu dễ dàng cho kẻ tấn công. Cấu hình các thiết lập để tăng cường độ mạnh của mật khẩu.

Kích hoạt chính sách mật khẩu

Kiểm tra chính sách mật khẩu hiện tại:

SHOW VARIABLES LIKE 'validate_password%';

Cấu hình một chính sách mật khẩu mạnh:

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;

Đặt thời gian hết hạn mật khẩu

Thay đổi mật khẩu thường xuyên tăng cường bảo mật.

Kiểm tra thiết lập thời gian hết hạn mật khẩu hiện tại:

SHOW VARIABLES LIKE 'default_password_lifetime';

Đặt thời gian hết hạn mật khẩu là 90 ngày:

SET GLOBAL default_password_lifetime = 90;

Tăng cường bảo mật người dùng root

Hạn chế truy cập từ xa cho người dùng root

Kiểm tra cấu hình host hiện tại cho người dùng root:

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

Vô hiệu hoá truy cập từ xa cho root:

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

Tạo tài khoản quản trị thay thế và vô hiệu hoá 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;

Hạn chế kết nối MySQL từ xa

Chỉnh sửa tệp cấu hình (my.cnf hoặc my.ini):

[mysqld]
bind-address = 127.0.0.1

Cấu hình tường lửa trên Linux:

sudo ufw deny 3306

Chỉ cho phép một địa chỉ IP cụ thể:

sudo ufw allow from 192.168.1.100 to any port 3306

Xóa các tài khoản và quyền không cần thiết

Kiểm tra danh sách người dùng hiện tại:

SELECT User, Host FROM mysql.user;

Xóa người dùng ẩn danh:

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

Xóa cơ sở dữ liệu test không cần thiết:

DROP DATABASE test;
FLUSH PRIVILEGES;

Kích hoạt ghi log MySQL

Kích hoạt log lỗi:

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

Kích hoạt log truy vấn chung:

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

Khởi động lại MySQL:

sudo systemctl restart mysql

6. Câu hỏi thường gặp (FAQ)

Phần này tóm tắt các câu hỏi và giải pháp phổ biến liên quan đến việc thiết lập, sửa đổi và đặt lại mật khẩu MySQL.

Câu hỏi 1: Cách dễ nhất để khôi phục mật khẩu root MySQL bị quên là gì?

Giải pháp

  1. Dừng MySQL
    sudo systemctl stop mysql
    
  1. Khởi động MySQL ở chế độ skip-grant-tables
    sudo mysqld_safe --skip-grant-tables --skip-networking &
    
  1. Đăng nhập vào MySQL
    mysql -u root
    
  1. Đặt mật khẩu mới
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_secure_password';
    
  1. Khởi động lại MySQL
    sudo systemctl restart mysql
    

Câu hỏi 2: Tôi nên làm gì nếu gặp lỗi “ERROR 1045 (28000): Access denied for user”?

Giải pháp

  1. Xác minh mật khẩu bạn đã nhập
    mysql -u root -p
    
  1. Xác nhận người dùng tồn tại
    SELECT User, Host FROM mysql.user;
    
  1. Đặt lại mật khẩu (xem hướng dẫn trước đó)
  2. Cấp quyền phù hợp
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
    

Câu hỏi 3: Có sự khác biệt nào giữa MySQL 5.6 và 8.0 khi thay đổi mật khẩu không?

Thay đổi mật khẩu trong MySQL 5.6 và các phiên bản trước

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

Thay đổi mật khẩu trong MySQL 8.0 và các phiên bản sau

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

Trong MySQL 8.0, vì caching_sha2_password là phương thức xác thực mặc định, các client cũ có thể cần thực hiện điều chỉnh sau:

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

Q4: Làm thế nào để tôi tăng cường chính sách mật khẩu MySQL?

Cấu hình chính sách mật khẩu mạnh

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: Có an toàn khi vô hiệu hoá người dùng root của MySQL không?

Giải pháp

  1. Tạo tài khoản quản trị viên
    CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'secure_password';
    GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'localhost' WITH GRANT OPTION;
    
  1. Vô hiệu hoá tài khoản root
    RENAME USER 'root'@'localhost' TO 'disabled_root'@'localhost';
    FLUSH PRIVILEGES;
    

Q6: Có công cụ nào để quản lý mật khẩu MySQL một cách an toàn không?

Giải pháp

  1. mysql_config_editor (Công cụ chính thức của MySQL)
    mysql_config_editor set --login-path=local --host=localhost --user=root --password
    

Điều này cho phép bạn đăng nhập mà không cần nhập mật khẩu một cách rõ ràng.

mysql --login-path=local
  1. Trình quản lý mật khẩu (Bitwarden, 1Password, KeePass, v.v.)
  • Hữu ích cho việc tạo và lưu trữ an toàn các mật khẩu mạnh.

Q7: Tôi có thể ghi lại các thay đổi mật khẩu MySQL không?

Giải pháp

Bật General Query Log

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

Khởi động lại MySQL:

sudo systemctl restart mysql

7. Kết luận

Bài viết này giải thích từ những kiến thức cơ bản đến các kỹ thuật nâng cao về quản lý mật khẩu MySQL. Dưới đây là tóm tắt các điểm chính cùng với danh sách kiểm tra để quản lý mật khẩu MySQL một cách đúng đắn.

Các điểm chính của quản lý mật khẩu MySQL

Cấu hình và quản lý mật khẩu đúng đắn là nền tảng của bảo mật
Đặt mật khẩu mạnh khi tạo người dùng mới
Thay đổi mật khẩu thường xuyên và cấu hình chính sách hết hạn
Hiểu quy trình khôi phục khi quên mật khẩu
Xử lý lỗi một cách đúng đắn khi thay đổi mật khẩu
Tối ưu hoá truy cập từ xa và quản lý người dùng root để tăng cường bảo mật
Bật ghi log để theo dõi các hoạt động liên quan đến mật khẩu

Danh sách kiểm tra quản lý mật khẩu 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)?✅ / ❌

Các hành động tiếp theo được đề xuất sau khi đọc bài viết này

  1. Xem xét lại chính sách mật khẩu hiện tại và tăng cường nếu cần
    SHOW VARIABLES LIKE 'validate_password%';
    SET GLOBAL validate_password.policy = STRONG;
    SET GLOBAL validate_password.length = 12;
    
  1. Xóa các tài khoản không cần thiết
    DELETE FROM mysql.user WHERE User='';
    DROP DATABASE test;
    FLUSH PRIVILEGES;
    
  1. Hạn chế truy cập từ xa cho người dùng root
    UPDATE mysql.user SET Host='localhost' WHERE User='root';
    FLUSH PRIVILEGES;
    
  1. Cấu hình thời gian hết hạn mật khẩu định kỳ
    SET GLOBAL default_password_lifetime = 90;
    
  1. Bật ghi log để giám sát
    [mysqld]
    log_error = /var/log/mysql/error.log
    general_log = 1
    general_log_file = /var/log/mysql/general.log
    

Khởi động lại MySQL:

sudo systemctl restart mysql

Bài viết liên quan để học thêm

📌 Hướng dẫn chi tiết về quản lý quyền người dùng MySQL
📌 Quy trình sao lưu và khôi phục MySQL
📌 Cách tối ưu hoá cơ sở dữ liệu MySQL
📌 Cấu hình MySQL với xác thực bên ngoài (LDAP hoặc OAuth)

Kết luận cuối cùng

Quản lý mật khẩu MySQL là kiến thức thiết yếu để bảo vệ an ninh cơ sở dữ liệu.
Áp dụng các thực hành được đề cập trong hướng dẫn này và đảm bảo quản lý cơ sở dữ liệu an toàn! 💪