Bài viết này tập trung vào việc kiểm tra và bảo mật cơ sở dữ liệu MySQL của bạn và cung cấp chín mẹo để tăng cường bảo mật cho cơ sở dữ liệu đó.
1. Tránh cấp đặc quyền không cần thiết
MySQL cho phép một số câu lệnh đặc quyền mà khi được gán một cách không cần thiết cho người dùng có thể dẫn đến việc đọc/ghi tệp và phá hủy các đặc quyền khác của người dùng. Một số tuyên bố đặc quyền tiềm ẩn rủi ro nhất là FILE, GRANT, SUPER, ALTER, DELETE, SHUTDOWN, v.v. Bạn có thể đọc thêm về những điều này từ tài liệu chính thức của MySQL. Do đó, không cấp các đặc quyền siêu người dùng như FILE, GRANT, SUPER và PROCESS cho các tài khoản phi quản trị. Bạn có thể thu hồi các quyền toàn hệ thống, cơ sở dữ liệu và cấp bảng không cần thiết này với lệnh:
REVOKE ALL ON *.* FROM 'user_name'@'host_name'; #Global privileges
REVOKE CREATE,DROP ON database_name.* FROM 'user_name'@'host_name'; #Database privileges
REVOKE INSERT, UPDATE,DELETE ON database_name.table_name FROM 'user_name'@'host_name'; #Table privileges
flush privileges;
2. Hạn chế đăng nhập từ xa
Truy cập từ xa giúp giảm bớt công việc của quản trị viên cơ sở dữ liệu, nhưng nó có nguy cơ khiến máy chủ gặp phải các lỗ hổng và hoạt động khai thác tiềm ẩn. Bạn có thể vô hiệu hóa quyền truy cập từ xa cho tất cả các loại tài khoản người dùng MySQl bằng cách thêm biến skip-networking vào tệp cấu hình chính và khởi động lại dịch vụ.
[mysqld]
skip-networking
sudo service mysql restart
Tương tự, bạn phải vô hiệu hóa quyền truy cập tài khoản root, nếu không muốn nói là tất cả để hạn chế đăng nhập từ xa vào tài khoản root. Biện pháp phòng ngừa này ngăn chặn việc brute-force* tài khoản root MySQL.
*brute-force mật khẩu có nghĩa là đoán mọi mật khẩu có thể có cho đến khi tìm ra mật khẩu đúng.
mysql> delete from mysql.user where user='root' and host not in ('localhost', '127.0.0.1', '::1'); mysql> flush privileges;
3. Tắt chức năng (load_file, outfile, dumpfile)
Một biện pháp phòng ngừa khác để bảo vệ MySQL khỏi việc tiêm tệp cục bộ là vô hiệu hóa các chức năng chỉ có thể truy cập được thông qua đặc quyền cấp FILE. FILE là một tùy chọn cho phép người dùng có đặc quyền thấp có tùy chọn lệnh global đọc hoặc ghi tệp trên máy chủ.
- load_file
Hàm Load_file tải nội dung tệp từ máy chủ dưới dạng chuỗi. Ví dụ: lệnh sau sẽ tải tất cả nội dung từ tệp /etc/passwd như sau:
select load_file('/etc/passwd')
- outfile
Tương tự, hàm outfile ghi nội dung vào các file máy chủ cục bộ. Kẻ tấn công có thể sử dụng chức năng này để ghi tải trọng vào tệp trong máy chủ, như sau:
select 'Local File SQL Injection' into outfile '/tmp/file.txt';
cat /tmp/file.txt
Đầu ra:
Local File SQL Injection
- dumpfile
Hàm này sử dụng nguyên nhân được chọn để ghi vào tệp mà không trả kết quả ra màn hình.
cat /tmp/file.txt
select 'Hello world!' into dumpfile '/tmp/world';
Đầu ra:
Query OK, 1 row affected (0.001 sec)
Bạn có thể tắt các chức năng này bằng cách thu hồi đặc quyền FILE như sau:
revoke FILE on *.* from 'user_name'@'localhost';
4. Vô hiệu hóa cổng mặc định
Các dịch vụ MySQL chạy trên cổng 3306 và những kẻ tấn công quét các cổng để kiểm tra các dịch vụ đang chạy trên mạng. Để tăng bảo mật, bạn nên thay đổi cổng MySQL mặc định bằng cách chỉnh sửa biến hệ thống cổng trong tệp cấu hình chính của nó, bạn sẽ cần nhập thông tin sau:
vim /etc/mysql/my.cnf
port=XXXX
sudo service mysql restart
5. Tránh ký tự đại diện trong tên tài khoản
Tên tài khoản trong MySQL bao gồm hai phần là người dùng và tên máy chủ “user_name”@”host_name”. Nó cho phép quản trị viên tạo tài khoản cho những người dùng có cùng tên kết nối từ các máy chủ khác nhau. Tuy nhiên, phần máy chủ của tên tài khoản cho phép các quy ước ký tự đại diện có thể là điểm truy cập vào cơ sở dữ liệu từ bất kỳ đâu.
Việc sử dụng tùy chọn giá trị tên máy chủ hoặc địa chỉ IP tương đương với ‘user_name’@’%’ trong đó % khớp với mẫu MySQL khớp với hoạt động LIKE và % có nghĩa là bất kỳ tên máy chủ nào. Trong khi đó, quyền truy cập từ ‘192.168.132.%’ có nghĩa là bất kỳ nỗ lực nào từ mạng lớp C. Ngoài ra, bất kỳ ai cũng có thể truy cập cơ sở dữ liệu bằng cách đặt tên phần máy chủ là “192.18.132.mysql.com”.
Để tránh những nỗ lực như vậy, MySQL cho phép xác định netmask với giá trị máy chủ để xác định các bit mạng của địa chỉ IP:
client-ip_add & netmask = host_name
Cú pháp để tạo tên máy chủ là Host_ip/netmask:
CREATE USER 'jhon'@'192.168.132.0/255.255.255.0';
Giá trị máy chủ ở trên cho phép người dùng john truy cập cơ sở dữ liệu từ bất kỳ IP nào trong phạm vi 192.168.132.0-192.168.132.255. Tương tự, các giá trị máy chủ 192.168.132.0/255.0.0.0, 192.168.132.0/255.255.0.0 sẽ cho phép các máy chủ từ mạng lớp A và B. Trong khi 192.168.132.5 sẽ chỉ cho phép truy cập từ IP cụ thể.
6. Vô hiệu hóa quyền truy cập rõ ràng
Tên người dùng trong MySQL là tên mà cơ sở dữ liệu chấp nhận các kết nối đến hoặc tên người dùng trống “@”host_name” để tạo người dùng ẩn danh. Tuy nhiên, sự hiện diện của người dùng ẩn danh có thể tạo điều kiện cho kẻ tấn công truy cập vào máy chủ cơ sở dữ liệu. Ngoài ra, MySQL phiên bản trước MySQL 5.7 tạo một nhóm người dùng ẩn danh và cài đặt sau khi nâng cấp phiên bản vẫn thêm những người dùng này.
select user, host, password from mysql.user where user like '';
Lưu ý rằng cột người dùng và mật khẩu trống và quyền truy cập bị giới hạn ở localhost. Tuy nhiên, bạn không muốn bất kỳ ai truy cập vào cơ sở dữ liệu. Sử dụng lệnh sau để xóa người dùng ẩn danh:
drop user " "@"localhost"
flush privileges;
7. Đặt tài khoản không root làm chủ sở hữu hoặc nhóm
Việc đặt tài khoản người dùng không phải root không liên quan đến người dùng root MySQL. Việc cài đặt MySQL trong hệ thống Linux/Unix từ các gói tar và tar.gz cho phép bất kỳ người dùng có đặc quyền thấp nào có thể chạy máy chủ. Đây là một nhược điểm về bảo mật vì bất kỳ người dùng nào có tùy chọn cấp FILE đều có thể chỉnh sửa hoặc tạo tệp tại máy chủ. Tuy nhiên, nó trả về lỗi khi người dùng cố gắng truy cập nó mà không gặp lỗi -user=root.
Bạn có thể tránh điều này bằng cách truy cập máy chủ cơ sở dữ liệu với tư cách là người dùng Linux riêng biệt. Để chạy mysqld với tư cách là người dùng Linux thông thường, hãy dừng máy chủ và thay đổi quyền đọc/ghi của máy chủ MySQl thành mysql, như sau:
chown -R mysql /path/to/mysql/datadir
Mở tệp cấu hình chính của MySQL, thêm người dùng mysql mới và khởi động lại dịch vụ để tránh quyền truy cập máy chủ không cần thiết:
vim /etc/mysql/my.cnf
user=mysql
sudo service mysql restart
8. Đặt mật khẩu cho tài khoản root
Việc cài đặt MySQL thông qua một shell tương tác trong các bản phân phối Linux dựa trên Debian sẽ tạo tài khoản người dùng root và yêu cầu bạn đặt mật khẩu. Tuy nhiên, điều này không xảy ra trong quá trình cài đặt shell không tương tác và các bản phân phối dựa trên Red-Hat. Như đã nêu ở trên, người dùng không phải root của máy Linux có thể truy cập tài khoản người dùng root mysql bằng cách sử dụng tùy chọn -user=root. Bạn có thể tránh điều đó bằng cách đặt mật khẩu như sau:
sudo mysqladmin password
vim /etc/mysql/my.cnf
password=<your_password>
sudo service mysql restart
9. Đảm bảo mã hóa dữ liệu khi truyền và khi nghỉ
Giao tiếp không được mã hóa mặc định giữa máy khách và máy chủ có nguy cơ bị chặn dữ liệu bởi bất kỳ kẻ trung gian nào. Tương tự, dữ liệu người dùng không được mã hóa trong cơ sở dữ liệu sẽ gây rủi ro cho tính bảo mật và tính toàn vẹn của người dùng. MySQL hỗ trợ mã hóa dữ liệu giữa máy khách và máy chủ qua giao thức TLS/SSL, trong khi giao tiếp không được mã hóa chỉ được chấp nhận khi cả hai bên giao tiếp nằm trong cùng một mạng.
MySQL hiện hỗ trợ mã hóa khi dữ liệu nghỉ (at rest) để bảo vệ dữ liệu được lưu trữ trên máy chủ ngay cả khi hệ thống bị vi phạm.
Bảo mật nâng cao MySQL: Bảo vệ chính bạn
Bài viết này đã cung cấp cho bạn một số gợi ý hữu ích để có mức độ bảo mật trực tuyến cao nhất. Các bước trên rất hữu ích để bảo mật máy chủ cơ sở dữ liệu của bạn, nhưng việc học cách gán các quyền tối thiểu cho người dùng không phải quản trị viên cũng rất cần thiết.
Tìm hiểu ngay chương trình học công nghệ thông tin trực tuyến tại FUNiX ở đây:
Vân Nguyễn
Dịch từ: https://www.makeuseof.com/mysql-advanced-security-tips/










Bình luận (0
)