Đặc biệt, những người thử nghiệm thâm nhập mới bắt đầu ít chú trọng hơn đến bảo mật cơ sở dữ liệu nói chung. Ứng dụng không có cấu hình cơ sở dữ liệu và kiểm tra bảo mật không thể an toàn. Bạn có thể đã sử dụng phần mềm MySQL, một hệ thống quản lý cơ sở dữ liệu, vậy làm thế nào bạn có thể làm cho nó an toàn hơn? Dưới đây là bảy bước bạn cần làm theo.
1. Sử dụng đường hầm SSH thay vì kết nối từ xa
Dịch vụ MySQL chạy trên cổng 3306 theo mặc định. Khi bạn cài đặt MySQL, bạn sẽ thấy rằng cổng 3306 đang ở chế độ lắng nghe cho tất cả các kết nối. Như hiện tại, cổng MySQL được mở cho thế giới bên ngoài. Đó là lý do tại sao bạn nên đặt dịch vụ MySQL chỉ nghe địa chỉ cục bộ.
Vì các máy chủ thường chạy trên bản phân phối Linux nên các ví dụ dưới đây dựa trên bản phân phối Debian. Tệp bạn cần sử dụng để tạo đường hầm SSH thay vì kết nối từ xa và để đóng cổng mặc định với thế giới bên ngoài là /etc/mysql/my.cnf. Trong tệp này, bạn cần mở một trường có tên [mysqld] và viết lệnh sau:
[mysqld]
bind-address=127.0.0.1
Sau quá trình này, đừng quên lưu tệp này và khởi động lại dịch vụ bằng lệnh sau:
sudo systemctl restart mysqld
sudo systemctl restart mariadb.service
Với điều này, dịch vụ MySQL sẽ chỉ nghe địa chỉ cục bộ.
Nếu bạn đang sử dụng MariaDB, bạn cũng có thể kiểm tra /etc/mysql/mariadb.conf.d/50-server.cnf và kiểm tra xem có một định nghĩa cho địa chỉ liên kết.
Bây giờ bạn đã đặt địa chỉ liên kết thành 127.0.0.1, là localhost, bạn có thể chạy quét Nmap và kiểm tra đầu ra:
Bạn có thể thấy cổng MySQL là 127.0.0.1 đại diện cho localhost mà bạn nhìn thấy. Bạn có thể thử và thay đổi lại địa chỉ liên kết để đảm bảo điều này hoạt động:
[mysqld]
bind-address=127.5.5.1
Sau đó lưu /etc/mysql/my.cnf tập tin và khởi động lại dịch vụ MySQL. Nếu bạn thực hiện quét lại Nmap ở giai đoạn này, bạn sẽ không thấy địa chỉ liên kết này trên máy chủ cục bộ.
Khi bạn biết điều này hoạt động, hãy quay lại cài đặt từ bước đầu tiên và đặt địa chỉ liên kết trở lại 127.0.0.1 và lưu lại.
2. Thiết lập rào cản truy cập tệp cục bộ
MySQL có thể giao tiếp với hệ thống tệp cục bộ. Với truy vấn, bạn có thể xem nội dung của văn bản trong hệ thống tệp cục bộ hoặc ghi kết quả truy vấn vào đĩa. Để ngăn những kẻ tấn công nguy hiểm sử dụng tính năng này, bạn phải ngăn MySQL giao tiếp với hệ thống tệp cục bộ.
Bạn có thể sử dụng một hàm gọi là local-infile để đề phòng. Ví dụ: hãy tưởng tượng rằng bạn có một tệp có tên “/etc/secretfile.txt” và bạn có mật khẩu trong tệp này. Nếu giá trị của hàm local-infile trong tệp /etc/mysql/my.cnf của bạn là 1 thì quyền truy cập được mở. Vì vậy, bạn có thể truy cập tệp secretfile.txt.
Giá trị của hàm local-infile là 1. Khởi động lại cơ sở dữ liệu MySQL để các thay đổi diễn ra. Bây giờ, hãy kết nối với MySQL bằng lệnh sau và kiểm tra xem bạn có thể xem tệp secretfile.txt hay không:
SELECT LOAD_FILE("/etc/secretfile.txt");
Không khó để nắm bắt thông tin trong bất kỳ tệp nào trên máy tính của bạn.
Để giải quyết vấn đề này, hãy thay đổi giá trị local-infile trong tệp /etc/mysql/my.cnf của bạn như sau:
[mysqld]
local-infile=0
Khởi động lại dịch vụ MySQL. Kết nối lại với MySQL và lặp lại bước trước đó; bạn sẽ không còn có thể xem nội dung tập tin.
Nếu người dùng chưa có quyền đọc và ghi trên các tệp cục bộ, họ sẽ không thể xem tệp này. Tuy nhiên, nó vẫn là thứ bạn nên kiểm tra trong các bài kiểm tra thâm nhập và bảo mật cơ sở dữ liệu.
3. Đặt mật khẩu và người dùng ứng dụng
Người dùng quản lý cơ sở dữ liệu và người dùng MySQL truy cập cơ sở dữ liệu phải khác nhau. Nói cách khác, việc kết nối các ứng dụng với MySQL với người dùng root là cực kỳ nguy hiểm. Nếu có thể, hãy xác định riêng người dùng của các ứng dụng không thực hiện các thao tác CẬP NHẬT hoặc CHÈN.
Một điều khác cần xem xét vào thời điểm này là mật khẩu người dùng. Như trong hầu hết mọi lĩnh vực, mật khẩu cho người dùng MySQL cần phải phức tạp và khó đoán. Nếu bạn cần trợ giúp về vấn đề này, có những hệ thống tạo mật khẩu tuyệt vời mà bạn có thể sử dụng.
4. Xóa người dùng ẩn danh
Khi bạn cài đặt MySQL theo mặc định, một số người dùng ẩn danh sẽ xảy ra. Bạn cần xóa những thứ này và chặn quyền truy cập của họ. Đối với một máy chủ MySQL an toàn, bạn sẽ không nhận được bất kỳ phản hồi nào do truy vấn sau:
SELECT * FROM mysql.user WHERE USER="";
Empty set (0.001 sec)
Nếu có bất kỳ kết quả nào, bạn nên xóa những người dùng ẩn danh này. Ví dụ: nếu có một tài khoản ẩn danh có tên “anonuser” trong môi trường có tên “localhost”, bạn sẽ phải sử dụng một lệnh như sau để xóa tài khoản này:
DROP USER 'anonuser'@'localhost';
5. Kiểm tra quyền truy cập tệp cục bộ của MySQL
Hãy tưởng tượng bạn là quản trị viên cơ sở dữ liệu và bạn muốn quay lại dữ liệu từ một tuần trước. Trong trường hợp này, bạn có thể phải kết nối với máy chủ cơ sở dữ liệu qua SSH và thay đổi các tệp MySQL mà bạn muốn. Trong khi thực hiện việc này, bạn có thể đã sử dụng quyền người dùng gốc của Linux; nghĩa là quyền sở hữu và quyền của các tệp dữ liệu có thể thay đổi. Bạn không muốn điều đó.
Nhìn vào thư mục /var/lib/mysql để kiểm tra các quyền được cấp. Điều bạn cần kiểm tra ở đây là liệu chủ sở hữu của tất cả các tệp có phải là người dùng MySQL hay không. Lệnh sau sẽ thực hiện thủ thuật:
sudo ls -al /var/lib/mysql
Quyền đọc và ghi của các tệp chỉ dành cho người dùng MySQL. Không có người dùng khác nên có bất kỳ quyền.
6. Sử dụng MySQL SSL
Suy nghĩ về một ví dụ cụ thể là cách tốt nhất để hiểu cách sử dụng MySQL và SSL. Hãy tưởng tượng rằng một trong những máy chủ trong khu vực ABC, nơi có nhiều máy chủ khác nhau, bị tin tặc độc hại chiếm đoạt. Hacker sẽ tiến hành quét nội bộ trong vùng ABC. Bằng cách này, họ thu thập thông tin về các máy chủ.
Nếu họ phát hiện máy chủ MySQL trong quá trình này, họ có thể thực hiện tấn công Man-in-the-Middle (MitM) trên máy chủ mục tiêu, nghĩa là họ có thể đánh cắp thông tin phiên của ứng dụng và người dùng kết nối với máy chủ này. Một trong những cách tốt nhất để tránh điều này là kích hoạt SSL trên máy chủ MySQL.
7. Tệp nhật ký và lịch sử
Bạn sử dụng nhật ký MySQL để phân tích và tìm lỗi. Bạn có thể chỉnh sửa nơi lưu giữ các nhật ký này bằng cách nhập my.cnf như sau:
[mysqld]
log =/var/log/mylogfiles
Bạn có thể thay đổi tên hoặc vị trí mylogfiles theo ý muốn. Có một tập tin nữa bạn cần kiểm tra. Khi bạn kết nối với máy chủ MySQL trong thiết bị đầu cuối Linux và nhập các lệnh khác nhau, các truy vấn này sẽ được lưu trong tệp mysql_history. Nếu bạn chạy lệnh sau, bạn có thể thấy các truy vấn bạn đang sử dụng trong thiết bị đầu cuối MySQL:
cat ~/.mysql_history
Bạn cần xóa nội dung của tệp này nếu bạn không muốn cung cấp thông tin về loại truy vấn bạn đang thực hiện bên trong máy chủ. Sử dụng lệnh sau để xóa nội dung của tệp:
sudo echo "cleaned" > ~/.mysql_history
Sau đó, bạn có thể kiểm tra lại nội dung tệp.
Ai sở hữu cơ sở dữ liệu sở hữu hệ thống
Bất kể bạn làm việc trong ngành nào, cơ sở dữ liệu của bạn luôn chứa thông tin quan trọng. Đây có thể là khách hàng, tài khoản ngân hàng và mật khẩu của bạn. Những kẻ tấn công độc hại biết tầm quan trọng và giá trị của chúng. Các nhà phát triển và quản trị viên cơ sở dữ liệu ít nhất cần biết những điều cơ bản mà họ sẽ gặp phải trong các bài kiểm tra thâm nhập để đánh bại tin tặc.