Cho phép một user truy cập database của MySQL/MariaDB từ bên ngoài server.

Cách 1: Cho phép truy cập trực tiếp

Trước hết nếu server ở phía sau tường lửa thì bạn cần phải cho phép cổng 3306 được truy cập từ bên ngoài. Tốt nhất là chỉ nên mở cho một địa chỉ IP cụ thể.

Sửa file cấu hình MySQL server (ví dụ /etc/mysql/my.cnf), cho phép truy cập từ bên ngoài server bằng cách tìm mục [mysqld] để comment/xóa đoạn cấu hình sau:

bind-address       = 127.0.0.1

Cấu hình như trên là chưa đủ. Tiếp theo là cho phép một user của MySQL có quyền truy cập từ xa.

Đừng bao giờ sử dụng tài khoản root. Thay vào đó, hãy tạo một tài khoản mới và phân quyền một cách giới hạn. Ví dụ, tôi tạo user icreativ chỉ có quyền SELECT với một database cụ thể, ví dụ my_database.

CREATE USER 'icreativ'@'%' IDENTIFIED BY 'password';
GRANT SELECT ON `my_database`.*  TO 'icreativ'@'%';
FLUSH PRIVILEGES;

P/S: Hãy thay “password” bằng một mật khẩu thật là phức tạp.

Bạn có thể giới hạn truy cập từ một địa chỉ IP cụ thể bằng cách thay '%' trong lệnh GRANT bằng địa chỉ IP của máy muốn truy cập, ví dụ:

GRANT SELECT ON `my_database`.*  TO 'icreativ'@'103.28.36.224';

Nếu bạn vẫn cứ muốn tài khoản icreativ có toàn quyền như user root thì hãy làm như sau:

GRANT ALL PRIVILEGES ON *.* TO 'icreativ'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

Cách 2: Sử dụng SSH tunnel

SSH tunnel cho phép ánh xạ một hoặc một dải port từ server lên client. Đây là cách an toàn nhất vì 2 lý do: Không cần mở firewall cho MySQL và traffic giữa server và client được mã hóa.

Để truy cập MySQL, bạn cần ánh xạ cổng 3306 như sau:

$ ssh -L 3306:localhost:3306 icreativ.pro

Sau đó bạn có thể truy cập MySQL như bình thường thông qua địa chỉ localhost:3306.