Bảo vệ dữ liệu là một trong những khía cạnh quan trọng nhất của việc quản trị cơ sở dữ liệu. Tùy thuộc vào cơ cấu tổ chức, cho dù bạn là nhà phát triển, sysadmin hay DBA, nếu bạn đang quản lý cơ sở dữ liệu sản xuất, bạn phải giám sát dữ liệu để truy cập và sử dụng trái phép. Mục đích của giám sát an ninh là gấp đôi. Một, để xác định hoạt động trái phép trên cơ sở dữ liệu. Và hai, để kiểm tra xem cơ sở dữ liệu và cấu hình của chúng trên cơ sở toàn công ty có tuân thủ các chính sách và tiêu chuẩn bảo mật hay không.
Trong bài viết này, chúng tôi sẽ chia giám sát an ninh thành hai loại. Một sẽ liên quan đến việc kiểm toán các hoạt động của cơ sở dữ liệu MySQL và MariaDB. Danh mục thứ hai sẽ là giám sát các phiên bản của bạn để tìm các lỗ hổng bảo mật tiềm ẩn.
Giám sát dựa trên chính sách truy vấn và kết nối
Kiểm tra liên tục là một nhiệm vụ cấp thiết để theo dõi môi trường cơ sở dữ liệu của bạn. Bằng cách kiểm tra cơ sở dữ liệu của mình, bạn có thể đạt được trách nhiệm giải trình cho các hành động được thực hiện hoặc nội dung được truy cập. Hơn nữa, cuộc kiểm toán có thể bao gồm một số thành phần hệ thống quan trọng, chẳng hạn như các thành phần liên quan đến dữ liệu tài chính để hỗ trợ một bộ quy định chính xác như SOX hoặc quy định GDPR của EU. Thông thường, nó đạt được bằng cách ghi thông tin về các hoạt động DB trên cơ sở dữ liệu vào một tệp nhật ký bên ngoài.
Theo mặc định, kiểm tra trong MySQL hoặc MariaDB bị tắt. Bạn và đạt được nó bằng cách cài đặt các plugin bổ sung hoặc bằng cách nắm bắt tất cả các truy vấn với tham số query_log. Tệp nhật ký truy vấn chung là một bản ghi chung về những gì MySQL đang hoạt động. Máy chủ ghi lại một số thông tin vào nhật ký này khi máy khách kết nối hoặc ngắt kết nối và nó ghi lại từng câu lệnh SQL nhận được từ máy khách. Do các vấn đề về hiệu suất và thiếu các tùy chọn cấu hình, nên general_log không phải là giải pháp tốt cho mục đích kiểm tra bảo mật.
Nếu bạn sử dụng MySQL Enterprise, bạn có thể sử dụng plugin MySQL Enterprise Audit, đây là một phần mở rộng cho phiên bản MySQL độc quyền. Plugin MySQL Enterprise Audit Plugin chỉ khả dụng với MySQL Enterprise, là một sản phẩm thương mại của Oracle. Percona và MariaDB đã tạo các phiên bản mã nguồn mở của riêng họ của plugin kiểm tra. Cuối cùng, plugin McAfee cho MySQL cũng có thể được sử dụng với các phiên bản MySQL khác nhau. Trong bài viết này, chúng tôi sẽ tập trung vào các plugin mã nguồn mở, mặc dù phiên bản Enterprise của Oracle có vẻ là mạnh mẽ và ổn định nhất.
Đặc điểm của Plugin kiểm tra nguồn mở MySQL
Mặc dù các plugin kiểm tra mã nguồn mở thực hiện công việc tương tự như plugin Enterprise của Oracle - chúng tạo ra đầu ra với truy vấn và kết nối cơ sở dữ liệu - có một số khác biệt lớn về kiến trúc.
MariaDB Audit Plugin - MariaDB Audit Plugin hoạt động với MariaDB, MySQL (kể từ phiên bản 5.5.34 và 10.0.7) và Máy chủ Percona. MariaDB bắt đầu bao gồm Trình cắm kiểm tra theo mặc định từ phiên bản 10.0.10 và 5.5.37 và nó có thể được cài đặt trong bất kỳ phiên bản nào từ MariaDB 5.5.20. Đây là plugin duy nhất hỗ trợ Oracle MySQL, Percona Server và MariaDB. Nó có sẵn trên nền tảng Windows và Linux. Các phiên bản bắt đầu từ 1.2 là ổn định nhất và có thể rủi ro khi sử dụng các phiên bản dưới đây trong môi trường sản xuất của bạn.
McAfee MySQL Audit Plugin - Plugin này không sử dụng MySQL Audit API. Nó đã được cập nhật gần đây để hỗ trợ MySQL 5.7. Một số thử nghiệm cho thấy rằng các plugin dựa trên API có thể cung cấp hiệu suất tốt hơn nhưng bạn cần phải kiểm tra nó với môi trường của mình.
Percona Audit Log Plugin - Percona cung cấp giải pháp kiểm tra mã nguồn mở cài đặt với Máy chủ Percona 5.5.37+ và 5.6.17+ như một phần của quá trình cài đặt. So với các plugin mã nguồn mở khác, plugin này có nhiều tính năng đầu ra tiếp cận hơn vì nó xuất ra XML, JSON và tới nhật ký hệ thống.
Vì nó có một số móc nội bộ với máy chủ để tương thích về tính năng với plugin của Oracle, nên nó không có sẵn dưới dạng một plugin độc lập cho các phiên bản MySQL khác.
Cài đặt plugin dựa trên tiện ích mở rộng kiểm tra MariaDB
Việc cài đặt các plugin MySQL mã nguồn mở khá giống nhau đối với các phiên bản MariaDB, Percona và McAfee.
Percona và MariaDB thêm các plugin của chúng như một phần của tệp nhị phân máy chủ mặc định, vì vậy không cần phải tải xuống các plugin một cách riêng biệt. Phiên bản Percona chỉ chính thức hỗ trợ bản fork của MySQL nên không có tải xuống trực tiếp từ trang web của nhà cung cấp (nếu bạn muốn sử dụng plugin này với MySQL, bạn sẽ phải tải plugin từ gói máy chủ Percona). Nếu bạn muốn sử dụng plugin MariaDB với các nhánh khác của MySQL, thì bạn có thể tìm thấy nó từ https://downloads.mariadb.com/Audit-Plugin/MariaDB-Audit-Plugin/. Plugin McAfee có sẵn tại https://github.com/mcafee/mysql-audit/wiki/Installation.
Trước khi bắt đầu cài đặt plugin, bạn có thể kiểm tra xem plugin có trong hệ thống hay không. Bạn có thể kiểm tra vị trí của plugin động (không yêu cầu khởi động lại phiên bản) bằng:
SHOW GLOBAL VARIABLES LIKE 'plugin_dir';
+---------------+--------------------------+
| Variable_name | Value |
+---------------+--------------------------+
| plugin_dir | /usr/lib64/mysql/plugin/ |
+---------------+--------------------------+
Kiểm tra thư mục được trả về ở cấp hệ thống tệp để đảm bảo bạn có bản sao của thư viện plugin. Nếu bạn không có server_audit.so hoặc server_audit.dll bên trong / usr / lib64 / mysql / plugin /, thì nhiều khả năng phiên bản MariaDB của bạn không được hỗ trợ và nên nâng cấp lên phiên bản mới nhất ..
Cú pháp để cài đặt plugin MariaDB là:
INSTALL SONAME 'server_audit';
Để kiểm tra các plugin đã cài đặt, bạn cần chạy:
SHOW PLUGINS;
MariaDB [(none)]> show plugins;
+-------------------------------+----------+--------------------+--------------------+---------+
| Name | Status | Type | Library | License |
+-------------------------------+----------+--------------------+--------------------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| mysql_old_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| wsrep | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| CLIENT_STATISTICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INDEX_STATISTICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| TABLE_STATISTICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| USER_STATISTICS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
...
| INNODB_MUTEXES | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_SYS_SEMAPHORE_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_TABLESPACES_ENCRYPTION | ACTIVE | INFORMATION SCHEMA | NULL | BSD |
| INNODB_TABLESPACES_SCRUBBING | ACTIVE | INFORMATION SCHEMA | NULL | BSD |
| Aria | ACTIVE | STORAGE ENGINE | NULL | GPL |
| SEQUENCE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| user_variables | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| FEEDBACK | DISABLED | INFORMATION SCHEMA | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
| SERVER_AUDIT | ACTIVE | AUDIT | server_audit.so | GPL |
+-------------------------------+----------+--------------------+--------------------+---------+
Nếu bạn cần thêm thông tin, hãy kiểm tra bảng PLUGINS trong cơ sở dữ liệu information_schema chứa thông tin chi tiết hơn.
Một cách khác để cài đặt plugin là bật plugin trong my.cnf và khởi động lại phiên bản. Ví dụ về cấu hình plugin kiểm tra cơ bản từ MariaDB có thể là:
server_audit_events=CONNECT
server_audit_file_path=/var/log/mysql/audit.log
server_audit_file_rotate_size=1073741824
server_audit_file_rotations=8
server_audit_logging=ON
server_audit_incl_users=
server_audit_excl_users=
server_audit_output_type=FILE
server_audit_query_log_limit=1024
Cài đặt trên nên được đặt trong my.cnf. Trình cắm kiểm tra sẽ tạo tệp /var/log/mysql/audit.log sẽ xoay trên kích thước 1GB và sẽ có tám lần xoay cho đến khi tệp được ghi đè. Tệp sẽ chỉ chứa thông tin về các kết nối.
Hiện tại, có mười sáu cài đặt mà bạn có thể sử dụng để điều chỉnh plugin kiểm tra MariaDB.
server_audit_events
server_audit_excl_users
server_audit_file_path
server_audit_file_rotate_now
server_audit_file_rotate_size
server_audit_file_rotations
server_audit_incl_users
server_audit_loc_info
server_audit_logging
server_audit_mode
server_audit_output_type
Server_audit_query_log_limit
server_audit_syslog_facility
server_audit_syslog_ident
server_audit_syslog_info
server_audit_syslog_priority
Trong số đó, bạn có thể tìm thấy các tùy chọn để bao gồm hoặc loại trừ người dùng, đặt các sự kiện ghi nhật ký khác nhau (CONNECT hoặc QUERY) và chuyển đổi giữa tệp và nhật ký hệ thống.
Để đảm bảo plugin sẽ được bật khi khởi động máy chủ, bạn phải đặt
plugin_load =server_audit =server_audit.so trong cài đặt my.cnf của mình. Cấu hình như vậy có thể được bảo vệ bổ sung bởi server_audit =FORCE_PLUS_PERMANENT, thao tác này sẽ tắt tùy chọn gỡ cài đặt plugin.
UNINSTALL PLUGIN server_audit;
ERROR 1702 (HY000):
Plugin 'server_audit' is force_plus_permanent and can not be unloaded
Dưới đây là một số mục nhập mẫu được tạo bởi plugin kiểm toán MariaDB:
20180817 20:00:01,slave,cmon,cmon,31,0,DISCONNECT,information_schema,,0
20180817 20:47:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,,0
20180817 20:47:02,slave,cmon,cmon,19,0,DISCONNECT,information_schema,,0
20180817 20:47:02,slave,cmon,cmon,18,0,DISCONNECT,information_schema,,0
20180819 17:19:19,slave,cmon,cmon,12,0,CONNECT,information_schema,,0
20180819 17:19:19,slave,root,localhost,13,0,FAILED_CONNECT,,,1045
20180819 17:19:19,slave,root,localhost,13,0,DISCONNECT,,,0
20180819 17:19:20,slave,cmon,cmon,14,0,CONNECT,mysql,,0
20180819 17:19:20,slave,cmon,cmon,14,0,DISCONNECT,mysql,,0
20180819 17:19:21,slave,cmon,cmon,15,0,CONNECT,information_schema,,0
20180819 17:19:21,slave,cmon,cmon,16,0,CONNECT,information_schema,,0
20180819 19:00:01,slave,cmon,cmon,17,0,CONNECT,information_schema,,0
20180819 19:00:01,slave,cmon,cmon,17,0,DISCONNECT,information_schema,,0
Báo cáo thay đổi giản đồ
Nếu bạn chỉ cần theo dõi các thay đổi DDL, bạn có thể sử dụng Báo cáo hoạt động ClusterControl về Thay đổi lược đồ. Báo cáo phát hiện thay đổi lược đồ hiển thị bất kỳ thay đổi DDL nào trên cơ sở dữ liệu của bạn. Chức năng này yêu cầu một tham số bổ sung trong tệp cấu hình ClusterControl. Nếu điều này không được đặt, bạn sẽ thấy thông tin sau:schema_change_detection_address chưa được đặt trong /etc/cmon.d/cmon_1.cnf. Khi điều đó được thực hiện, đầu ra ví dụ có thể giống như dưới đây:
Nó có thể được thiết lập với một lịch biểu và các báo cáo được gửi qua email cho người nhận.
ClusterControl:Báo cáo hoạt động theo lịch trìnhĐánh giá bảo mật cơ sở dữ liệu MySQL
Kiểm tra nâng cấp gói
Đầu tiên, chúng ta sẽ bắt đầu với việc kiểm tra an ninh. Cập nhật các bản vá lỗi MySQL sẽ giúp giảm thiểu rủi ro liên quan đến các lỗ hổng đã biết có trong máy chủ MySQL. Bạn có thể cập nhật môi trường của mình bằng cách sử dụng kho lưu trữ gói của nhà cung cấp. Dựa trên thông tin này, bạn có thể tạo báo cáo của riêng mình hoặc sử dụng các công cụ như ClusterControl để xác minh môi trường của bạn và thông báo cho bạn về các bản cập nhật có thể có.
Báo cáo nâng cấp ClusterControl thu thập thông tin từ hệ điều hành và so sánh chúng với các gói có sẵn trong kho lưu trữ. Báo cáo được chia thành bốn phần; nâng cấp tóm tắt, gói cơ sở dữ liệu, gói bảo mật và các gói khác. Bạn có thể nhanh chóng so sánh những gì bạn đã cài đặt trên hệ thống của mình và tìm bản nâng cấp hoặc bản vá được đề xuất.
ClusterControl:Báo cáo nâng cấp ClusterControl:Chi tiết báo cáo nâng cấpĐể so sánh chúng theo cách thủ công, bạn có thể chạy
SHOW VARIABLES WHERE variable_name LIKE "version";
Với các bản tin bảo mật như:
https://www.oracle.com/technetwork/topics/security/alerts-086861.html
https://nvd.nist.gov/view/vuln/search- results? adv_search =true &cves =on &cpe_vendor =cpe% 3a% 2f% 3aoracle &cpe_produ
https://www.percona.com/doc/percona-server/LATEST/release-notes/release-notes_index.html
https://downloads.mariadb.org/mariadb/+releases/
https://www.cvedetails.com/vulnerability-list/vendor_id-12010/Mariadb.html
https:// www. cvedetails.com/vulnerability-list/vendor_id-13000/Percona.html
Hoặc kho của nhà cung cấp:
Trên Debian
sudo apt list mysql-server
Trên RHEL / Centos
yum list | grep -i mariadb-server
Tài khoản Không có Mật khẩu
Mật khẩu trống cho phép người dùng đăng nhập mà không cần sử dụng mật khẩu. MySQL từng đi kèm với một nhóm người dùng được tạo trước, một số người trong số đó có thể kết nối với cơ sở dữ liệu mà không cần mật khẩu hoặc thậm chí tệ hơn là những người dùng ẩn danh. May mắn thay, điều này đã thay đổi trong MySQL 5.7. Cuối cùng, nó chỉ đi kèm với tài khoản gốc sử dụng mật khẩu bạn chọn lúc cài đặt.
Đối với mỗi hàng được trả về từ quy trình kiểm tra, hãy đặt mật khẩu:
SELECT User,host
FROM mysql.user
WHERE authentication_string='';
Ngoài ra, bạn có thể cài đặt plugin xác thực mật khẩu và triển khai chính sách an toàn hơn:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
SHOW VARIABLES LIKE 'default_password_lifetime';
SHOW VARIABLES LIKE 'validate_password%';
Một khởi đầu tốt có thể là:
plugin-load=validate_password.so
validate-password=FORCE_PLUS_PERMANENT
validate_password_length=14
validate_password_mixed_case_count=1
validate_password_number_count=1
validate_password_special_char_count=1
validate_password_policy=MEDIUM
Tất nhiên, các cài đặt này sẽ phụ thuộc vào nhu cầu kinh doanh của bạn.
Giám sát truy cập từ xa
Việc tránh sử dụng các ký tự đại diện trong tên máy chủ sẽ giúp kiểm soát 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.
Bạn nên đảm bảo rằng mọi người dùng chỉ có thể kết nối với MySQL từ các máy chủ cụ thể. Bạn luôn có thể xác định một số mục nhập cho cùng một người dùng, điều này sẽ giúp giảm nhu cầu về các ký tự đại diện.
Thực thi câu lệnh SQL sau để đánh giá khuyến nghị này (đảm bảo không có hàng nào được trả lại):
SELECT user, host FROM mysql.user WHERE host = '%';
Cơ sở dữ liệu thử nghiệm
Cài đặt MySQL mặc định đi kèm với một cơ sở dữ liệu không sử dụng được gọi là thử nghiệm và cơ sở dữ liệu thử nghiệm có sẵn cho mọi người dùng, đặc biệt là những người dùng ẩn danh. Những người dùng như vậy có thể tạo bảng và ghi vào chúng. Điều này có thể tự trở thành một vấn đề - và việc viết sẽ thêm một số chi phí và làm giảm hiệu suất cơ sở dữ liệu. Khuyến nghị rằng cơ sở dữ liệu thử nghiệm bị loại bỏ. Để xác định xem cơ sở dữ liệu thử nghiệm có hiện diện hay không, hãy chạy:
SHOW DATABASES LIKE 'test';
Nếu bạn nhận thấy rằng cơ sở dữ liệu thử nghiệm hiện diện, đây có thể là tập lệnh mysql_secure_installation làm giảm cơ sở dữ liệu thử nghiệm (cũng như các hoạt động liên quan đến bảo mật khác) không được thực thi.
TẢI THÔNG TIN DỮ LIỆU
Nếu cả máy chủ và máy khách đều có khả năng chạy LOAD DATA LOCAL INFILE, máy khách sẽ có thể tải dữ liệu từ tệp cục bộ đến máy chủ MySQL từ xa. Tham số local_infile cho biết liệu các tệp nằm trên máy khách MySQL có thể được tải hoặc được chọn thông qua LOAD DATA INFILE hoặc SELECT local_file hay không.
Điều này, có khả năng, có thể giúp đọc các tệp mà máy khách có quyền truy cập - ví dụ:trên máy chủ ứng dụng, người ta có thể truy cập bất kỳ dữ liệu nào mà máy chủ HTTP có quyền truy cập. Để tránh điều này, bạn cần đặt local-infile =0 trong my.cnf.
Thực thi câu lệnh SQL sau và đảm bảo trường Giá trị được đặt thành TẮT:
SHOW VARIABLES WHERE Variable_name = 'local_infile';
Giám sát không gian bảng không được mã hóa
Bắt đầu từ MySQL 5.7.11, InnoDB hỗ trợ mã hóa dữ liệu cho các bảng được lưu trữ trong không gian bảng tệp trên mỗi bảng. Tính năng này cung cấp mã hóa không ngừng cho các tệp dữ liệu vùng bảng vật lý. Để kiểm tra xem các bảng của bạn đã được mã hóa hay chưa:
mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES
WHERE CREATE_OPTIONS LIKE '%ENCRYPTION="Y"%';
+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| test | t1 | ENCRYPTION="Y" |
+--------------+------------+----------------+
Là một phần của mã hóa, bạn cũng nên xem xét mã hóa nhật ký nhị phân. Máy chủ MySQL ghi nhiều thông tin vào nhật ký nhị phân.
Xác thực kết nối mã hóa
Trong một số thiết lập, cơ sở dữ liệu sẽ không thể truy cập được qua mạng nếu mọi kết nối được quản lý cục bộ, thông qua Unix socket. Trong những trường hợp như vậy, bạn có thể thêm biến "bỏ qua mạng" trong my.cnf. Bỏ qua mạng ngăn MySQL sử dụng bất kỳ kết nối TCP / IP nào và chỉ có thể sử dụng Unix socket trên Linux.
Tuy nhiên, đây là tình huống khá hiếm khi truy cập MySQL qua mạng. Sau đó, bạn cần theo dõi xem các kết nối của mình đã được mã hóa chưa. MySQL hỗ trợ SSL như một phương tiện để mã hóa lưu lượng cả giữa các máy chủ MySQL (sao chép) và giữa các máy chủ và máy khách MySQL. Nếu bạn sử dụng cụm Galera, các tính năng tương tự cũng có sẵn - cả giao tiếp nội bộ và kết nối với máy khách đều có thể được mã hóa bằng SSL. Để kiểm tra xem bạn có sử dụng mã hóa SSL hay không, hãy chạy các truy vấn sau:
SHOW variables WHERE variable_name = 'have_ssl';
select ssl_verify_server_cert from mysql.slave_master_info;
Đó là nó cho bây giờ. Đây không phải là danh sách đầy đủ, hãy cho chúng tôi biết nếu có bất kỳ kiểm tra nào khác mà bạn đang thực hiện hôm nay trên cơ sở dữ liệu sản xuất của mình.