Thứ ba, 23/07/2013 | 00:00 GMT+7

Bảo mật MySQL và MariaDB Databases trên Linux VPS

Có nhiều cách triển khai của database SQL có sẵn trên các hệ thống như Linux và Unix hay cả Windows. MySQL và MariaDB là hai tùy chọn phổ biến để triển khai database quan hệ trong server. Tuy nhiên, giống như hầu hết các phần mềm, những công cụ này có thể có rủi ro bảo mật nếu được cấu hình không chính xác.

Hướng dẫn này sẽ có một số bước cơ bản mà bạn có thể thực hiện để bảo mật database MariaDB hoặc MySQL và đảm bảo an toàn hơn cho VPS server. Để đơn giản, ta sẽ sử dụng server MySQL trên version VPS Ubuntu. Tuy nhiên, các kỹ thuật này có thể được áp dụng cho các dòng Linux khác và cũng được dùng với MariaDB.

Cài đặt ban đầu

MySQL có thể thực hiện bước đầu về bảo mật trong quá trình cài đặt, đầu tiên là yêu cầu bạn đặt password root.

sudo apt-get install mysql-server
 ?????????????????????????? Configuring mysql-server-5.5 ???????????????????????????
 ? While not mandatory, it is highly recommended that you set a password for the   ? 
 ? MySQL administrative "root" user.                                               ? 
 ?                                                                                 ? 
 ? If this field is left blank, the password will not be changed.                  ? 
 ?                                                                                 ? 
 ? New password for the MySQL "root" user:                                         ? 
 ?                                                                                 ? 
 ? _______________________________________________________________________________ ? 
 ?                                                                                 ? 
 ?                                                                             ? 
 ?                                                                                 ? 
 ???????????????????????????????????????????????????????????????????????????????????

Ta có thể đặt password root sau này, nhưng không có lý do gì để bỏ qua bước này, vì vậy ta nên bảo mật account administrator (quản-trị) ngay từ đầu.

Khi quá trình cài đặt hoàn tất, ta nên chạy một vài tập lệnh đi kèm. Đầu tiên, ta sẽ sử dụng tập lệnh "mysql_install_db" để tạo bố cục folder cho database . 

sudo mysql_install_db

Tiếp theo, chạy tập lệnh có tên "mysql_secure_installation", sẽ hướng dẫn ta một số quy trình sẽ loại bỏ một số option mặc định gây rủi ro bảo mật khi sử dụng trong production environment (môi-trường-sản-phẩm).

sudo mysql_secure_installation

Đầu tiên, nó sẽ nhắc bạn nhập password root mà bạn đã đặt trong quá trình cài đặt. Ngay sau đó, bạn sẽ được hỏi một loạt câu hỏi, bắt đầu bằng việc bạn có muốn thay đổi password root hay không.

Thay đổi password an toàn nếu cần.

Bạn nên trả lời "Y" (nghĩa là có) cho tất cả các câu hỏi còn lại.

Điều này sẽ loại bỏ khả năng đăng nhập vào MySQL theo mặc định, vô hiệu hóa đăng nhập từ xa bằng account administrator (quản-trị), xóa một số database thử nghiệm không an toàn, và cập nhật version MySQL để áp dụng thay đổi này.

Những cân nhắc về Bảo mật

Chủ đề bao trùm của việc bảo mật MySQL (và hầu như bất kỳ hệ thống nào khác) là chỉ nên cấp quyền truy cập khi thực sự cần thiết. An toàn dữ liệu là sự cân bằng giữa thuận tiện và bảo mật.

Trong hướng dẫn này, ta sẽ dựa vào khía cạnh bảo mật, mặc dù cách sử dụng cụ thể của bạn đối với database có thể khiến bạn phải chọn các cách khác nhau ở đây.

Bảo mật thông qua file My.cnf

File cấu hình chính cho MySQL là một file có tên "my.cnf" nằm trong folder "/etc/mysql/" trên Ubuntu và folder "/etc/" trên một số VPS khác.

Ta sẽ thay đổi một số cài đặt trong file này.

Mở file với quyền root (hay đổi đường dẫn folder nếu cần nếu bạn đang làm theo hướng dẫn này trên một hệ thống khác) :

sudo nano /etc/mysql/my.cnf

