Trang chủHướng dẫnMySQL cho người mới: Hướng dẫn tạo user & phân quyền hiệu quả
Security

MySQL cho người mới: Hướng dẫn tạo user & phân quyền hiệu quả

CyStack blog 8 phút để đọc
CyStack blog17/04/2025
Reading Time: 8 minutes

Hôm nay, mình sẽ chia sẻ cho mọi người về một trong nhưng việc mà các quản trị viên cơ sở dữ liệu cần làm để cơ sở dữ liệu của mình trở lên bảo mật hơn, phù hợp với các tiêu chuẩn bảo và mô hình bảo mật hiện đại (Zero trust, ISO 27001…). Đó chính là việc tạo và gán quyền trong cơ sở dữ liệu, vậy việc này mạng lại những lợi ích gì:

  • Giúp bạn chỉ cấp những quyền thực sự cần thiết cho từng người dùng hoặc ứng dụng.
  • Giảm thiểu thiệt hại tối đa nếu hacker tấn công được một tài khoản, nhưng tài khoản đó chỉ có quyền hạn giới hạn.
  • Dễ kiểm soát và audit khi có sự cố hoặc cần kiểm tra log.
  • Giảm rủi ro do lỗi con người khi làm việc với dữ liệu nhạy cảm hoặc sản xuất.

Mình chọn MySQL để làm ví dụ trong bài chia sẻ này vì đây là một hệ quản trị cơ sở dữ liệu mã nguồn mở phổ biến, được sử dụng rộng rãi trong nhiều hệ thống từ website nhỏ đến các ứng dụng doanh nghiệp lớn. MySQL có cú pháp đơn giản, dễ tiếp cận, nhưng vẫn cung cấp đầy đủ các cơ chế quản lý người dùng và phân quyền chặt chẽ. Điều này giúp việc minh họa và áp dụng các nguyên tắc bảo mật trở nên trực quan và thực tế hơn cho cả người mới lẫn những quản trị viên có kinh nghiệm. Chúng ta sẽ cùng nhau thực hành trong bài viết này

Điều kiện cần

Để làm theo hướng dẫn này, bạn sẽ cần quyền truy cập vào cơ sở dữ liệu MySQL. Hướng dẫn giả định rằng cơ sở dữ liệu được cài đặt trên một máy chủ ảo riêng (VPS) chạy Ubuntu 20.04, tuy nhiên, các nguyên tắc được trình bày vẫn có thể áp dụng, bất kể cách bạn truy cập cơ sở dữ liệu là gì. Nếu bạn chưa có quyền truy cập vào cơ sở dữ liệu MySQL và muốn tự cài đặt, bạn có thể tham khảo một trong các hướng dẫn của mình về cách cài đặt MySQL. Một lần nữa, dù hệ điều hành của máy chủ có khác nhau, các bước để tạo người dùng MySQL mới và cấp quyền cho họ nhìn chung vẫn sẽ giống nhau. Bạn cũng có thể tạo cơ sở dữ liệu MySQL do nhà cung cấp dịch vụ đám mây quản lý.

Tạo người dùng

Sau khi cài đặt, MySQL sẽ tạo sẵn một tài khoản người dùng root – tài khoản có toàn quyền truy cập và điều khiển mọi cơ sở dữ liệu, bảng, và tài nguyên trên hệ thống MySQL. Với đặc quyền cao nhất, tài khoản này có thể thực hiện bất kỳ thao tác nào, từ tạo đến xóa dữ liệu hoặc thay đổi cấu hình. Chính vì vậy, từ góc độ bảo mật, việc sử dụng tài khoản root nên được hạn chế chỉ trong các tình huống quản trị cần thiết, nhằm tránh nguy cơ bị lạm dụng hoặc xâm nhập trái phép.

Trong hướng dẫn này, chúng ta sẽ sử dụng tài khoản root để tạo một người dùng mới với quyền hạn phù hợp – theo nguyên tắc “ít quyền nhất” (least privilege) – một trong những nguyên tắc cốt lõi trong quản lý bảo mật.

Lưu ý rằng, trên các hệ thống Ubuntu sử dụng MySQL 5.7 trở lên, người dùng root của MySQL được cấu hình mặc định sử dụng cơ chế xác thực qua plugin auth_socket, thay vì qua mật khẩu. Plugin này yêu cầu người dùng hệ điều hành gọi lệnh MySQL phải trùng tên với tài khoản MySQL được chỉ định. Điều đó đồng nghĩa với việc để truy cập được tài khoản root trong MySQL, bạn cần sử dụng lệnh mysql kèm theo sudo, để đảm bảo quyền thực thi ở mức hệ thống:

sudo mysql

Bạn có thể dùng lệnh sau trong MySQL để kiểm tra kiểm tra tài khoản nào đang dùng auth_socket

