Kiến thức Hữu ích 😍

Hướng Dẫn Cài Đặt MySQL Remote Trên Ubuntu 20.04 Nhanh, Đơn Giản


Trong thế giới phát triển ứng dụng và quản trị hệ thống hiện đại, việc kết nối cơ sở dữ liệu từ xa đã trở thành một nhu cầu thiết yếu. Dù bạn đang xây dựng một ứng dụng web với server backend và database tách biệt, quản lý nhiều máy chủ từ một máy trạm, hay đơn giản là muốn sử dụng các công cụ quản trị đồ họa tiện lợi, việc thiết lập kết nối MySQL từ xa trên Ubuntu 20.04 là một kỹ năng quan trọng. Tuy nhiên, mở cổng cơ sở dữ liệu ra internet cũng đi kèm với nhiều rủi ro bảo mật nếu không được cấu hình đúng cách. Bài viết này của AZWEB sẽ hướng dẫn bạn từng bước chi tiết, từ cài đặt ban đầu đến cấu hình an toàn, giúp bạn làm chủ hoàn toàn quy trình này.

Giới thiệu về kết nối cơ sở dữ liệu MySQL từ xa trên Ubuntu 20.04

Tại sao chúng ta lại cần cho phép kết nối MySQL từ xa? Lý do rất đa dạng và thực tế. Các kiến trúc ứng dụng hiện đại thường tách biệt máy chủ ứng dụng và máy chủ cơ sở dữ liệu để tối ưu hóa hiệu suất và khả năng mở rộng. Các lập trình viên và quản trị viên cơ sở dữ liệu (DBA) cũng cần truy cập vào database từ máy tính cá nhân của họ bằng các công cụ như MySQL Workbench hay DBeaver để tiện cho việc truy vấn và quản lý.

Tuy nhiên, việc cho phép kết nối từ xa nếu không được cấu hình cẩn thận sẽ mở ra những lỗ hổng bảo mật nghiêm trọng. Kẻ xấu có thể cố gắng dò mật khẩu, thực hiện tấn công từ chối dịch vụ (DoS), hoặc khai thác các lỗ hổng để đánh cắp dữ liệu nhạy cảm. Do đó, việc hiểu rõ và thực hiện đúng quy trình là vô cùng quan trọng.

Trong bài viết này, chúng ta sẽ cùng nhau đi qua một quy trình hoàn chỉnh và an toàn. Các bước chính bao gồm: cài đặt và bảo mật MySQL server, chỉnh sửa tệp cấu hình để lắng nghe kết nối từ xa, tạo người dùng và cấp quyền truy cập một cách hợp lý, cấu hình tường lửa để chỉ cho phép các kết nối hợp lệ và cuối cùng là kiểm tra, xử lý các sự cố thường gặp.

Cài đặt và cấu hình MySQL trên Ubuntu 20.04

Bước đầu tiên và quan trọng nhất là cài đặt một máy chủ MySQL ổn định và an toàn trên hệ điều hành Ubuntu 20.04 của bạn. Quá trình này không chỉ đơn thuần là cài đặt gói phần mềm mà còn bao gồm các bước cấu hình bảo mật ban đầu để bảo vệ cơ sở dữ liệu của bạn ngay từ đầu.

Cài đặt MySQL Server trên Ubuntu 20.04

Trước hết, hãy đảm bảo rằng danh sách gói phần mềm trên máy chủ của bạn được cập nhật. Bạn có thể làm điều này bằng cách mở terminal và chạy lệnh sau:

sudo apt update

Sau khi quá trình cập nhật hoàn tất, bạn có thể tiến hành cài đặt gói mysql-server. Đây là gói chứa máy chủ cơ sở dữ liệu MySQL chính thức.

sudo apt install mysql-server

Hệ thống sẽ tự động tải về và cài đặt các gói cần thiết. Sau khi cài đặt xong, dịch vụ MySQL sẽ tự động khởi chạy. Để chắc chắn mọi thứ đang hoạt động bình thường, bạn hãy kiểm tra trạng thái của dịch vụ bằng lệnh:

sudo systemctl status mysql

Nếu bạn thấy dòng chữ active (running) màu xanh lá, điều đó có nghĩa là máy chủ MySQL của bạn đã được cài đặt và đang chạy thành công.

Hình minh họa

Cấu hình cơ bản MySQL

MySQL cung cấp một kịch bản (script) bảo mật giúp bạn dễ dàng thực hiện các thiết lập an toàn cơ bản. Đây là một bước cực kỳ quan trọng và bạn không nên bỏ qua. Hãy chạy lệnh sau trong terminal:

