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

Cách bảo mật Cơ sở dữ liệu MySQL và MariaDB trong VPS Linux

Có nhiều cách triển khai của ngôn ngữ database SQL có sẵn trên các hệ thống giống như Linux và Unix. MySQL và MariaDB là hai tùy chọn phổ biến để triển khai database quan hệ trong môi trường 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ể là nghĩa vụ bảo mật nếu chúng được cấu hình không chính xác. Hướng dẫn này sẽ hướng dẫn bạn 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 chúng không phải là một cánh cửa mở vào VPS của bạn.

Để đơn giản và minh họa, ta sẽ sử dụng server MySQL trên version VPS Ubuntu 12.04. Tuy nhiên, các kỹ thuật này có thể được áp dụng cho các bản phân phối Linux khác và cũng được dùng với MariaDB.

Cài đặt ban đầu

MySQL cho bạn cơ hội để thực hiện bước đầu tiên về bảo mật trong quá trình cài đặt. Nó sẽ 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:                                         ? 
 ?                                                                                 ? 
 ? _______________________________________________________________________________ ? 
 ?                                                                                 ? 
 ?                                                                             ? 
 ?                                                                                 ? 
 ???????????????????????????????????????????????????????????????????????????????????

Bạn luôn 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 bạn nên bảo mật account administrator của bạn 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 của ta .

sudo mysql_install_db

Tiếp theo, chạy tập lệnh có tên "mysql_secure_installation". Điều này sẽ hướng dẫn ta một số quy trình sẽ loại bỏ một số giá trị mặc định gây nguy hiểm khi sử dụng trong môi trường production .

sudo mysql_secure_installation

Đầu tiên, nó sẽ nhắc bạn nhập password root mà bạn đã cài đặ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.

Đây là một cơ hội khác để thay đổi password của bạn thành một thứ gì đó an toàn nếu bạn chưa làm như vậy.

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 bất kỳ ai đăng nhập vào MySQL theo mặc định, vô hiệu hóa đăng nhập từ xa bằng account administrator , xóa một số database thử nghiệm không an toàn và cập nhật version MySQL đang chạy để áp dụng thay đổi này.

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. Sự an toàn dữ liệu đôi khi đi đến sự cân bằng giữa sự 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 phần mềm database có thể khiến bạn phải chọn và lựa chọn trong số các tùy chọn này.

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

Tệp 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 để khóa version MySQL của ta .

Mở file với quyền root. Thay đổ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 "địa chỉ ràng buộc" trong phần "[mysqld]". Cài đặt này phải được đặt thành thiết bị mạng lặp 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ừ bất kỳ đâ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 xem xét 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.

Trong cùng một phần của file , ta sẽ thêm chỉ thị để tắt khả năng tải file local này:

local-infile=0

Điều này sẽ vô hiệu hóa việc tải file từ hệ thống file cho user không có quyền cấp file đối với database .

Nếu ta có đủ dung lượng và không vận hành một database khổng lồ, thì việc ghi lại thông tin bổ sung để theo dõi hoạt động đáng ngờ có thể hữu ích.

Ghi log quá nhiều có thể tạo ra một cú đánh hiệu suất, vì vậy đây là điều bạn cần cân nhắc cẩn thận.

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

log=/var/log/mysql-logfile

Đảm bảo rằng log MySQL, log lỗi và folder log mysql không thể đọc được:

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 sẽ nhập các lệnh trong phần này vào giao diện nhắc MySQL, vì vậy ta cần đăng nhập.

mysql -u root -p

Bạn sẽ được hỏi password root mà bạn đã cài đặt trước đó.

Bảo mật password và liên kết server lưu trữ

Trước tiên, hãy đảm bảo không có user nào không có password hoặc liên kết server 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 của ta , user "demo-user" không có password và hợp lệ dù anh ta đang ở trên server nào. Điều này là rất 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 " Server lưu trữ", bạn sẽ thấy rằng ta vẫn có "%", là ký tự đại diện nghĩa là bất kỳ server lưu trữ nào. Đây không phải là những gì ta muố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 của ta 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 nhập lệnh sau để áp dụng các quyền mới:

FLUSH PRIVILEGES;

Triển khai user dành riêng cho ứng dụng

Tương tự như thực tiễn chạy các quy trình trong Linux với quyền là một user bị cô lập, MySQL được hưởng lợi từ cùng một kiểu cô lập.

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

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

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à nó cần. Điều này sẽ khác nhau tùy theo ứng dụng và một số cách sử dụng cần nhiều quyền mở hơn những cách khác.

Để 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 cập nhật từ account , ta có thể sử dụng lệnh sau:

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

Nếu ta cần 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 triển khai các quyền mà ta đã chỉ định bằng cách sử dụng lệnh " quyền tuôn ra". Sau đó, ta có thể truy vấn user có những trợ cấp 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 bước bổ sung mà bạn có thể cần 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 , chúng cần thực hiện thêm bước tìm tên user .

Đă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 bằng cách sử dụng cùng một truy vấn mà ta đã sử dụng cho database User :

select user,host,password from mysql.user;

, ta phải cấp các quyền để những thay đổi này xảy ra:

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 đủ các phương pháp bảo mật MySQL và MariaDB, nhưng nó sẽ cung cấp cho bạn phần giới thiệu tốt về các loại quyết định bạn phải thực hiện khi bảo mật database của bạn .

Thông tin thêm về cấu hình và bảo mật có thể được tìm thấy trên các trang web MySQL và MariaDB cũng như trong các trang user tương ứng của chúng. Các ứng dụng bạn chọn sử dụng cũng có thể đưa ra lời khuyên bảo mật.

Bởi Justin Ellingwood

Tags:

Các tin trước

Chuyển sang MariaDB từ MySQL 2013-07-18
Cách di chuyển cơ sở dữ liệu MySQL giữa hai server 2012-08-09
Cách thiết lập Master Slave Replication trong MySQL 2012-07-25
Cách nhập và xuất cơ sở dữ liệu và đặt lại mật khẩu gốc trong MySQL 2012-06-12
Hướng dẫn MySQL Cơ bản 2012-06-12
Hướng dẫn MySQL Cơ bản 2012-06-12