MySQL là một hệ quản trị cơ sở dữ liệu mã nguồn mở rất phổ biến, thường được cài đặt như một phần của ngăn xếp LAMP (Linux, Apache, MySQL, PHP/Python/Perl) trứ danh. Hệ thống này triển khai mô hình quan hệ và sử dụng ngôn ngữ truy vấn có cấu trúc (SQL – Structured Query Language) để quản lý dữ liệu của nó. Sự linh hoạt, hiệu suất cao và cộng đồng hỗ trợ lớn đã giúp MySQL trở thành lựa chọn hàng đầu cho hàng triệu ứng dụng web và di động trên toàn thế giới.

Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách cài đặt MySQL phiên bản 8.0 trên máy chủ Ubuntu 22.04. Hoàn thành hướng dẫn này, bạn sẽ sở hữu một cơ sở dữ liệu quan hệ hoạt động ổn định, sẵn sàng cho việc phát triển website hoặc ứng dụng tiếp theo của mình.
Chuẩn bị
Để thực hiện theo hướng dẫn này, bạn cần có:
- Một máy chủ Ubuntu 22.04 với người dùng quản trị không phải là
rootvà một tường lửa được cấu hình với UFW.
Bước 1: Cài đặt MySQL
Trên Ubuntu 22.04, bạn dễ dàng cài đặt MySQL từ kho gói APT. Tại thời điểm tôi viết bài này, phiên bản MySQL có sẵn trong kho mặc định của Ubuntu là 8.0.28.
Đầu tiên, hãy cập nhật chỉ mục gói trên máy chủ của bạn nếu bạn chưa làm gần đây:
sudo apt update
Sau đó, cài đặt gói mysql-server:
sudo apt install mysql-server
Bạn hãy đảm bảo rằng dịch vụ MySQL đang chạy bằng lệnh systemctl start:
sudo systemctl start mysql.service
Những lệnh này sẽ cài đặt và khởi động MySQL, nhưng chúng sẽ không yêu cầu bạn đặt mật khẩu hoặc thực hiện bất kỳ thay đổi cấu hình nào khác. Điều này khiến cài đặt MySQL của bạn chưa an toàn và chúng ta sẽ xử lý vấn đề này ở bước tiếp theo.
Bước 2: Cấu hình MySQL
Đối với các cài đặt MySQL mới, bạn cần chạy script bảo mật đi kèm của hệ quản trị cơ sở dữ liệu này. Script này sẽ thay đổi một số tùy chọn mặc định kém an toàn, ví dụ như ngăn chặn đăng nhập root từ xa và xóa người dùng mẫu.
Lưu ý quan trọng: Kể từ tháng 7 năm 2022, bạn có thể gặp lỗi khi chạy script mysql_secure_installation mà không có một số cấu hình bổ sung. Lý do là script này cố gắng đặt mật khẩu cho tài khoản MySQL root của cài đặt, nhưng theo mặc định trên các bản cài đặt Ubuntu, tài khoản này không được cấu hình để kết nối bằng mật khẩu.
Trước tháng 7 năm 2022, script này sẽ tự động bỏ qua lỗi sau khi cố gắng đặt mật khẩu tài khoản root và tiếp tục với các lời nhắc còn lại. Tuy nhiên, tại thời điểm viết bài này, script sẽ trả về lỗi sau khi bạn nhập và xác nhận mật khẩu:
Output ... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.
New password:
Điều này sẽ dẫn script vào một vòng lặp đệ quy mà bạn chỉ có thể thoát ra bằng cách đóng cửa sổ terminal.
Vì script mysql_secure_installation thực hiện nhiều hành động hữu ích khác để giữ cho cài đặt MySQL của bạn an toàn, tôi vẫn khuyến nghị bạn nên chạy nó trước khi bắt đầu sử dụng MySQL để quản lý dữ liệu của mình. Tuy nhiên, để tránh rơi vào vòng lặp đệ quy này, bạn cần điều chỉnh cách người dùng MySQL root của bạn xác thực trước.
Đầu tiên, hãy mở lời nhắc MySQL:
sudo mysql
Sau đó, bạn hãy chạy lệnh ALTER USER sau để thay đổi phương thức xác thực của người dùng root sang một phương thức sử dụng mật khẩu. Ví dụ sau thay đổi phương thức xác thực thành mysql_native_password:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Sau khi thực hiện thay đổi này, bạn thoát khỏi lời nhắc MySQL:
exit
Tiếp theo, bạn có thể chạy script mysql_secure_installation mà không gặp vấn đề gì.
Chạy script bảo mật với sudo:
sudo mysql_secure_installation
Script này sẽ đưa bạn qua một loạt các lời nhắc, nơi bạn có thể thực hiện một số thay đổi đối với các tùy chọn bảo mật của cài đặt MySQL. Lời nhắc đầu tiên sẽ hỏi bạn có muốn thiết lập Plugin Xác thực Mật khẩu (Validate Password Plugin) hay không, plugin này dùng để kiểm tra độ mạnh của mật khẩu người dùng MySQL mới trước khi chấp nhận chúng.
Nếu bạn chọn thiết lập Plugin Xác thực Mật khẩu, bất kỳ người dùng MySQL nào bạn tạo mà xác thực bằng mật khẩu sẽ được yêu cầu có mật khẩu thỏa mãn chính sách bạn chọn:
OutputSecuring the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: Y
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
2
Bất kể bạn chọn thiết lập Plugin Xác thực Mật khẩu hay không, lời nhắc tiếp theo sẽ là đặt mật khẩu cho người dùng root của MySQL. Bạn hãy nhập và xác nhận một mật khẩu an toàn theo ý muốn của mình:
OutputPlease set the password for root here.
New password:
Re-enter new password:
Lưu ý rằng mặc dù bạn đã đặt mật khẩu cho người dùng MySQL root, người dùng này hiện chưa được cấu hình để xác thực bằng mật khẩu khi kết nối với shell MySQL.
Nếu bạn đã sử dụng Plugin Xác thực Mật khẩu, bạn sẽ nhận được phản hồi về độ mạnh của mật khẩu mới. Sau đó, script sẽ hỏi bạn có muốn tiếp tục với mật khẩu vừa nhập hay muốn nhập một mật khẩu mới. Giả sử bạn hài lòng với độ mạnh của mật khẩu vừa nhập, hãy nhấn Y để tiếp tục script:
OutputEstimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
Từ đó, bạn có thể nhấn Y và sau đó ENTER để chấp nhận các giá trị mặc định cho tất cả các câu hỏi tiếp theo. Điều này sẽ xóa một số người dùng ẩn danh và cơ sở dữ liệu kiểm thử, vô hiệu hóa đăng nhập root từ xa và tải các quy tắc mới này để MySQL ngay lập tức áp dụng các thay đổi bạn đã thực hiện.
Lưu ý: Một khi script bảo mật hoàn tất, bạn có thể mở lại MySQL và thay đổi phương thức xác thực của người dùng root về mặc định auth_socket. Để xác thực với tư cách người dùng MySQL root bằng mật khẩu, hãy chạy lệnh này:
mysql -u root -p
Sau đó, quay lại sử dụng phương thức xác thực mặc định bằng lệnh này:
ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;
Điều này có nghĩa là bạn có thể kết nối lại với MySQL với tư cách người dùng root bằng lệnh sudo mysql.
Sau khi script hoàn tất, cài đặt MySQL của bạn sẽ được bảo mật. Giờ đây, bạn có thể chuyển sang tạo một người dùng cơ sở dữ liệu chuyên biệt với client MySQL.
Bước 3: Tạo người dùng MySQL chuyên biệt và cấp quyền
Sau khi cài đặt, MySQL tạo một tài khoản người dùng root mà bạn có thể sử dụng để quản lý cơ sở dữ liệu của mình. Người dùng này có toàn quyền kiểm soát máy chủ MySQL, nghĩa là họ có quyền kiểm soát hoàn toàn mọi cơ sở dữ liệu, bảng, người dùng, v.v. Vì lý do này, tốt nhất bạn nên tránh sử dụng tài khoản này bên ngoài các chức năng quản trị. Bước này sẽ hướng dẫn cách sử dụng người dùng MySQL root để tạo một tài khoản người dùng mới và cấp quyền cho nó.
Trong các hệ thống Ubuntu chạy MySQL 5.7 (và các phiên bản sau), người dùng MySQL root được đặt để xác thực bằng plugin auth_socket theo mặc định thay vì bằng mật khẩu. Plugin này yêu cầu tên người dùng hệ điều hành gọi client MySQL phải khớp với tên người dùng MySQL được chỉ định trong lệnh, vì vậy bạn phải gọi mysql với quyền sudo để có quyền truy cập vào người dùng MySQL root:
sudo mysql
Lưu ý: Nếu bạn cài đặt MySQL với một hướng dẫn khác và đã bật xác thực mật khẩu cho root, bạn sẽ cần sử dụng một lệnh khác để truy cập shell MySQL. Lệnh sau sẽ chạy client MySQL của bạn với đặc quyền người dùng thông thường và bạn sẽ chỉ có được đặc quyền quản trị trong cơ sở dữ liệu bằng cách xác thực:
mysql -u root -p
Khi bạn có quyền truy cập vào lời nhắc MySQL, bạn có thể tạo một người dùng mới bằng câu lệnh CREATE USER. Các câu lệnh này tuân theo cú pháp tổng quát sau:
CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';
Sau CREATE USER, bạn chỉ định tên người dùng. Ngay sau đó là dấu @ và sau đó là tên máy chủ mà người dùng này sẽ kết nối từ đó. Nếu bạn chỉ định truy cập người dùng này cục bộ từ máy chủ Ubuntu của mình, bạn có thể chỉ định localhost. Việc bao quanh cả tên người dùng và máy chủ trong dấu nháy đơn không phải lúc nào cũng cần thiết, nhưng làm như vậy có thể giúp ngăn ngừa lỗi.
Bạn có một số tùy chọn khi chọn plugin xác thực cho người dùng của mình. Plugin auth_socket đã đề cập trước đây có thể tiện lợi, vì nó cung cấp bảo mật mạnh mẽ mà không yêu cầu người dùng hợp lệ phải nhập mật khẩu để truy cập cơ sở dữ liệu. Nhưng nó cũng ngăn chặn các kết nối từ xa, điều này có thể làm phức tạp mọi thứ khi các chương trình bên ngoài cần tương tác với MySQL.
Thay thế, bạn có thể bỏ hoàn toàn phần WITH authentication_plugin của cú pháp để người dùng xác thực với plugin mặc định của MySQL, caching_sha2_password.
Chạy lệnh sau để tạo một người dùng xác thực với caching_sha2_password. Đảm bảo thay đổi sammy thành tên người dùng ưa thích của bạn và password thành một mật khẩu mạnh do bạn chọn:
CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';
Lưu ý: Có một vấn đề đã biết với một số phiên bản PHP gây ra sự cố với caching_sha2_password. Nếu bạn định sử dụng cơ sở dữ liệu này với ứng dụng PHP — ví dụ như phpMyAdmin — bạn có thể muốn tạo một người dùng sẽ xác thực với plugin mysql_native_password cũ hơn, mặc dù vẫn an toàn, thay vào đó:
CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Nếu bạn không chắc chắn, bạn luôn có thể tạo người dùng xác thực với caching_sha2_plugin và sau đó ALTER nó sau này bằng lệnh này:
ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Sau khi tạo người dùng mới, bạn có thể cấp cho họ các đặc quyền phù hợp. Cú pháp chung để cấp đặc quyền cho người dùng như sau:
GRANT PRIVILEGE ON database.table TO 'username'@'host';
Giá trị PRIVILEGE trong cú pháp ví dụ này định nghĩa các hành động mà người dùng được phép thực hiện trên database và table được chỉ định. Bạn có thể cấp nhiều đặc quyền cho cùng một người dùng trong một lệnh bằng cách phân tách từng đặc quyền bằng dấu phẩy. Bạn cũng có thể cấp đặc quyền toàn cục cho người dùng bằng cách nhập dấu sao (*) thay cho tên cơ sở dữ liệu và bảng. Trong SQL, dấu sao là các ký tự đặc biệt được sử dụng để đại diện cho “tất cả” các cơ sở dữ liệu hoặc bảng.
Để minh họa, lệnh sau cấp cho người dùng các đặc quyền toàn cục để CREATE, ALTER và DROP cơ sở dữ liệu, bảng và người dùng, cũng như quyền INSERT, UPDATE và DELETE dữ liệu từ bất kỳ bảng nào trên máy chủ. Nó cũng cấp cho người dùng khả năng truy vấn dữ liệu với SELECT, tạo khóa ngoại với từ khóa REFERENCES và thực hiện các hoạt động FLUSH với đặc quyền RELOAD. Tuy nhiên, bạn chỉ nên cấp cho người dùng các quyền mà họ cần, vì vậy hãy thoải mái điều chỉnh đặc quyền của người dùng của bạn nếu cần thiết.
Bạn có thể tìm thấy danh sách đầy đủ các đặc quyền có sẵn trong tài liệu chính thức của MySQL.
Chạy câu lệnh GRANT này, thay thế sammy bằng tên người dùng MySQL của riêng bạn, để cấp các đặc quyền này cho người dùng của bạn:
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, INDEX, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
Lưu ý rằng câu lệnh này cũng 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.
Cảnh báo: Một số người dùng có thể muốn cấp cho người dùng MySQL của họ đặc quyền ALL PRIVILEGES, điều này sẽ cung cấp cho họ các đặc quyền siêu người dùng rộng lớn tương tự như đặc quyền của người dùng root, như sau:
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
Các đặc quyền rộng lớn như vậy không nên được cấp một cách dễ dãi, 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ủ.
Tiếp theo, việc chạy lệnh FLUSH PRIVILEGES là một thực hành tốt. Lệnh này sẽ giải phóng bất kỳ bộ nhớ nào mà máy chủ đã lưu trữ do các câu lệnh CREATE USER và GRANT trước đó:
FLUSH PRIVILEGES;
Sau đó, bạn có thể thoát khỏi client MySQL:
exit
Trong tương lai, để đăng nhập với tư cách người dùng MySQL mới của bạn, bạn sẽ sử dụng một lệnh như sau:
mysql -u sammy -p
Cờ -p sẽ khiến client MySQL nhắc bạn nhập mật khẩu của người dùng MySQL của bạn để xác thực.
Cuối cùng, hãy kiểm tra cài đặt MySQL.
Bước 4:mKiểm tra MySQL
Bất kể bạn cài đặt bằng cách nào, MySQL lẽ ra đã tự động bắt đầu chạy. Để kiểm tra điều này, hãy kiểm tra trạng thái của nó.
systemctl status mysql.service
Đầu ra sẽ tương tự như sau:
Output● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-04-11 16:04:39 UTC; 2h 36min ago
Process: 2593 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 2601 (mysqld)
Status: "Server is operational"
Tasks: 38 (limit: 1119)
Memory: 354.3M
CPU: 19.944s
CGroup: /system.slice/mysql.service
└─2601 /usr/sbin/mysqld
Nếu MySQL không chạy, bạn có thể khởi động nó bằng sudo systemctl start mysql.
Để kiểm tra bổ sung, bạn có thể thử kết nối với cơ sở dữ liệu bằng công cụ mysqladmin, đây là một client cho phép bạn chạy các lệnh quản trị. Ví dụ, lệnh này yêu cầu kết nối với tư cách người dùng MySQL tên sammy (-u sammy), nhắc nhập mật khẩu (-p) và trả về phiên bản. Đảm bảo thay đổi sammy thành tên người dùng MySQL chuyên biệt của bạn và nhập mật khẩu của người dùng đó khi được nhắc:
sudo mysqladmin -p -u sammy version
Dưới đây là một ví dụ về đầu ra:
Outputmysqladmin Ver 8.0.28-0ubuntu4 for Linux on x86_64 ((Ubuntu))
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Server version 8.0.28-0ubuntu4
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 2 hours 31 min 57 sec
Threads: 2 Questions: 25 Slow queries: 0 Opens: 160 Flush tables: 3 Open tables: 79 Queries per second avg: 0.000
Điều này có nghĩa là MySQL đã hoạt động và đang chạy.
Giờ đây, khi đã xác nhận MySQL hoạt động ổn định, chúng ta hãy cùng tổng kết lại những gì đã học và những khả năng bạn có thể khám phá tiếp theo!
Kết luận
Chúng ta đã đi qua các bước quan trọng từ việc cài đặt ban đầu, xử lý các vấn đề bảo mật với mysql_secure_installation (bao gồm cả việc khắc phục lỗi xác thực root mới), đến việc tạo một người dùng chuyên biệt với các quyền hạn phù hợp và cuối cùng là xác minh hệ thống hoạt động ổn định.
Kiến thức về cài đặt và cấu hình MySQL là nền tảng vững chắc để bạn tiếp tục xây dựng các hệ thống mạnh mẽ. Việc hiểu rõ cách quản lý người dùng và quyền hạn là cực kỳ quan trọng để đảm bảo an toàn và bảo mật cho dữ liệu của bạn.