sudo mysql_secure_installation

Kịch bản này sẽ hỏi bạn một loạt câu hỏi. Bạn nên trả lời “Yes” cho hầu hết các câu hỏi này để tăng cường bảo mật, bao gồm: thiết lập plugin VALIDATE PASSWORD để yêu cầu mật khẩu mạnh, thay đổi mật khẩu cho người dùng root, xóa người dùng ẩn danh (anonymous users), không cho phép người dùng root đăng nhập từ xa, và xóa cơ sở dữ liệu thử nghiệm.

Sau khi hoàn tất kịch bản này, bạn cần biết về tệp cấu hình chính của MySQL. Tệp này thường có tên là my.cnf hoặc mysqld.cnf, nằm trong thư mục /etc/mysql/. Đây là nơi chứa tất cả các thiết lập quan trọng của máy chủ MySQL, và chúng ta sẽ cần chỉnh sửa nó ở bước tiếp theo để cho phép kết nối từ xa. Đây là phần được đề cập chi tiết trong bài viết Kernel Linux.

Hình minh họa

Chỉnh sửa tệp cấu hình my.cnf để cho phép kết nối từ xa

Mặc định, MySQL trên Ubuntu được cấu hình để chỉ chấp nhận các kết nối từ chính máy chủ đó (localhost). Đây là một thiết lập an toàn để ngăn chặn truy cập trái phép từ bên ngoài. Để cho phép kết nối từ xa, chúng ta cần thay đổi một chỉ thị quan trọng trong tệp cấu hình.

Xác định vị trí file my.cnf trên Ubuntu 20.04

Vị trí của tệp cấu hình chính có thể khác nhau đôi chút tùy thuộc vào phiên bản MySQL. Thông thường, bạn sẽ tìm thấy nó tại /etc/mysql/mysql.conf.d/mysqld.cnf. Tệp này chứa các cấu hình cụ thể cho tiến trình máy chủ MySQL (mysqld). Nếu không tìm thấy ở đó, bạn có thể kiểm tra tệp /etc/mysql/my.cnf.

Để mở và chỉnh sửa tệp này, bạn có thể sử dụng một trình soạn thảo văn bản dòng lệnh như nano:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Thao tác này sẽ mở tệp cấu hình trong terminal, sẵn sàng để bạn thực hiện các thay đổi cần thiết. Để hiểu thêm về hệ điều hành Ubuntu và cách cài đặt, bạn có thể tham khảo bài viết hướng dẫn Cài đặt Ubuntu.

Hình minh họa

Thay đổi thiết lập bind-address

Bên trong tệp mysqld.cnf, hãy tìm một dòng có tên là bind-address. Theo mặc định, giá trị của nó sẽ được đặt là 127.0.0.1. Địa chỉ IP này là địa chỉ loopback, có nghĩa là MySQL chỉ “lắng nghe” các kết nối xuất phát từ chính nó. Đây chính là lý do tại sao bạn không thể kết nối từ một máy tính khác.

Để cho phép kết nối từ xa, bạn cần thay đổi giá trị này. Có hai lựa chọn chính:

  • bind-address = 0.0.0.0: Tùy chọn này sẽ làm cho MySQL lắng nghe trên tất cả các giao diện mạng có sẵn trên máy chủ. Đây là lựa chọn phổ biến và linh hoạt nhất.
  • bind-address = [địa chỉ IP của server]: Nếu máy chủ của bạn có nhiều địa chỉ IP, bạn có thể chỉ định một địa chỉ IP cụ thể để MySQL lắng nghe. Điều này an toàn hơn một chút so với 0.0.0.0.

Bạn có thể vô hiệu hóa dòng cũ bằng cách thêm dấu # ở đầu dòng và thêm một dòng mới bên dưới nó. Ví dụ:

# bind-address = 127.0.0.1

bind-address = 0.0.0.0

Sau khi đã thay đổi, hãy lưu tệp và thoát khỏi trình soạn thảo (trong nano, nhấn Ctrl + X, sau đó Y, và Enter). Để các thay đổi có hiệu lực, bạn phải khởi động lại dịch vụ MySQL:

sudo systemctl restart mysql

Bây giờ, máy chủ MySQL của bạn đã sẵn sàng lắng nghe các kết nối từ mạng bên ngoài. Để hiểu sâu hơn về kernel trong Linux, bạn có thể tham khảo bài Kernel là gì.

Quản lý quyền truy cập người dùng MySQL

