Cách đảm bảo cơ sở dữ liệu MySQL của bạn được bảo mật

Kiểm tra và ghi nhật ký hệ thống thông tin

Nhật ký đóng một vai trò quan trọng đối với vấn đề bảo mật khi có một cuộc tấn công mạng bị nghi ngờ. Việc xem xét nhật ký theo cách thủ công là một công việc khó khăn đối với nhân viên an ninh và họ phải sử dụng các công cụ xem xét nhật ký để trích xuất thông tin và phân tích nó. Nhật ký nên sử dụng công nghệ lưu trữ và mã hóa WORM (ghi một lần đọc nhiều) để tránh hỏng và mất dữ liệu nhật ký. Ngoài ra, nhật ký phải có định dạng chuẩn hóa để dễ bảo trì, truy cập và so sánh.

Đảm bảo “log_error” không trống

lệnh:

SHOW variables LIKE ‘log_error’;

Nhật ký lỗi chứa dữ liệu về các sự kiện khi mysqld khởi động hoặc dừng. Nó cũng cho thấy khi nào một table cần được đánh giá hoặc sửa chữa. Nó phải tạo ra một “giá trị”. Lý do cho phép ghi nhật ký lỗi là vì nó giúp tăng khả năng phát hiện các nỗ lực độc hại chống lại MySQL và các thông báo quan trọng khác.

Đảm bảo tệp nhật ký được lưu trữ trên phân vùng không thuộc hệ thống

lệnh:

SELECT @@global.log_bin_basename;

Các tệp nhật ký của MySQL có thể được lưu trữ ở bất kỳ đâu trong hệ thống tệp và được thiết lập bằng cấu hình MySQL. Ngoài ra, cách tốt nhất là đảm bảo rằng nhật ký trong hệ thống tệp không bị lộn xộn với các nhật ký khác như nhật ký ứng dụng. Bạn phải đảm bảo rằng giá trị được trả về không chỉ ra rằng nó nằm trong thư mục gốc “(‘/’)”, “/var”, hoặc “/usr”. Lý do cho điều này là việc phân vùng sẽ làm giảm khả năng bị từ chối dịch vụ nếu dung lượng đĩa trống dành cho hệ điều hành bị cạn.

Đảm bảo “log_error_verbosity” không được đặt thành “1”

lệnh:

SHOW GLOBAL VARIABLES LIKE ‘log_error_verbosity’;

Kiểm tra này cung cấp thông tin bổ sung về những chức năng mà nhật ký MySQL có hoặc đã bật trên các thông báo lỗi. Giá trị 1 cho phép ghi nhật ký các thông báo lỗi. Giá trị 2 cho phép ghi cả thông báo lỗi và cảnh báo. Giá trị 3 cho phép ghi lại các thông báo lỗi, cảnh báo và ghi chú. Điều này giúp phát hiện hành vi nguy hiểm bằng cách ghi lại lỗi giao tiếp và kết nối bị hủy bỏ.

Đảm bảo ghi nhật ký kiểm tra được bật

Việc bật ghi nhật ký kiểm tra là rất quan trọng đối với môi trường sản xuất cho các phiên người dùng tương tác và phiên ứng dụng. Với tính năng ghi nhật ký kiểm tra, nó giúp xác định ai đã thay đổi nội dung gì và khi nào. Nó cũng có thể giúp xác định những gì kẻ tấn công đã làm và thậm chí có thể được sử dụng làm bằng chứng trong các cuộc điều tra.

lệnh:

SELECT NAME FROM performance_schema.setup_instruments WHERE NAME LIKE ‘%/alog/%’;
SHOW GLOBAL STATUS LIKE 'AUDIT_version';
SHOW PLUGINS;

lệnh:

SET GLOBAL general_log = ‘ON’;

Xác thực cho hệ thống thông tin

Xác thực đảm bảo thông tin xác thực do người dùng hoặc máy cung cấp khớp với cơ sở dữ liệu của người dùng được ủy quyền trong hệ điều hành cục bộ hoặc trong máy chủ xác thực. Sau đó, xác thực sẽ được thực hiện bằng ủy quyền do quản trị viên cấp cho người dùng hoặc máy. Xác thực thường được sử dụng trong cả mạng riêng và mạng công cộng là xác thực dựa trên mật khẩu.

Đảm bảo mật khẩu không được lưu trữ trong cấu hình chung

Phần [client] của tệp cấu hình MySQL cho phép tạo người dùng và mật khẩu. Việc kiểm tra này rất quan trọng vì việc cho phép người dùng và mật khẩu trong tệp cấu hình sẽ tác động tiêu cực đến tính bảo mật của mật khẩu của người dùng.