Cài đặt đầu tiên mà ta nên kiểm tra là cài đặt bind-address - "địa chỉ ràng buộc" trong phần "[mysqld]". Cài đặt này phải được đặt thành mạng local của bạn, là "127.0.0.1".

bind-address = 127.0.0.1

Điều này đảm bảo MySQL không chấp nhận kết nối từ đâu ngoại trừ máy local.

Nếu bạn cần truy cập database này từ một máy khác, hãy cân nhắc kết nối thông qua SSH để thực hiện truy vấn và quản trị database của bạn local và gửi kết quả qua tunnel ssh.

Lỗ hổng tiếp theo mà ta sẽ vá là một chức năng cho phép truy cập vào hệ thống file bên dưới từ bên trong MySQL. Điều này có thể có tác động bảo mật nghiêm trọng và nên tắt trừ khi bạn thực sự cần.

Cũng trong file my.cfn này, ta sẽ thêm lệnh để vô hiệu hóa khả năng tải file local:

local-infile=0

Điều này vô hiệu hóa việc tác động đến file cho user không có quyền file database.

Nếu ta có đủ dung lượng ổ cứng, thì việc ghi lại thông tin log theo dõi hoạt động có thể hữu ích.

Ghi log quá nhiều sẽ giảm hiệu suất server, nên bạn cần cân nhắc cẩn thận.

Bạn có thể đặt biến log trong phần "[mysqld]" mà ta đã thêm vào.

log=/var/log/mysql-logfile

Đảm bảo log MySQL, error log và log folder mysql bảo mật quyền truy cập đọc ghi:

sudo ls -l /var/log/mysql*
-rw-r----- 1 mysql adm    0 Jul 23 18:06 /var/log/mysql.err
-rw-r----- 1 mysql adm    0 Jul 23 18:06 /var/log/mysql.log

/var/log/mysql:
total 28
-rw-rw---- 1 mysql adm 20694 Jul 23 19:17 error.log

Bảo mật MySQL từ bên trong

Có một số bước bạn có thể thực hiện khi sử dụng MySQL để cải thiện bảo mật.

Ta cần vào dòng lệnh Mysql để thực hiện: 

mysql -u root -p

Nhập password root đã cài đặt trước đó.

Bảo mật password và host truy cập

Trước tiên, hãy đảm bảo không có user nào không có password hoặc host truy cập trong MySQL:

SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| user             | host      | password                                  |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user        | %         |                                           |
| root             | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root             | ::1       | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

Như bạn thấy, trong ví dụ cài đặt , user "demo-user" không có password và hợp lệ dù anh ta đang ở trên server nào. Điều này  không an toàn.

Ta có thể đặt password cho user bằng lệnh này. Thay đổi " newPassWord " để phản ánh password bạn muốn gán.

UPDATE mysql.user SET Password=PASSWORD('newPassWord') WHERE User="demo-user";

Nếu ta kiểm tra lại bảng User, ta sẽ thấy rằng user demo bây giờ có password:

SELECT User,Host,Password FROM mysql.user;
+------------------+-----------+-------------------------------------------+
| user             | host      | password                                  |
+------------------+-----------+-------------------------------------------+
| root             | localhost | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| demo-user        | %         | *D8DECEC305209EEFEC43008E1D420E1AA06B19E0 |
| root             | 127.0.0.1 | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| root             | ::1       | *DE06E242B88EFB1FE4B5083587C260BACB2A6158 |
| debian-sys-maint | localhost | *ECE81E38F064E50419F3074004A8352B6A683390 |
+------------------+-----------+-------------------------------------------+
5 rows in set (0.00 sec)

Nếu bạn nhìn vào trường "Host", bạn sẽ thấy rằng ta vẫn có "%", là ký tự đại diện nghĩa là bất kỳ server nào đều có thể truy cập với user demo này. Đây cũng là một nguy cơ mất an toàn. Hãy thay đổi nó thành "localhost":

UPDATE mysql.user SET Host='localhost' WHERE User="demo-user";

Nếu ta kiểm tra lại, ta có thể thấy rằng bảng User bây giờ đã đặt các trường thích hợp.

SELECT User,Host,Password FROM mysql.user;

Nếu bảng chứa bất kỳ user trống nào (không nên vào thời điểm này vì ta đã chạy "mysql_secure_installation", nhưng ta sẽ đề cập đến vấn đề này), ta nên xóa họ.