Chỉ việc cho phép MySQL lắng nghe kết nối từ xa là chưa đủ. Vì lý do bảo mật, bạn không bao giờ nên sử dụng tài khoản root để kết nối từ xa. Thay vào đó, bạn phải tạo một người dùng mới và cấp cho họ các quyền cần thiết để truy cập cơ sở dữ liệu từ một địa chỉ IP cụ thể hoặc từ bất kỳ đâu.

Tạo và cấp quyền user cho kết nối từ xa

Đầu tiên, hãy đăng nhập vào MySQL với quyền root trên máy chủ:

sudo mysql

Bây giờ, hãy tạo một người dùng mới. Cú pháp như sau:

CREATE USER 'ten_nguoi_dung'@'dia_chi_ip_ket_noi' IDENTIFIED BY 'mat_khau_manh';

Trong đó:

  • ten_nguoi_dung: Tên người dùng bạn muốn tạo.
  • dia_chi_ip_ket_noi: Đây là phần quan trọng. Bạn có thể sử dụng % để cho phép kết nối từ bất kỳ địa chỉ IP nào, hoặc chỉ định một địa chỉ IP cụ thể (ví dụ: 192.168.1.100) để tăng cường bảo mật. Luôn ưu tiên sử dụng IP cụ thể nếu có thể.
  • mat_khau_manh: Đặt một mật khẩu phức tạp và an toàn.

Ví dụ, để tạo người dùng azweb_user có thể kết nối từ mọi nơi:

CREATE USER 'azweb_user'@'%' IDENTIFIED BY 'PassWordCucManh123!';

Hình minh họa

Sau khi tạo người dùng, bạn cần cấp quyền cho họ trên các cơ sở dữ liệu cụ thể. Cú pháp GRANT cho phép bạn làm điều này.

GRANT ALL PRIVILEGES ON ten_database.* TO 'ten_nguoi_dung'@'dia_chi_ip_ket_noi';

Ví dụ, để cấp toàn bộ quyền trên cơ sở dữ liệu azweb_data cho người dùng vừa tạo:

GRANT ALL PRIVILEGES ON azweb_data.* TO 'azweb_user'@'%';

Nếu bạn chỉ muốn cấp các quyền cụ thể như đọc và ghi, bạn có thể thay ALL PRIVILEGES bằng SELECT, INSERT, UPDATE, DELETE. Cuối cùng, hãy chạy lệnh sau để áp dụng tất cả các thay đổi về quyền:

FLUSH PRIVILEGES;

Bây giờ, bạn có thể thoát khỏi MySQL client bằng lệnh exit.

Kiểm tra quyền và bảo mật người dùng

Sau khi cấp quyền, bạn nên kiểm tra lại để đảm bảo người dùng chỉ có những quyền mà họ thực sự cần. Bạn có thể sử dụng lệnh SHOW GRANTS để xem danh sách quyền của một người dùng.

SHOW GRANTS FOR 'azweb_user'@'%';

Lệnh này sẽ liệt kê chi tiết các quyền mà người dùng azweb_user đang có. Về mặt bảo mật, hãy luôn tuân thủ “nguyên tắc đặc quyền tối thiểu” (Principle of Least Privilege). Điều này có nghĩa là chỉ cấp những quyền thực sự cần thiết cho công việc của người dùng đó, không hơn không kém. Việc này giúp giảm thiểu rủi ro nếu tài khoản người dùng bị xâm phạm.

Hình minh họa

Cấu hình tường lửa để mở cổng kết nối MySQL

Ngay cả khi MySQL đã được cấu hình để chấp nhận kết nối từ xa, một lớp bảo vệ quan trọng khác có thể đang chặn chúng: tường lửa của máy chủ. Trên Ubuntu, công cụ quản lý tường lửa mặc định là UFW (Uncomplicated Firewall). Chúng ta cần cấu hình UFW để cho phép lưu lượng truy cập đi qua cổng MySQL.

Kiểm tra trạng thái tường lửa trên Ubuntu 20.04

Trước khi thay đổi bất cứ điều gì, bạn nên kiểm tra trạng thái hiện tại của UFW. Hãy chạy lệnh sau:

sudo ufw status

Nếu UFW đang hoạt động, bạn sẽ thấy danh sách các quy tắc hiện có. Nếu nó không hoạt động, bạn sẽ nhận được thông báo Status: inactive. Nếu UFW chưa được kích hoạt, bạn có thể kích hoạt nó bằng sudo ufw enable. Việc bật tường lửa là một bước bảo mật cơ bản cho bất kỳ máy chủ nào kết nối internet.