Để kiểm tra, hãy mở tệp cấu hình MySQL và kiểm tra phần [client] – nó không được lưu trữ bất kỳ mật khẩu nào. Không có mật khẩu nào được đặt trong hệ thống của tác giả (xem hình bên dưới). Nếu mật khẩu được đặt trong tệp cấu hình, hãy sử dụng mysql_config_editor để lưu trữ mật khẩu ở dạng mã hóa trong .mylogin.cnf.

Đảm bảo ‘sql_mode’ chứa ‘NO_AUTO_CREATE_USER’

“no_auto_create_user” là một tùy chọn để ngăn chặn việc tự động tạo người dùng khi thông tin xác thực không được cung cấp.

lệnh:

SELECT @@global.sql_mode;

lệnh:

SELECT @@session.sql_mode;

Đảm bảo mật khẩu được đặt cho tất cả tài khoản MySQL

Người dùng có thể tạo một mật khẩu trống. Việc sử dụng mật khẩu trống sẽ rất rủi ro vì bất kỳ ai cũng có thể giả định danh tính của người dùng, nhập ID đăng nhập của người dùng và kết nối với máy chủ. Điều này bỏ qua xác thực, đó là xấu.

lệnh:

SELECT User,host FROM mysql.user WHERE authentication_string='';

Đảm bảo ‘default_password_lifetime’ nhỏ hơn hoặc bằng ’90’

Việc thay đổi thời hạn sử dụng của mật khẩu thành 90 ngày sẽ giảm thời gian kẻ tấn công có thể xâm phạm mật khẩu và do đó giảm khả năng bị tấn công.

lệnh:

SHOW VARIABLES LIKE ‘default_password_lifetime’;

lệnh:

SET GLOBAL default_password_lifetime=90;

Đảm bảo độ phức tạp của mật khẩu được áp dụng

Độ phức tạp của mật khẩu sẽ tăng thêm sức mạnh bảo mật cho xác thực và bao gồm việc thêm hoặc tăng độ dài, chữ hoa, số và ký tự đặc biệt. Mật khẩu càng phức tạp thì kẻ tấn công càng khó sử dụng vũ lực để lấy được mật khẩu. Mật khẩu yếu có thể dễ dàng lấy được trong từ điển mật khẩu.

lệnh:

SHOW VARIABLES LIKE ‘validate_password%’;

Đảm bảo không có người dùng nào có tên máy chủ ký tự đại diện

Người dùng có tên máy chủ ký tự đại diện (%) được cấp quyền truy cập vào bất kỳ vị trí nào. Tốt nhất là tránh tạo tên máy chủ có ký tự đại diện. Thay vào đó, hãy tạo người dùng và cung cấp cho họ các vị trí cụ thể mà từ đó người dùng nhất định có thể kết nối và tương tác với cơ sở dữ liệu.

lệnh:

SELECT user, host FROM mysql.user WHERE host = ‘%’;

Đảm bảo không có tài khoản ẩn danh nào tồn tại

Người dùng có thể có tên người dùng ẩn danh (trống hoặc trống). Những tên người dùng ẩn danh này không có mật khẩu và bất kỳ người dùng nào khác đều có thể sử dụng tên người dùng ẩn danh đó để kết nối với máy chủ MySQL. Việc xóa các tài khoản ẩn danh này đảm bảo chỉ những người dùng được xác định và đáng tin cậy mới có thể truy cập máy chủ MySQL.

lệnh:

SELECT user,host FROM mysql.user WHERE user = ‘’;

Kết nối mạng với máy chủ MySQL

Kết nối mạng đóng vai trò quan trọng trong giao tiếp giữa người dùng và máy chủ MySQL. Kết nối mạng không an toàn rất dễ bị tấn công. Sau đây là các kiểm tra về bảo mật kết nối mạng.

Đảm bảo ‘have_ssl’ được đặt thành ‘Yes’

Để tránh những kẻ tấn công độc hại nhìn trộm bên trong hệ thống của bạn, tốt nhất nên sử dụng SLL/TLS cho tất cả lưu lượng truy cập mạng khi sử dụng mạng không đáng tin cậy.

lệnh:

WHERE variable_name = ‘have_ssl’;

Đảm bảo ‘ssl_type’ được đặt thành ‘ANY‘, ‘X509’ hoặc ‘SPECIFIED‘ cho tất cả người dùng từ xa

SSL/TLS phải được cấu hình cho mỗi người dùng. Điều này tiếp tục ngăn chặn việc nghe lén của những kẻ tấn công độc hại.