Để thực hiện việc này, ta có thể sử dụng lệnh gọi sau để xóa user trống khỏi bảng truy cập:

DELETE FROM mysql.user WHERE User="";

Sau khi hoàn tất việc sửa đổi bảng User, ta cần chạy lệnh sau để áp dụng các quyền mới:

FLUSH PRIVILEGES;

Cấp quyền user dành riêng cho ứng dụng

Tương tự như quyền user trong Linux có các giới hạn, MySQL cũng nên có lựa chọn như vậy để bảo mật.

Mỗi ứng dụng sử dụng MySQL phải có user riêng chỉ có các quyền  quyền truy cập vào database mà ứng dụng cần.

Khi ta cấu hình một ứng dụng mới để sử dụng MySQL, ta nên tạo database cần thiết cho ứng dụng đó:

create database testDB;
Query OK, 1 row affected (0.00 sec)

Tiếp theo, ta nên tạo một user để quản lý database đó và chỉ gán cho nó những quyền mà user cần, quyền này sẽ tùy theo yêu cầu ứng dụng của bạn.

Để tạo user mới, hãy sử dụng lệnh sau:

CREATE USER 'demo-user'@'localhost' IDENTIFIED BY 'password';

Ta có thể cấp quyền user mới trên bảng mới bằng lệnh sau. Xem hướng dẫn về cách tạo user mới và cấp quyền trong MySQL để tìm hiểu thêm về các quyền cụ thể:

GRANT SELECT,UPDATE,DELETE ON testDB.* TO 'demo-user'@'localhost';

Ví dụ: nếu sau này ta cần thu hồi các quyền user, ta có thể sử dụng lệnh sau:

REVOKE UPDATE ON testDB.* FROM 'demo-user'@'localhost';

Nếu ta cần cấp tất cả các quyền trên một database nhất định, ta có thể chỉ định điều đó bằng cách sau:

GRANT ALL ON testDB.* TO 'demo-user'@'localhost';

Để hiển thị các quyền hiện tại của user, trước tiên ta phải áp dụng các quyền mà ta đã chỉ định bằng cách sử dụng lệnh "flush privileges". Sau đó, ta có thể xem user có những quyền nào:

FLUSH PRIVILEGES;
show grants for 'demo-user'@'localhost';
+------------------------------------------------------------------------------------------------------------------+
| Grants for demo-user@localhost                                                                                   |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'demo-user'@'localhost' IDENTIFIED BY PASSWORD '*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19' |
| GRANT SELECT, UPDATE, DELETE ON `testDB`.* TO 'demo-user'@'localhost'                                            |
+------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Luôn cấp các quyền khi bạn thực hiện xong các thay đổi.

Thay đổi user root

Một lựa chọn nữa mà bạn có thể thực hiện là thay đổi tên đăng nhập root. Nếu kẻ tấn công đang cố gắng truy cập thông tin đăng nhập MySQL root, sẽ gặp thêm rào cản.

Đăng nhập root có thể được thay đổi bằng lệnh sau:

rename user 'root'@'localhost' to 'newAdminUser'@'localhost';

Ta có thể thấy sự thay đổi khi xem bảng user:

select user,host,password from mysql.user;

Áp dụng các thay đổi trên:

FLUSH PRIVILEGES;

Lưu ý: bạn sẽ phải đăng nhập vào MySQL bằng tên user mới được tạo từ bây giờ khi bạn muốn thực hiện các việc quản trị:

mysql -u newAdminUser -p

Kết luận

Mặc dù đây không phải là danh sách đầy đủ về các phương pháp bảo mật MySQL và MariaDB, nhưng đã cung cấp cho các lựa chọn nên thực hiện khi bảo mật database.

Thông tin thêm về cấu hình và bảo mật có thể thấy trên các trang web MySQL và MariaDB cũng như trong các trang cộng đồng khác. Và các ứng dụng bạn chọn sử dụng cũng có thể đưa ra các lựa chọn bảo mật riêng.


Tags:

Các tin trước

Cài đặt Firewall với UFW trên Ubuntu và Debian Cloud Server 2013-06-25
Cơ bản nhất về MYSQL trên Ubuntu CentOS 2012-06-12