Hình minh họa

Mở cổng 3306 cho kết nối MySQL từ xa

MySQL sử dụng cổng 3306 theo mặc định cho các kết nối TCP. Để cho phép kết nối từ xa, bạn cần tạo một quy tắc trong UFW để mở cổng này.

Cách đơn giản nhất là mở cổng cho tất cả mọi người:

sudo ufw allow 3306/tcp

Tuy nhiên, cách này không an toàn vì nó cho phép bất kỳ ai trên internet cố gắng kết nối đến cổng MySQL của bạn. Một phương pháp an toàn hơn nhiều là chỉ cho phép kết nối từ một địa chỉ IP cụ thể. Ví dụ, nếu máy tính client của bạn có địa chỉ IP là 203.0.113.50, bạn nên sử dụng lệnh sau:

sudo ufw allow from 203.0.113.50 to any port 3306 proto tcp

Lệnh này chỉ định rõ rằng chỉ lưu lượng truy cập từ IP 203.0.113.50 mới được phép đi đến cổng 3306. Đây là phương pháp được khuyến nghị để tăng cường bảo mật. Sau khi thêm quy tắc, hãy kiểm tra lại trạng thái của UFW để chắc chắn rằng quy tắc mới đã được áp dụng:

sudo ufw status

Bây giờ, bạn sẽ thấy quy tắc cho phép cổng 3306 trong danh sách.

Hình minh họa

Kiểm tra kết nối và xử lý sự cố thường gặp

Sau khi đã hoàn thành tất cả các bước cấu hình trên máy chủ, đã đến lúc kiểm tra xem bạn có thể kết nối từ xa thành công hay không. Đây cũng là giai đoạn bạn có thể gặp phải một số lỗi phổ biến, nhưng đừng lo, chúng ta sẽ xem xét cách giải quyết chúng.

Kiểm tra kết nối từ máy client đến server MySQL

Từ một máy tính khác (máy client), bạn có thể sử dụng công cụ dòng lệnh mysql hoặc một ứng dụng GUI như DBeaver, HeidiSQL, hoặc MySQL Workbench.

Để kiểm tra bằng dòng lệnh, hãy mở terminal trên máy client và chạy lệnh sau, thay thế các thông tin cho phù hợp:

mysql -u ten_nguoi_dung -p -h dia_chi_ip_server

Ví dụ:

mysql -u azweb_user -p -h 192.168.1.200

Hệ thống sẽ yêu cầu bạn nhập mật khẩu của người dùng azweb_user. Nếu bạn nhập đúng mật khẩu và mọi thứ đã được cấu hình chính xác, bạn sẽ thấy lời chào của MySQL và dấu nhắc lệnh mysql>. Điều này xác nhận rằng kết nối từ xa đã thành công!

Hình minh họa

Xử lý lỗi phổ biến khi kết nối MySQL từ xa

Nếu kết nối không thành công, bạn có thể gặp phải một vài thông báo lỗi quen thuộc. Dưới đây là cách chẩn đoán và khắc phục chúng:

  • Lỗi ERROR 2003 (HY000): Can't connect to MySQL server on 'server_ip' (110): Lỗi này thường có nghĩa là kết nối bị hết thời gian chờ. Nguyên nhân phổ biến nhất là do tường lửa (trên máy chủ hoặc thậm chí trên máy client) đang chặn cổng 3306, hoặc do giá trị bind-address trong tệp mysqld.cnf vẫn được đặt là 127.0.0.1. Hãy kiểm tra lại quy tắc UFW và tệp cấu hình MySQL.
  • Lỗi ERROR 1045 (28000): Access denied for user 'ten_nguoi_dung'@'dia_chi_ip_client': Thông báo này rất rõ ràng – “Truy cập bị từ chối”. Nguyên nhân có thể là: bạn đã nhập sai mật khẩu, hoặc người dùng bạn đang sử dụng không được cấp quyền để kết nối từ địa chỉ IP của máy client. Ví dụ, nếu bạn tạo người dùng 'azweb_user'@'192.168.1.100' nhưng lại cố kết nối từ IP 192.168.1.150, bạn sẽ gặp lỗi này. Hãy kiểm tra lại câu lệnh GRANT của bạn.

Hình minh họa

Hãy kiểm tra từng bước một: Dịch vụ MySQL có đang chạy không? bind-address đã đúng chưa? Tường lửa đã mở cổng cho IP của bạn chưa? Người dùng và quyền đã được tạo chính xác chưa? Việc đi theo trình tự này sẽ giúp bạn nhanh chóng tìm ra và khắc phục sự cố.