lệnh:

SELECT user, host, ssl_type FROM mysql.user WHERE NOT HOST IN (‘::1’, ‘127.0.0.1’, ‘localhost’);

Nhân rộng

Việc kiểm tra trạng thái sao chép cho phép bạn giám sát các lỗ hổng bảo mật và hiệu suất. Microsoft SQL Server Management Studio có các công cụ sau để giám sát việc sao chép:

  1. xem trạng thái đại lý chụp nhanh,
  2. xem trạng thái tác nhân đọc nhật ký và
  3. xem trạng thái đồng bộ hóa.

Đảm bảo lưu lượng sao chép được bảo mật

Lưu lượng sao chép giữa các máy chủ phải được bảo mật. Trong quá trình chuyển bản sao, mật khẩu có thể bị rò rỉ.

Để kiểm tra, hãy kiểm tra xem họ có đang sử dụng: mạng riêng, VPN, SSL/TLS hay Đường hầm SSH hay không. Hy vọng hệ thống của tác giả đang sử dụng mạng riêng. Hãy sửa nếu không thì hãy bảo mật bằng cách sử dụng mạng riêng, VPN, SSL/TLS hoặc Đường hầm SSH.

Đảm bảo ‘MASTER_SSL_VERIFY_SERVER_CERT’ được đặt thành ‘YES’ hoặc ‘1’

‘MASTER_SSL_VERIFY_SERVER_CERT’ kiểm tra xem bản sao có nên xác minh chứng chỉ của chính hay không. Bản sao phải xác minh chứng chỉ của chính để xác thực chính trước khi tiếp tục kết nối.

lệnh:

SELECT ssl_verify_server_cert FROM mysql.slave_master_info;

Đảm bảo ‘master_info_repository’ được đặt thành ‘TABLE

‘master_info_repository’ xác định nơi bản sao ghi lại thông tin kết nối và trạng thái của chính. Mật khẩu được lưu trữ trong kho thông tin chính là một tệp văn bản thuần túy. Lưu trữ mật khẩu trong TABLE master_info sẽ an toàn hơn.

lệnh:

SHOW GLOBAL VARIABLES LIKE ‘master_info_repository’;

Đảm bảo ‘super_priv’ không được đặt thành ‘Y’ cho người dùng sao chép

Đặc quyền “SUPER” (‘super_priv’) nằm trong bảng “mysql.user” có các chức năng như “CHANGE”, “MASTER TO”, “KILL”, “mysqladmin kill”, “PURGE BINARY LOGS”, “SET GLOBAL” , “gỡ lỗi mysqladmin” và các điều khiển ghi nhật ký khác. Trao cho người dùng đặc quyền “SIÊU” cho phép người dùng xem và chấm dứt các câu lệnh SQL hiện đang thực thi, ngay cả đối với việc quản lý mật khẩu. Nếu kẻ tấn công khai thác và giành được đặc quyền “SIÊU”, chúng có thể vô hiệu hóa, thay đổi hoặc phá hủy dữ liệu ghi nhật ký.

lệnh:

SELECT user, host FROM mysql.user WHERE user=’repl’ and Super_priv = ‘Y’;

Đảm bảo không có người dùng sao chép nào có tên máy chủ ký tự đại diện

MySQL cho phép bạn cấp quyền cho tên máy chủ có ký tự đại diện. Nên tránh sử dụng tên máy chủ có ký tự đại diện và bạn nên tạo hoặc sửa đổi người dùng cũng như cung cấp cho họ các vị trí cụ thể mà từ đó một người dùng nhất định có thể kết nối và tương tác với cơ sở dữ liệu.

Phần kết luận

Các bước kiểm tra sau đây được thực hiện cho một môi trường làm việc duy nhất sử dụng MySQL làm hệ thống thông tin ở cả phía ứng dụng và phía người dùng.

Đánh giá này là bắt buộc để kiểm tra tính năng ghi nhật ký tiêu chuẩn của MySQL và kích hoạt các chức năng ghi nhật ký bổ sung (nó cũng cho phép kiểm tra các lỗ hổng xác thực). Kiểm tra mạng rất quan trọng để ngăn chặn những người dùng khác có mục đích xấu nhìn trộm vào mạng của bạn. Luôn triển khai SSL/TLS để mã hóa. Đảm bảo chuyển giao một chiều là cần thiết. Đảm bảo lưu lượng truy cập nhân rộng sẽ thêm một lớp phòng thủ.

Kết quả đánh giá có thể cho bạn biết liệu hệ thống có thể hoạt động ở mức độ tin cậy hay không.