MySQL là một hệ quản trị cơ sở dữ liệu mã nguồn mở, thường được cài đặt như một phần của LAMP (Linux, Apache, MySQL, PHP/Python/Perl) stack phổ biến. Nó triển khai mô hình quan hệ và sử dụng ngôn ngữ truy vấn có cấu trúc (hay còn gọi là SQL - Structured Query Language) để quản lý dữ liệu.
Trong bài viết này, Quantrimang sẽ hướng dẫn cách cài đặt MySQL phiên bản 8.0 trên máy chủ Ubuntu 20.04. Bằng cách hoàn thành nó, bạn sẽ có một cơ sở dữ liệu quan hệ đang hoạt động, có thể sử dụng để xây dựng trang web hoặc ứng dụng tiếp theo của mình.
Điều kiện tiên quyết
Để làm theo hướng dẫn này, bạn sẽ cần một máy chủ Ubuntu 20.04 với người dùng admin không phải root và tường lửa được cấu hình bằng UFW.
Cách cài đặt MySQL trên Ubuntu 20.04
Bước 1 - Cài đặt MySQL
Trên Ubuntu 20.04, bạn có thể cài đặt MySQL bằng cách sử dụng kho lưu trữ gói APT. Tại thời điểm viết bài này, phiên bản MySQL có sẵn trong kho lưu trữ Ubuntu mặc định là phiên bản 8.0.19.
Để cài đặt nó, hãy cập nhật chỉ mục gói trên máy chủ, nếu gần đây bạn chưa làm như vậy:
sudo apt update
Sau đó cài đặt gói mysql-server:
sudo apt install mysql-server
Thao tác này sẽ cài đặt MySQL, nhưng sẽ không nhắc 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. Vì điều này khiến quá trình cài đặt MySQL của bạn không bao mật, nên bài viết sẽ giải quyết vấn đề này tiếp theo.
Bước 2 - Cấu hình MySQL
Đối với các bản cài đặt mới của MySQL, bạn sẽ muốn chạy script bảo mật đi kèm của DBMS. Script này thay đổi một số tùy chọn mặc định kém bảo mật hơn cho những thứ như thông tin đăng nhập root từ xa và người dùng mẫu.
Chạy script bảo mật với sudo:
sudo mysql_secure_installation
Điều này sẽ đưa bạn qua một loạt lời nhắc mà 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 cho cài đặt MySQL của mình. Lời nhắc đầu tiên sẽ hỏi bạn có muốn thiết lập Validate Password Plugin, có thể được sử dụng để kiểm tra độ mạnh mật khẩu của người dùng MySQL mới trước khi cho là hợp lệ hay không.
Nếu bạn chọn thiết lập Validate Password Plugin, bất kỳ người dùng MySQL nào mà bạn tạo xác thực bằng mật khẩu sẽ được yêu cầu có mật khẩu đáp ứng policy bạn chọn. Cấp policy mạnh nhất - mà bạn có thể chọn bằng cách nhập 2 - sẽ yêu cầu mật khẩu phải dài ít nhất 8 ký tự và bao gồm kết hợp các ký tự viết hoa, viết thường, số và ký tự đặc biệt:
Securing 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 Validate Password Plugin hay không, lời nhắc tiếp theo sẽ là đặt mật khẩu cho người dùng MySQL root. Nhập và sau đó xác nhận một mật khẩu bảo mật mà bạn chọn:
Please 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 không được cấu hình để xác thực bằng mật khẩu khi kết nối với MySQL shell.
Nếu đã sử dụng Validate Password Plugin, bạn sẽ nhận được phản hồi về độ mạnh của mật khẩu mới của mình. 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 khẩu mới. Giả sử bạn hài lòng với độ mạnh của mật khẩu bạn vừa nhập, hãy nhập Y để tiếp tục script:
Estimated 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 rồi ENTER để chấp nhận giá trị mặc định cho tất cả các câu hỏi tiếp theo. Thao tác này sẽ xóa một số người dùng ẩn danh và cơ sở dữ liệu thử nghiệm, vô hiệu hóa đăng nhập root từ xa và load các quy tắc mới này để MySQL ngay lập tức tuân theo những thay đổi bạn đã thực hiện.
Khi script hoàn tất, cài đặt MySQL sẽ được bảo mật. Bây giờ, bạn có thể chuyển sang tạo người dùng cơ sở dữ liệu chuyên dụng với MySQL client.
Bước 3 - Tạo người dùng MySQL chuyên dụng và cấp các đặc 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ó đầy đủ các đặc quyền đối với máy chủ MySQL, có nghĩa là người đó có toàn quyền kiểm soát mọi cơ sở dữ liệu, bảng, user, v.v... Do đó, tốt nhất bạn nên tránh sử dụng tài khoản này ngoài lúc cần tới các chức năng quản trị. Bước này phác thảo cách sử dụng người dùng MySQL root để tạo tài khoản người dùng mới và cấp đặc quyền cho tài khoản đó.
Trong các hệ thống Ubuntu chạy MySQL 5.7 (và các phiên bản mới hơn), người dùng MySQL root được yêu cầu xác thực bằng cách sử dụng plugin auth_socket theo mặc định chứ không phải bằng mật khẩu.
Plugin này yêu cầu tên của người dùng hệ điều hành gọi MySQL client phải khớp với tên của người dùng MySQL được chỉ định trong lệnh, vì vậy bạn phải gọi mysql với đặc 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 bằng 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 MySQL shell. Lệnh sau sẽ chạy MySQL client của bạn với các đặc quyền người dùng thông thường và bạn sẽ chỉ có được các đặc quyền của admin trong cơ sở dữ liệu bằng cách xác thực:
mysql -u root -p
Khi có quyền truy cập vào lời nhắc MySQL, bạn có thể tạo người dùng mới bằng câu lệnh CREATE USER. Chúng tuân theo cú pháp chung 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à tiếp đến là tên máy chủ mà người dùng này sẽ kết nối. Nếu bạn chỉ định truy cập cục bộ người dùng này từ máy chủ Ubuntu của mình, bạn có thể chỉ định localhost. Việc gói cả tên người dùng và máy chủ trong một dấu ngoặc kép 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 tránh lỗi.
Bạn có một số tùy chọn khi chọn plugin xác thực người dùng. Plugin auth_socket được đề cập trước đây có thể thuận tiện, vì nó cung cấp khả năng bảo mật mạnh mẽ, mà không yêu cầu người dùng hợp lệ 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 những chương trình bên ngoài cần tương tác với MySQL.
Thay vào đó, bạn có thể loại bỏ hoàn toàn phần plugin xác thực WITH 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. Tài liệu MySQL đề xuất plugin này cho người dùng muốn đăng nhập bằng mật khẩu do tính năng bảo mật mạnh mẽ của nó.
Chạy lệnh sau để tạo người dùng xác thực bằng caching_sha2_password. Đảm bảo thay đổi sammy thành tên người dùng và password thành một mật khẩu mạnh mà bạn chọn:
CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';
Lưu ý: 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 một ứng dụng PHP - ví dụ: 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, nhưng vẫn bảo mật, thay vào đó:
CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
Nếu không chắc chắn, bạn luôn có thể tạo người dùng xác thực bằng caching_sha2_plugin, rồi thay đổi 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 thích hợp. Cú pháp chung để cấp đặc quyền 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 xác định những hành động mà người dùng được phép thực hiện trên cơ sở dữ liệu và bảng đượ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 người dùng bằng cách nhập dấu hoa thị (*) vào vị trí của cơ sở dữ liệu và tên bảng. Trong SQL, dấu hoa thị là các ký tự đặc biệt được sử dụng để đại diện cho "tất cả" cơ sở dữ liệu hoặc bảng.
Để minh họa, lệnh sau đây cấp cho người dùng đặc quyền để 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 Foreign Key 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ác đặc quyền của người dùng nếu cần.
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 MySQL chính thức.
https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#privileges-provided-summary
Chạy câu lệnh GRANT này, thay 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 mong muốn:
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
Lưu ý rằng 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ấp bất kỳ quyền nào mà họ có cho 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 MySQL user của họ đặc quyền ALL PRIVILEGES, sẽ cung cấp cho họ các đặc quyền siêu người dùng rộng rãi giống như đặc quyền của người dùng root, như sau:
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;
Không nên coi nhẹ việc cấp các đặc quyền rộng rãi như vậy, vì bất kỳ ai có quyền truy cập vào user 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 đây, bạn nên chạy lệnh FLUSH PRIVILEGES. Điều này sẽ giải phóng bất kỳ bộ nhớ nào mà máy chủ đã lưu vào bộ nhớ cache do kết quả của các câu lệnh CREATE USER và GRANT trước đó:
FLUSH PRIVILEGES;
Sau đó, bạn có thể thoát khỏi MySQL client:
exit
Trong tương lai, để đăng nhập với tư cách là người dùng MySQL mới, bạn sẽ sử dụng một lệnh như sau:
mysql -u sammy -p
Flag -p sẽ khiến MySQL client nhắc bạn nhập mật khẩu của người dùng MySQL để xác thực.
Cuối cùng, hãy kiểm tra cài đặt MySQL.
Bước 4 - Kiểm tra MySQL
Bất kể bạn đã cài đặt nó như thế nào, MySQL phải bắt đầu chạy tự động. Để thử nghiệm, hãy kiểm tra trạng thái của nó.
systemctl status mysql.service
Bạn sẽ thấy đầu ra tương tự như sau:
mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2020-04-21 12:56:48 UTC; 6min ago
Main PID: 10382 (mysqld)
Status: "Server is operational"
Tasks: 39 (limit: 1137)
Memory: 370.0M
CGroup: /system.slice/mysql.service
└─10382 /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 thêm, bạn có thể thử kết nối với cơ sở dữ liệu bằng công cụ mysqladmin, là một client cho phép bạn chạy các lệnh admin. Ví dụ, lệnh này cho biết kết nối với tư cách người dùng MySQL có 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 của người dùng MySQL chuyên dụng 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
Bạn sẽ thấy đầu ra tương tự như sau:
mysqladmin Ver 8.0.19-0ubuntu5 for Linux on x86_64 ((Ubuntu))
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
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.19-0ubuntu5
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 10 min 44 sec
Threads: 2 Questions: 25 Slow queries: 0 Opens: 149 Flush tables: 3 Open tables: 69 Queries per second avg: 0.038
Điều này có nghĩa là MySQL đang hoạt động.