Thực hành tốt nhất khi thiết lập MySQL từ xa

Việc thiết lập kết nối từ xa thành công chỉ là bước khởi đầu. Để đảm bảo hệ thống của bạn vận hành an toàn và ổn định trong dài hạn, hãy luôn tuân thủ các thực hành tốt nhất sau đây. Đây là những kinh nghiệm quý báu giúp bảo vệ dữ liệu và duy trì hiệu suất cho máy chủ của bạn.

  • Sử dụng SSL để mã hóa kết nối MySQL: Khi dữ liệu được truyền qua mạng công cộng (internet), nó có thể bị nghe lén. Việc cấu hình SSL/TLS cho kết nối MySQL sẽ mã hóa toàn bộ dữ liệu giữa client và server, đảm bảo rằng thông tin nhạy cảm của bạn luôn được bảo vệ. Đây là một bước thiết yếu cho các môi trường sản xuất. Để tìm hiểu thêm về Linux và các hệ điều hành liên quan, bạn có thể xem bài viết Linux.
  • Giới hạn quyền user theo IP cụ thể thay vì ‘%’: Như đã đề cập, việc sử dụng ký tự đại diện % trong tên máy chủ của người dùng ('user'@'%') là rất tiện lợi nhưng cũng kém an toàn. Bất cứ khi nào có thể, hãy chỉ định địa chỉ IP hoặc dải IP cụ thể mà người dùng được phép kết nối. Điều này tạo ra một lớp phòng thủ mạnh mẽ, ngăn chặn các nỗ lực truy cập từ những nơi không xác định.
  • Thường xuyên cập nhật và sao lưu dữ liệu: Mở một cổng dịch vụ ra internet đồng nghĩa với việc tăng bề mặt tấn công. Hãy đảm bảo rằng hệ điều hành và phiên bản MySQL của bạn luôn được cập nhật các bản vá bảo mật mới nhất. Đồng thời, thiết lập một lịch trình sao lưu (backup) cơ sở dữ liệu tự động và định kỳ. Các dịch vụ VPS và Hosting chất lượng cao từ AZWEB thường tích hợp sẵn các công cụ sao lưu tiện lợi giúp bạn thực hiện việc này dễ dàng.
  • Tránh sử dụng user root cho kết nối từ xa: Đây là quy tắc vàng. Tuyệt đối không bao giờ cho phép người dùng root kết nối từ xa. Tài khoản này có toàn quyền trên cơ sở dữ liệu, và nếu nó bị xâm phạm, hậu quả sẽ vô cùng nghiêm trọng. Luôn tạo các tài khoản người dùng riêng biệt với các quyền hạn được giới hạn chặt chẽ.

Kết luận

Qua bài viết này, chúng ta đã cùng nhau đi qua toàn bộ quy trình thiết lập và bảo mật kết nối cơ sở dữ liệu MySQL từ xa trên một máy chủ Ubuntu 20.04. Từ việc cài đặt ban đầu, chỉnh sửa tệp cấu hình, quản lý người dùng và quyền hạn, cho đến việc cấu hình tường lửa, mỗi bước đều đóng một vai trò quan trọng trong việc xây dựng một hệ thống vừa linh hoạt vừa an toàn.

Việc cho phép truy cập từ xa mang lại rất nhiều lợi ích về hiệu quả công việc và kiến trúc hệ thống, nhưng nó đòi hỏi sự cẩn trọng và tuân thủ nghiêm ngặt các nguyên tắc bảo mật. Hãy luôn nhớ rằng, bảo mật không phải là một tính năng, mà là một quá trình liên tục. Việc giới hạn quyền truy cập, sử dụng mật khẩu mạnh, mã hóa kết nối và thường xuyên giám sát hệ thống là những yếu tố then chốt để bảo vệ tài sản dữ liệu quý giá của bạn.

AZWEB hy vọng rằng hướng dẫn chi tiết này sẽ giúp bạn tự tin hơn trong việc quản trị máy chủ của mình. Hãy bắt đầu thực hành trên một môi trường thử nghiệm để làm quen trước khi áp dụng vào hệ thống thực tế. Để tìm hiểu sâu hơn, bạn có thể nghiên cứu thêm về các chủ đề nâng cao như cấu hình SSL/TLS cho MySQL, các kỹ thuật tối ưu hóa truy vấn từ xa, và các công cụ giám sát hiệu suất cơ sở dữ liệu.

Đánh giá