Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

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

Một số thông tin cơ bản trước khi chúng tôi bắt đầu:

Nguồn:Máy chủ cộng đồng Oracle MySQL của Trung tâm Bảo mật Internet (CIS) 5.7

Hệ điều hành: Windows 10

Nơi thực hiện: dòng lệnh

mysql -u USERNAME -p

Ứng dụng mục tiêu: Máy chủ cộng đồng Oracle MySQL 5.7

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

Nhật ký đóng một vai trò quan trọng đối với bảo mật khi nghi ngờ có cuộc tấn công mạng. Việc xem xét thủ công nhật ký là 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ữ WORM (ghi một lần đọc nhiều) và mã hóa để tránh bị 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 bắt đầu hoặc dừng. Nó cũng cho thấy khi nào một bảng 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à 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 các tệp nhật ký được lưu trữ trên một 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ách sử dụng cấu hình MySQL. Ngoài ra, cách tốt nhất là đảm bảo rằng các 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, chẳng hạn 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 giá trị 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 không gian đĩa khả dụng cho hệ điều hành bị cạn kiệt.

Đả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ề các 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 lại các thông báo lỗi. Giá trị 2 cho phép ghi nhật ký lỗi và thông báo 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 độc hại bằng cách ghi lại các lỗi giao tiếp và các kết nối bị hủy.

Đảm bảo đã bật ghi nhật ký kiểm tra

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 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/%’;

lệnh:

SET GLOBAL general_log = ‘ON’ ;

lệnh: TẠO NGƯỜI DÙNG ‘user1’ @ ’localhost’ ĐƯỢC NHẬN DIỆN BẰNG MẬT KHẨU ‘not-so-secret’;

Đường dẫn của nhật ký trong Windows 10 có thể được tìm thấy bằng cách sử dụng ứng dụng Dịch vụ, xem MySQL có đang chạy hay không và nhấp chuột phải vào thuộc tính.

Nhật ký trong hệ thống của tác giả được đặt tại:C:\ ProgramData \ MySQL \ MySQL Server 5.7 \ Data \ DJ-JASON-CLARK.log

Xác thực 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 được theo sau bởi ủy quyền, được cấp bởi quản trị viên 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 [máy khách] của tệp cấu hình MySQL cho phép tạo người dùng và mật khẩu được đặt. Việc kiểm tra 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ẽ ảnh hưở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 [máy khách] - phần này 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 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ả các tài khoản MySQL

Người dùng có thể tạo một mật khẩu trống. Có một mật khẩu trống rất rủi ro vì bất kỳ ai cũng có thể giả sử 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, điều này không tốt.

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 gian tồn tại của mật khẩu thành 90 ngày làm giảm thời gian có thể để kẻ tấn công 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 đặt ra

Độ phức tạp của mật khẩu tăng thêm sức mạnh bảo mật cho xác thực và bao gồm thêm hoặc tăng độ dài, chữ hoa, số và các ký tự đặc biệt. Mật khẩu càng phức tạp, 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 cho bất kỳ vị trí nào. Tốt nhất là tránh tạo tên máy chủ 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ừ đó 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 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 vào 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 một vai trò quan trọng để giao tiếp giữa người dùng và máy chủ MySQL. Các kết nối mạng không an toàn rất dễ bị tấn công. Sau đây là các bước kiểm tra 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òm ngó 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 mạng khi sử dụng các 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 'CỤ THỂ' cho tất cả người dùng từ xa

SSL / TLS phải được định cấu hình cho mỗi người dùng. Điều này giúp ngăn chặn việc nghe trộm của những kẻ tấn công nguy hiểm.

lệnh:

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

Sao chép

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

  1. xem trạng thái tác nhân chụp nhanh,
  2. xem trạng thái tác nhân của trình đọ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

Nhân rộng lưu lượng 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ọ đang sử dụng:mạng riêng, VPN, SSL / TLS hay Đường hầm SSH. Hy vọng rằng hệ thống của tác giả đang sử dụng mạng riêng. Sửa nếu khác và 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ứng chỉ 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 vị trí bản sao ghi lại trạng thái và thông tin kết nố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 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 nhân rộng

Đặc quyền “SUPER” ('super_priv') nằm trong bảng “mysql.user” có các chức năng như “THAY ĐỔI”, “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. Việc cấp cho người dùng đặc quyền “SUPER” 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ả để quản lý mật khẩu. Nếu kẻ tấn công khai thác và có được đặc quyền “SUPER”, 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 các tên máy chủ ký tự đại diện. Nên tránh các tên máy chủ ký tự đại diện và bạn nên tạo hoặc sửa đổi người dùng và 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.

Kết luận

Các bước kiểm tra sau đượ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.

Việc đánh giá là bắt buộc để kiểm tra việc ghi nhật ký chuẩn của MySQL và bậ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 những người dùng khác có ý đồ xấu dòm vào mạng của bạn. Luôn triển khai SSL / TLS để mã hóa. Bảo mật chuyển một chiều là cần thiết. Bảo mật lưu lượng sao chép 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.

Cảm ơn bạn đã đọc blog của tôi! Bây giờ bạn đã bắt đầu đường dẫn để bảo mật cơ sở dữ liệu MySQL của mình. =)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nhận ngày mới nhất từ ​​dữ liệu MySQL được nhóm

  2. Sự khác biệt giữa Khóa, Khóa chính, Khóa duy nhất và Chỉ mục trong MySQL

  3. Làm việc với các công cụ cơ sở dữ liệu MySQL

  4. Cách xóa người dùng cơ sở dữ liệu MySQL trong cPanel

  5. Độ dài VARCHAR của MySQL và UTF-8