SELECT user, host, plugin FROM mysql.user;

Nếu thấy plugin là auth_socket, tức là user đó xác thực theo cách này.

Lưu ý: Nếu tài khoản root trong MySQL của bạn được cấu hình để xác thực bằng mật khẩu, bạn sẽ cần sử dụng lệnh khác để truy cập vào MySQL shell. Lệnh sau sẽ khởi chạy MySQL client với quyền của người dùng thông thường, và bạn chỉ có thể truy cập quyền quản trị trong cơ sở dữ liệu sau khi xác thực thành công bằng mật khẩu chính xác:

mysql -u root -p

Khi bạn có quyền truy cập vào dấu nhắc MySQL, bạn có thể tạo người dùng mới bằng câu lệnh CREATE USER. Những câu lệnh này tuân theo cú pháp chung sau:

CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';

Sau câu lệnh CREATE USER, bạn cần chỉ định tên người dùng. Ngay sau đó là ký tự @, tiếp theo là tên máy chủ (hostname) mà người dùng này sẽ sử dụng để kết nối đến MySQL. Nếu bạn chỉ định truy cập tài khoản này cục bộ từ chính máy chủ Ubuntu, bạn có thể dùng localhost. Việc đặt tên người dùng và hostname trong dấu nháy đơn ' ' không phải lúc nào cũng bắt buộc, nhưng làm như vậy có thể giúp tránh lỗi cú pháp hoặc nhầm lẫn.

Khi tạo người dùng, bạn có một số tùy chọn về plugin xác thực. Plugin auth_socket đã đề cập trước đó là một lựa chọn tiện lợi vì nó cung cấp mức độ bảo mật cao mà không cần người dùng hợp lệ phải nhập mật khẩu để truy cập cơ sở dữ liệu. Tuy nhiên, điểm hạn chế là nó không cho phép kết nối từ xa, điều này có thể gây khó khăn nếu bạn cần để các chương trình bên ngoài tương tác với MySQL.

Ngoài việc chỉ định cụ thể plugin xác thực cho từng người dùng, bạn cũng có thể bỏ qua phần cấu hình plugin để MySQL tự động sử dụng plugin mặc định hiện tại. Tính đến các phiên bản mới, MySQL mặc định sử dụng plugin caching_sha2_password – đây cũng là plugin được khuyến nghị chính thức cho các tài khoản sử dụng mật khẩu, nhờ vào khả năng mã hóa và xác thực mạnh mẽ, giúp nâng cao mức độ bảo mật khi truyền và lưu trữ thông tin đăng nhập.

Việc sử dụng caching_sha2_password đặc biệt phù hợp trong các môi trường có yêu cầu cao về bảo mật hoặc cần hỗ trợ kết nối từ xa, chẳng hạn như kết nối từ ứng dụng web, máy chủ khác, hoặc hệ thống tích hợp.

Chạy lệnh sau để tạo người dùng xác thực bằng caching_sha2_password.

CREATE USER 'cystack'@'localhost' IDENTIFIED BY 'password';

Lưu ý: Có một lỗi đã biết trên một số phiên bản PHP gây ra vấn đề khi sử dụng plugin caching_sha2_password. Nếu bạn dự định sử dụng cơ sở dữ liệu này với một ứng dụng viết bằng PHP – chẳng hạn như phpMyAdmin – bạn nên tạo một tài khoản người dùng sử dụng pluginmysql_native_password, một phương thức xác thực cũ hơn nhưng vẫn đảm bảo mức độ bảo mật cần thiết.

CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Nếu bạn chưa chắc chắn nên sử dụng plugin xác thực nào, bạn hoàn toàn có thể tạo người dùng với plugin mặc định caching_sha2_password trước, sau đó thay đổi plugin xác thực sau bằng cách sử dụng lệnh ALTER USER sau:

ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Sau đó chạy lệnh sau để áp dụng thay đổi

FLUSH PRIVILEGES;

Sau khi đã tạo tài khoản người dùng với plugin xác thực phù hợp, bước tiếp theo là gán quyền truy cập cần thiết cho người dùng này. Việc gán quyền đúng cách không chỉ đảm bảo người dùng có thể thực hiện các thao tác cần thiết, mà còn góp phần quan trọng trong việc bảo vệ hệ thống cơ sở dữ liệu khỏi các truy cập trái phép hoặc thao tác ngoài phạm vi cho phép.

Cấp quyền cho người dùng

Trong MySQL, lệnh GRANT được sử dụng để cấp quyền truy cập cho người dùng vào cơ sở dữ liệu hoặc các thành phần cụ thể như bảng, cột, v.v. Câu lệnh này là công cụ quan trọng để kiểm soát ai được phép làm gì, góp phần bảo vệ hệ thống khỏi truy cập trái phép hoặc thao tác vượt quyền.

