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

Mẹo và Thủ thuật sử dụng Ghi nhật ký kiểm tra cho MariaDB

MariaDB’s Audit Plugin cung cấp chức năng kiểm tra không chỉ cho MariaDB mà còn cả MySQL (kể cả phiên bản 5.5.34 và 10.0.7) và Máy chủ Percona. MariaDB bắt đầu bao gồm Plugin kiểm tra theo mặc định từ các 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.

Mục đích của Trình cắm Kiểm tra MariaDB là ghi lại hoạt động của máy chủ. Đối với mỗi phiên máy khách, nó ghi lại ai đã kết nối với máy chủ (tức là tên người dùng và máy chủ), những truy vấn nào đã được thực thi và bảng nào đã được truy cập và các biến máy chủ đã được thay đổi. Thông tin này được lưu trữ trong tệp nhật ký luân phiên hoặc nó có thể được gửi đến nhật ký hệ thống cục bộ.

Trong bài đăng trên blog này, chúng tôi sẽ chỉ cho bạn một số điều chỉnh và mẹo thực hành tốt nhất về cách định cấu hình ghi nhật ký kiểm tra cho máy chủ MariaDB. Việc viết này dựa trên MariaDB 10.5.9, với phiên bản mới nhất của MariaDB Audit Plugin 1.4.4.

Điều chỉnh Cài đặt

Cách được khuyến nghị để bật ghi nhật ký kiểm tra là đặt các dòng sau bên trong tệp cấu hình MariaDB:

[mariadb]
plugin_load_add = server_audit # load plugin
server_audit=FORCE_PLUS_PERMANENT  # do not allow users to uninstall plugin
server_audit_file_path=/var/log/mysql/mariadb-audit.log # path to the audit log
server_audit_logging=ON  # enable audit logging

Đừng quên đặt "server_audit =FORCE_PLUS_PERMANENT" để thực thi nhật ký kiểm tra và không cho phép người dùng khác gỡ cài đặt bằng câu lệnh UNINSTALL SONAME. Theo mặc định, đích ghi nhật ký là một tệp nhật ký trong thư mục dữ liệu MariaDB. Chúng ta nên đặt nhật ký kiểm tra bên ngoài thư mục này vì có khả năng datadir sẽ bị xóa (SST cho Galera Cluster) hoặc được thay thế để khôi phục vật lý như hoán đổi dữ liệu khi khôi phục bản sao lưu được lấy từ MariaDB Backup.

Cần phải điều chỉnh thêm, như được trình bày trong các phần sau.

Lọc Sự kiện Kiểm tra

MariaDB Audit plugin sử dụng một số cài đặt nhật ký tùy thuộc vào phiên bản plugin. Các sự kiện kiểm tra sau có sẵn trên phiên bản plugin mới nhất 1.4.4:

Loại

Mô tả

KẾT NỐI

Kết nối, ngắt kết nối và kết nối không thành công, bao gồm cả mã lỗi

QUERY

Các truy vấn được thực thi và kết quả của chúng ở dạng văn bản thuần túy, bao gồm cả các truy vấn không thành công do lỗi cú pháp hoặc quyền

BẢNG

Các bảng bị ảnh hưởng bởi việc thực thi truy vấn

QUERY_DDL

