Cấu hình Remote Client Access trong MariaDB trên Ubuntu

Trước khi đi đến phần cấu hình chúng ta tìm hiểu một chút về cơ chế kết nối của MariaDB. Mặc định MariaDB gắn với địa chỉ 127.0.0.1 (IP loopback) bằng tùy chọn bind-address trong file cấu hình, điều này giúp hệ thống bảo mật hơn do không thể kết nối trực tiếp đến MariaDB server từ remote host thông qua cổng TCP. Kể cả cùng 1 máy chủ nhưng khác cổng loopback thì cũng không thể nào kết nối được. Một số phiên bản MariaDB cũ còn khóa luôn kết nối TCP/IP bằng tùy chọn skip-networking.

Thêm nữa MariaDB/ MySQL cũng quy định “localhost” (unix socket) khác so với “127.0.0.1” (tcp socket) nên bạn có thể đặt mật khẩu cho TCP mà không thể đặt cho Unix socket

Kiểm tra cấu hình MariaDB bằng câu lệnh

user@server:~$ sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Bạn sẽ thấy tùy chọn

bind-address = 127.0.0.1

Cấu hình MariaDB nghe kết nối từ remote host

Rất đơn giản bạn chỉ cần chuyển dòng tùy chọn #bind-address = 127.0.0.1 thành comment, ấn Ctrl+O và Ctrl_X để thoát. Khởi động lại máy chủ MariaDB bằng lệnh

Quảng cáo

Ủng hộ website

user@server:~$ sudo systemctl restart mariadb

Xem lại cấu hình của MariaDB bằng lệnh

user@server:~$ mysqld --print-defaults
mysqld would have been started with the following arguments:
--user=mysql --pid-file=/run/mysqld/mysqld.pid --socket=/run/mysqld/mysqld.sock --port=3306 --basedir=/usr --datadir=/var/lib/mysql --tmpdir=/tmp --lc-messages-dir=/usr/share/mysql --query_cache_size=16M --log_error=/var/log/mysql/error.log --expire_logs_days=10 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --lower_case_table_names=1

Cấp quyền cho user kết nối bằng remote host

Đăng nhập vào MariaDB bằng câu lệnh

user@server:~$ sudo mysql -u root

Sử dụng lệnh sau để xem các user và host được phép kết nối

MariaDB [(none)]> SELECT User, Host, Plugin FROM mysql.user;
+-------+-------------+-------------+
| User  | Host        | Plugin      |
+-------+-------------+-------------+
| jessy | 26.52.152.3 |             |
| jessy | localhost   |             |
| root  | localhost   | unix_socket |
+-------+-------------+-------------+

Như hình trên ta có thể thấy tài khoản root sử dụng unix_socket có thể đăng nhập trực tiếp từ tài khoản root ubuntu mà không cần mật khẩu

user@server:~$ sudo mysql -u root

Tài khoản jessy được phép kết nối trong localhost và từ địa chỉ 26.52.152.3 bây giờ ta muốn thêm địa chỉ để kết nối đến tài khoản jessy bằng lệnh

MariaDB [(none)]> GRANT ALL PRIVILEGES ON dev_test.* TO 'jessy'@'192.168.0.%' IDENTIFIED BY 'my-new-password' WITH GRANT OPTION;
MariaDB [(none)]> FLUSH PRIVILEGES;

Câu lệnh trên giúp tài khoản jessy sử dụng cơ sở dữ liệu dev_test được phép truy cập từ mạng LAN có địa chỉ 192.168.0.0/24 với mật khẩu là “my-new-password”

Kiểm tra lại ta sẽ thấy:

MariaDB [(none)]> SELECT User, Host, Plugin FROM mysql.user;
+-------+-------------+-------------+
| User  | Host        | Plugin      |
+-------+-------------+-------------+
| jessy | 192.168.0.% |             |
| jessy | 61.38.140.3 |             |
| jessy | localhost   |             |
| root  | localhost   | unix_socket |
+-------+-------------+-------------+

Cấu hình tường lửa để cho phép cổng kết nối MariaDB

Nếu bạn đã kích hoạt tường lửa ufw trên Ubuntu thì cần cấu hình để cho phép cổng 3306 của MariaDB, nếu bạn đã đổi cổng khác thì lưu ý nhập vào cổng tương ứng nhé

user@server:~$ sudo ufw allow 3306/tcp
hoặc an toàn hơn thì ta cho 1 IP nhất định
user@server:~$ sudo ufw deny from 211.200.186.156 to any port 3306 proto tcp
Kiểm tra các rule của tường lửa bằng lệnh
user@server:~$ sudo ufw status

Nếu vẫn không được, hãy thử kiểm tra log của tường lửa xem nó có block các gói tin đến cổng 3306 không nhé, mình bị và loay hoay mãi cuối cùng mới tìm ra

user@server:~$ sudo grep -hnr "DPT=3306" /var/log/ufw.log > output.txt

Bài viết sử dụng Ubuntu 20.04 và MariaDB 10.3. Mong được các bạn đóng góp ý kiến để website ngày càng phát triển.

Add Comment