GRANT PRIVILEGE ON database.table TO 'username'@'host';
  • PRIVILEGE: Các quyền cần cấp, ví dụ: SELECT, INSERT, UPDATE, ALL PRIVILEGES
  • database.table: Cơ sở dữ liệu hoặc bảng mà quyền được áp dụng, ví dụ: ten_csdl.* hoặc ten_csdl.ten_bang
  • ‘username’@’host’: Tài khoản được cấp quyền, với host là nơi tài khoản này có thể kết nối (thường là localhost, IP cụ thể, hoặc % cho mọi địa chỉ — không khuyến khích dùng % trừ khi cần thiết)

Bạn có thể tìm thấy danh sách đầy đủ các quyền có sẵn trong tài liệu chính thức của MySQL .

Lưu ý 1: Với vai trò và trách nghiệm của mình, các quản trị viên phải đưa ra ma trận phân quyền phù hợp với từng user mà mình tạo.

Lưu ý 2: Hiểu rõ câu lệnh mình sử dụng để tránh các rủi ro bảo mật.

Ví dụ:

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'cystack'@'localhost' WITH GRANT OPTION;

câu lệnh này bao gồm WITH GRANT OPTION. Điều này sẽ cho phép người dùng MySQL của bạn cấp bất kỳ quyền nào mà họ có cho những người dùng khác trên hệ thống.

Một số người dùng có thể muốn cấp quyền ALL PRIVILEGES cho tài khoản MySQL của họ. Quyền này sẽ cung cấp cho người dùng các đặc quyền ở mức siêu quản trị, tương tự như những gì tài khoản root có thể thực hiện, ví dụ như sau:

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

Không nên cấp các đặc quyền rộng rãi như vậy một cách dễ dàng, vì bất kỳ ai có quyền truy cập vào người dùng MySQL này sẽ có toàn quyền kiểm soát mọi cơ sở dữ liệu trên máy chủ.

Sau khi cấp quyền cho người dùng, sẽ có những trường hợp bạn cần thu hồi quyền đã cấp – ví dụ như khi người dùng chuyển nhóm, rời khỏi dự án, hoặc không còn cần quyền truy cập vào một cơ sở dữ liệu cụ thể. Việc xóa quyền không cần thiết là một bước quan trọng trong quản lý bảo mật, nhằm đảm bảo rằng hệ thống chỉ cho phép những truy cập đúng mục đích, đúng người, đúng thời điểm.

Tiếp theo, chúng ta sẽ tìm hiểu cách sử dụng lệnh REVOKE để xóa hoặc điều chỉnh quyền truy cập đã cấp cho người dùng MySQL.

REVOKE type_of_permission ON database_name.table_name FROM 'username'@'host';

Tương tự các thành phần như gán quyền chỉ có thay đổi chuyển từ TO sang FROM

Bạn có thể xem lại các quyền hiện tại của người dùng bằng cách chạy lệnh SHOW GRANTS:

SHOW GRANTS FOR 'username'@'host';

Tương tự các thành phần như gán quyền chỉ có thay đổi chuyển từ TO sang FROM

Bạn có thể xem lại các quyền hiện tại của người dùng bằng cách chạy lệnh SHOW GRANTS:

DROP USER 'username'@'localhost';

Sau khi tạo người dùng MySQL và cấp quyền cho họ, bạn có thể thoát khỏi máy khách MySQL:

exit

Đăng nhập với tư cách là người dùng MySQL mới, bạn sẽ sử dụng lệnh như sau:

mysql -u cystack -p

Kết luận

Việc quản lý và gán quyền trong MySQL không chỉ là một thao tác kỹ thuật, mà còn là một phần cốt lõi trong chiến lược bảo mật hệ thống cơ sở dữ liệu. Cấp đúng quyền cho đúng người – đúng mục đích – đúng phạm vi sẽ giúp doanh nghiệp giảm thiểu rủi ro truy cập trái phép, thao tác sai lệch, và đảm bảo tính toàn vẹn của dữ liệu.

Quản trị viên cần luôn tuân thủ nguyên tắc “ít quyền nhất” (least privilege), sử dụng plugin xác thực phù hợp, kiểm soát quyền truy cập theo IP cụ thể, và định kỳ rà soát các tài khoản không còn sử dụng.

Việc gán quyền đúng cách không chỉ giúp hệ thống vận hành an toàn, hiệu quả, mà còn tạo nền tảng vững chắc để mở rộng, tích hợp hoặc kiểm toán trong tương lai. Một hệ thống MySQL an toàn bắt đầu từ những quyền truy cập được quản lý cẩn thận.

0 Bình luận

Đăng nhập để thảo luận

CyStack blog

Mẹo, tin tức, hướng dẫn và các best practice độc quyền của CyStack

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.