Tương tự như QUERY, nhưng chỉ lọc các truy vấn kiểu DDL (các câu lệnh CREATE, ALTER, DROP, RENAME và TRUNCATE - ngoại trừ CREATE / DROP [PROCEDURE / FUNCTION / USER] và RENAME USER (chúng 'không phải là DDL)

QUERY_DML

Tương tự như QUERY, nhưng chỉ lọc các truy vấn kiểu DML (DO, CALL, LOAD DATA / XML, DELETE, INSERT, SELECT, UPDATE, HANDLER và REPLACE các câu lệnh)

QUERY_DML_NO_SELECT

Tương tự như QUERY_DML, nhưng không ghi các truy vấn SELECT. (kể từ phiên bản 1.4.4) (các câu lệnh DO, CALL, LOAD DATA / XML, DELETE, INSERT, UPDATE, HANDLER và REPLACE)

QUERY_DCL

Tương tự như QUERY, nhưng chỉ lọc các truy vấn kiểu DCL (tạo các câu lệnh CREATE USER, DROP USER, RENAME USER, GRANT, REVOKE và SET PASSWORD)

Theo mặc định, nó sẽ theo dõi mọi thứ vì biến server_audit_events sẽ được đặt thành trống theo mặc định. Lưu ý rằng các phiên bản cũ hơn có ít hỗ trợ hơn cho kiểu thao tác trên, như được hiển thị ở đây. Vì vậy, hãy đảm bảo rằng bạn đang chạy trên phiên bản mới nhất nếu bạn muốn thực hiện lọc cụ thể.

Nếu bộ đệm truy vấn được bật và truy vấn được trả về từ bộ đệm truy vấn, sẽ không có bản ghi TABLE nào xuất hiện trong nhật ký vì máy chủ không mở hoặc truy cập bất kỳ bảng nào và thay vào đó dựa vào bộ đệm các kết quả. Vì vậy, bạn có thể muốn tắt bộ nhớ đệm truy vấn.

Để lọc ra các sự kiện cụ thể, hãy đặt dòng sau bên trong tệp cấu hình MariaDB (yêu cầu khởi động lại):

server_audit_events = 'CONNECT,QUERY,TABLE'

Hoặc đặt động trong thời gian chạy bằng SET GLOBAL (không yêu cầu khởi động lại nhưng không liên tục):

MariaDB> SET GLOBAL server_audit_events = 'CONNECT,QUERY,TABLE';

Đây là ví dụ về một sự kiện kiểm tra:

20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,226,QUERY,information_schema,'SHOW GLOBAL VARIABLES',0

Mục nhập của nhật ký này bao gồm một loạt thông tin được phân tách bằng dấu phẩy chứa các thông tin sau:

  • Dấu thời gian

  • Máy chủ MySQL (giống với giá trị của SELECT @@ hostname)

  • Người dùng cơ sở dữ liệu

  • Máy chủ lưu trữ nơi người dùng đang kết nối

  • ID kết nối

  • ID chuỗi

  • Hoạt động

  • Cơ sở dữ liệu

  • Câu lệnh / lệnh SQL

  • Mã trả về. 0 có nghĩa là thao tác trả về phản hồi thành công (thậm chí trống), trong khi giá trị khác 0 có nghĩa là lỗi khi thực hiện thao tác như truy vấn không thành công do lỗi cú pháp hoặc lỗi quyền.

Khi lọc các mục nhập, người ta sẽ thực hiện một thao tác đơn giản và tìm kiếm một mẫu cụ thể:

$ grep -i global /var/lib/mysql/server_audit.log
20210325 04:19:17,ip-172-31-0-44,root,localhost,14,37080,QUERY,,'set global server_audit_file_rotate_now = 1',0
20210326 00:46:48,ip-172-31-0-44,root,localhost,35,329003,QUERY,,'set global server_audit_output_type = \'syslog\'',0

Theo mặc định, tất cả giá trị mật khẩu sẽ được che bằng dấu hoa thị:

20210326 05:39:41,ip-172-31-0-44,root,localhost,52,398793,QUERY,mysql,'GRANT ALL PRIVILEGES ON sbtest.* TO [email protected] IDENTIFIED BY *****',0

Kiểm tra Lọc Người dùng

Nếu bạn theo dõi mọi thứ, bạn có thể sẽ bị người dùng giám sát làm cho trách nhiệm lấy mẫu của họ, như thể hiện trong ví dụ dưới đây:

20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,226,QUERY,information_schema,'SHOW GLOBAL VARIABLES',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,227,QUERY,information_schema,'select @@global.wsrep_provider_options',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,228,QUERY,information_schema,'SHOW SLAVE STATUS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,229,QUERY,information_schema,'SHOW MASTER STATUS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,230,QUERY,information_schema,'SHOW SLAVE HOSTS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,231,QUERY,information_schema,'SHOW GLOBAL VARIABLES',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,232,QUERY,information_schema,'select @@global.wsrep_provider_options',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,233,QUERY,information_schema,'SHOW SLAVE STATUS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,234,QUERY,information_schema,'SHOW MASTER STATUS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,7,235,QUERY,information_schema,'SHOW SLAVE HOSTS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,5,236,QUERY,information_schema,'SET GLOBAL SLOW_QUERY_LOG=0',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,5,237,QUERY,information_schema,'FLUSH /*!50500 SLOW */ LOGS',0
20210325 02:02:08,ip-172-31-0-44,cmon,172.31.1.119,6,238,QUERY,information_schema,'SHOW GLOBAL STATUS',0

Trong khoảng thời gian một giây, chúng tôi có thể thấy 14 sự kiện QUERY được ghi lại bởi plugin kiểm tra cho người dùng giám sát của chúng tôi có tên "cmon". Trong khối lượng công việc thử nghiệm của chúng tôi, tốc độ ghi nhật ký là khoảng 32 KB mỗi phút, sẽ tích lũy tối đa 46 MB mỗi ngày. Tùy thuộc vào kích thước lưu trữ và dung lượng IO, điều này có thể quá mức trong một số khối lượng công việc. Vì vậy, sẽ tốt hơn nếu lọc ra người dùng giám sát khỏi nhật ký kiểm tra, để chúng tôi có thể có kết quả đầu ra rõ ràng hơn và dễ dàng hơn trong việc kiểm tra và phân tích.

Tùy thuộc vào chính sách bảo mật và kiểm tra, chúng tôi có thể lọc ra người dùng không mong muốn như người dùng giám sát bằng cách sử dụng biến sau bên trong tệp cấu hình MariaDB (yêu cầu khởi động lại):

server_audit_excl_users='cmon'

Hoặc đặt động trong thời gian chạy bằng SET GLOBAL (không yêu cầu khởi động lại nhưng không liên tục):

MariaDB> SET GLOBAL server_audit_excl_users = 'cmon'

Bạn có thể thêm nhiều người dùng cơ sở dữ liệu, được phân tách bằng dấu phẩy. Sau khi thêm phần trên, chúng tôi đã có nhật ký kiểm tra rõ ràng hơn, như bên dưới (không còn gì từ người dùng 'cmon' nữa):

$ tail -f /var/log/mysql/mysql-audit.log
20210325 04:16:06,ip-172-31-0-44,cmon,172.31.1.119,6,36218,QUERY,information_schema,'SHOW GLOBAL STATUS',0
20210325 04:16:06,ip-172-31-0-44,root,localhost,13,36219,QUERY,,'set global server_audit_excl_users = \'cmon\'',0
20210325 04:16:09,ip-172-31-0-44,root,localhost,13,36237,QUERY,,'show global variables like \'%server_audit%\'',0
20210325 04:16:12,ip-172-31-0-44,root,localhost,13,0,DISCONNECT,,,0

Quản lý Xoay vòng Nhật ký

Vì nhật ký kiểm tra sẽ ghi lại một số lượng lớn các sự kiện, bạn nên định cấu hình xoay vòng nhật ký thích hợp cho nó. Nếu không, chúng ta sẽ có một kích thước khổng lồ của tệp logfile khiến việc phân tích rất khó khăn. Trong khi máy chủ đang chạy và server_audit_output_type =file, chúng ta có thể buộc xoay logfile bằng cách sử dụng câu lệnh sau:

MariaDB> SET GLOBAL server_audit_file_rotate_now = 1;

Để xoay vòng nhật ký tự động, chúng ta nên đặt các biến sau bên trong tệp cấu hình MariaDB:

server_audit_file_rotate_size=1000000 # in bytes
server_audit_file_rotations=30

Hoặc đặt động trong thời gian chạy bằng SET GLOBAL (không yêu cầu khởi động lại):

MariaDB> SET GLOBAL server_audit_file_rotate_size=1000000;
MariaDB> SET GLOBAL server_audit_file_rotations=30;

Để tắt xoay nhật ký kiểm tra, chỉ cần đặt server_audit_file_rotations thành 0. Giá trị mặc định là 9. Việc xoay nhật ký sẽ tự động xảy ra sau khi đạt đến ngưỡng được chỉ định và sẽ giữ nguyên 30 nhật ký cuối cùng, có nghĩa là ghi nhật ký kiểm tra giá trị trong 30 ngày qua.

Kiểm tra bằng Syslog hoặc Rsyslog Facility

Sử dụng cơ sở nhật ký hệ thống hoặc rsyslog sẽ giúp quản lý nhật ký dễ dàng hơn vì nó cho phép ghi nhật ký từ các loại hệ thống khác nhau trong một kho lưu trữ trung tâm. Thay vì duy trì một thành phần ghi nhật ký khác, chúng tôi có thể hướng dẫn Kiểm toán MariaDB đăng nhập vào nhật ký hệ thống. Điều này rất hữu ích nếu bạn có bộ thu thập / phát trực tuyến nhật ký cho các dịch vụ phân tích nhật ký như Splunk, LogStash, Loggly hoặc Amazon CloudWatch.

Để thực hiện việc này, hãy đặt các dòng sau bên trong tệp cấu hình MariaDB (yêu cầu khởi động lại):

server_audit_logging = 'syslog'
server_audit_syslog_ident = 'mariadb-audit'

Hoặc nếu bạn muốn thay đổi trong thời gian chạy (không yêu cầu khởi động lại nhưng không liên tục):

MariaDB> SET GLOBAL server_audit_logging = 'syslog';
MariaDB> SET GLOBAL server_audit_syslog_ident = 'mariadb-audit';

Các mục nhập sẽ tương tự như định dạng Syslog:

$ grep mariadb-audit /var/log/syslog
Mar 26 00:48:49 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,36,329540,QUERY,,'SET GLOBAL server_audit_syslog_ident = \'mariadb-audit\'',0
Mar 26 00:48:54 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,36,0,DISCONNECT,,,0

Nếu bạn muốn thiết lập dịch vụ ghi nhật ký từ xa cho kho lưu trữ ghi nhật ký tập trung, chúng ta có thể sử dụng rsyslog. Mẹo là sử dụng biến server_audit_syslog_facility nơi chúng tôi có thể tạo bộ lọc để tạo điều kiện ghi nhật ký, tương tự như bên dưới:

MariaDB> SET GLOBAL server_audit_logging = 'syslog';
MariaDB> SET GLOBAL server_audit_syslog_ident = 'mariadb-audit';
MariaDB> SET GLOBAL server_audit_syslog_facility = 'LOG_LOCAL6';

Tuy nhiên, có một số bước điều kiện tiên quyết trước đó. Hãy xem xét kiến ​​trúc sao chép chủ-nô lệ MariaDB sau với máy chủ rsyslog tập trung:

Trong ví dụ này, tất cả các máy chủ đang chạy trên Ubuntu 20.04. Trên máy chủ đích rsyslog, chúng ta cần thiết lập những điều sau bên trong /etc/rsyslog.conf:

module(load="imtcp")
input(type="imtcp" port="514")
$ModLoad imtcp
$InputTCPServerRun 514
if $fromhost-ip=='172.31.0.44' then /var/log/mariadb-centralized-audit.log
& ~
if $fromhost-ip=='172.31.0.82' then /var/log/mariadb-centralized-audit.log
& ~

Lưu ý rằng phần "&~" rất quan trọng và đừng bỏ lỡ phần đó. Về cơ bản, nó yêu cầu cơ sở ghi nhật ký đăng nhập vào /var/log/mariadb-centralized-audit.log và ngừng xử lý thêm ngay sau đó.

Tiếp theo, tạo tệp nhật ký đích với quyền sở hữu và quyền tệp chính xác:

$ touch /var/log/mariadb-centralized-audit.log
$ chown syslog:adm /var/log/mariadb-centralized-audit.log
$ chmod 640 /var/log/mariadb-centralized-audit.log

Khởi động lại rsyslog:

$ systemctl restart rsyslog

Đảm bảo rằng nó lắng nghe tất cả các địa chỉ IP có thể truy cập trên cổng TCP 514:

$ netstat -tulpn | grep rsyslog
tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      3143247/rsyslogd
tcp6       0      0 :::514                  :::*                    LISTEN      3143247/rsyslogd

Chúng tôi đã hoàn tất việc định cấu hình máy chủ rsyslog đích. Bây giờ chúng ta đã sẵn sàng để cấu hình phần nguồn. Trên máy chủ MariaDB, tạo một tệp cấu hình rsyslog riêng biệt mới tại /etc/rsyslog.d/50-mariadb-audit.conf và thêm các dòng sau:

$WorkDirectory /var/lib/rsyslog # where to place spool files
$ActionQueueFileName queue1     # unique name prefix for spool files
$ActionQueueMaxDiskSpace 1g     # 1GB space limit (use as much as possible)
$ActionQueueSaveOnShutdown on   # save messages to disk on shutdown
$ActionQueueType LinkedList     # run asynchronously
$ActionResumeRetryCount -1      # infinite retries if rsyslog host is down
local6.* action(type="omfwd" target="172.31.6.200" port="514" protocol="tcp")

Cài đặt trong phần đầu tiên là về việc tạo hàng đợi trên đĩa, được khuyến nghị để không làm mất bất kỳ mục nhập nhật ký nào. Dòng cuối cùng là quan trọng. Chúng tôi đã thay đổi biến server_audit_syslog_facility thành LOG_LOCAL6 cho plugin kiểm tra. Ở đây, chúng tôi đã chỉ định "local6. *" Làm bộ lọc để chỉ chuyển tiếp các mục Syslog sử dụng cơ sở local6 tới rsyslog đang chạy trên máy chủ rsyslog 172.31.6.200, trên cổng 514 qua giao thức TCP.

Để kích hoạt các thay đổi cho rsyslog, bước cuối cùng là khởi động lại rsyslog trên máy chủ MariaDB để kích hoạt các thay đổi:

$ systemctl restart rsyslog

Bây giờ, rsyslog đã được định cấu hình chính xác trên nút nguồn. Chúng tôi có thể kiểm tra bằng cách truy cập máy chủ MariaDB và thực hiện một số hoạt động để tạo các sự kiện kiểm tra. Bạn sẽ thấy các mục nhập nhật ký kiểm tra được chuyển tiếp tại đây:

$ tail -f /var/log/mariadb-centralized-audit.log
Mar 26 12:56:18 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,69,0,CONNECT,,,0
Mar 26 12:56:18 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,69,489413,QUERY,,'select @@version_comment limit 1',0
Mar 26 12:56:19 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,69,489414,QUERY,,'show databases',0
Mar 26 12:56:37 ip-172-31-0-44 mariadb-audit:  ip-172-31-0-44,root,localhost,69,0,DISCONNECT,,,0

Lời kết

MariaDB Audit Plugin có thể được định cấu hình theo nhiều cách để phù hợp với chính sách kiểm tra và bảo mật của bạn. Thông tin kiểm toán có thể giúp bạn khắc phục sự cố về hiệu suất hoặc ứng dụng và cho phép bạn xem chính xác những truy vấn SQL nào đang được xử lý.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cho các thành phần cơ sở dữ liệu của bạn khả dụng cao (HA) thông qua bộ cân bằng tải

  2. Trình điều khiển MariaDB JDBC có bị ảnh hưởng bởi lỗ hổng Log4j không?

  3. MariaDB sắp đến một thành phố gần bạn!

  4. Sử dụng sao chép cụm MySQL Galera để tạo một cụm phân tán theo địa lý:Phần thứ hai

  5. Cách tính tuổi trong MariaDB