Sự cố production lúc 2 giờ sáng
Vào đầu sự nghiệp của mình, tôi đã từng trải qua một đêm thứ Sáu kinh hoàng khi nhìn chằm chằm vào cơ sở dữ liệu production, nơi 50.000 bản ghi khách hàng bỗng dưng biến mất. Chúng tôi đã khôi phục bản sao lưu trong vòng một giờ, nhưng bí ẩn vẫn còn đó. Không ai biết ai đã thực hiện lệnh xóa, khi nào nó xảy ra, hay làm thế nào nó vượt qua được logic ứng dụng của chúng tôi. Đó là một script lỗi, một nhân viên bất mãn, hay một lập trình viên sơ ý quên điều kiện WHERE?
Các nhật ký (logs) cơ sở dữ liệu tiêu chuẩn rất tốt để bắt lỗi cú pháp hoặc các truy vấn chậm. Tuy nhiên, chúng hiếm khi kể toàn bộ câu chuyện về việc thao túng dữ liệu. Đây là lý do tại sao Audit Logging lại cực kỳ quan trọng. Nó tạo ra một dấu vết pháp lý (forensic trail) cho các sự kiện liên quan đến bảo mật, liên kết mọi lệnh INSERT, UPDATE và DELETE với một người dùng và mốc thời gian cụ thể. Nếu bạn xử lý thông tin nhạy cảm, auditing không phải là một thứ xa xỉ. Đó là yêu cầu bắt buộc đối với các tiêu chuẩn tuân thủ như GDPR, HIPAA hoặc PCI-DSS.
Audit Logging so với Nhật ký tiêu chuẩn
Trước khi đi sâu vào cấu hình, chúng ta cần phân biệt giữa các loại log khác nhau mà cơ sở dữ liệu của bạn tạo ra. Hầu hết các hệ thống đều tạo ra general log và error log, nhưng audit logging có tính chọn lọc và chính xác hơn nhiều. Nó trả lời các câu hỏi cụ thể: “Ai, Cái gì và Khi nào”.
- General Logs: Ghi lại mọi kết nối và truy vấn đơn lẻ. Chúng phình to rất nhanh—đôi khi tăng thêm 10GB hoặc hơn mỗi ngày—và có thể làm giảm hiệu suất hệ thống từ 15-20%.
- Binary Logs (MySQL) / WAL (PostgreSQL): Được thiết kế để sao chép (replication) và phục hồi dữ liệu. Mặc dù chúng chứa các thay đổi dữ liệu, nhưng chúng là các tệp nhị phân và cực kỳ khó đọc đối với con người.
- Audit Logs: Được tối ưu hóa cho bảo mật. Chúng ghi lại các hoạt động truy cập dữ liệu cụ thể và sửa đổi schema mà không gây ra gánh nặng quá lớn như general logging.
Mục tiêu của tôi là giúp bạn xây dựng một hệ thống ghi lại các sự kiện này trong khi vẫn giữ tác động đến hiệu suất cơ sở dữ liệu dưới mức 5%.
Triển khai Audit Logging trong MySQL
Phiên bản MySQL Community thiếu plugin audit tích hợp sẵn; tính năng đó thường dành riêng cho phiên bản Enterprise. May mắn thay, MariaDB Audit Plugin là một giải pháp thay thế mã nguồn mở mạnh mẽ. Nó hoạt động mượt mà với các bản cài đặt MySQL 5.7 và 8.0 tiêu chuẩn.
1. Cài đặt Audit Plugin
Đầu tiên, hãy xác định thư mục plugin của MySQL bằng cách chạy lệnh này trong SQL shell của bạn:
SHOW VARIABLES LIKE 'plugin_dir';
Tải xuống tệp server_audit.so (Linux) hoặc server_audit.dll (Windows) từ kho lưu trữ MariaDB đáng tin cậy và di chuyển nó vào thư mục đó. Sau khi tệp đã được đặt đúng chỗ, hãy kích hoạt nó thông qua console:
INSTALL PLUGIN server_audit SONAME 'server_audit.so';
2. Xác định chính sách Audit
Một plugin đã kích hoạt sẽ không làm gì cho đến khi bạn cấu hình nó. Tôi khuyên bạn nên theo dõi cả DDL (Ngôn ngữ định nghĩa dữ liệu như CREATE/DROP) và DML (Ngôn ngữ thao tác dữ liệu như INSERT/UPDATE). Thêm các cài đặt này vào tệp my.cnf của bạn để đảm bảo chúng vẫn duy trì sau khi khởi động lại:
[mysqld]
server_audit_logging = ON
server_audit_events = 'CONNECT,QUERY,TABLE'
server_audit_query_log_limit = 1024
server_audit_file_path = /var/log/mysql/audit.log
server_audit_file_rotate_size = 100M
server_audit_file_rotations = 5
Sau khi khởi động lại dịch vụ, tệp audit.log của bạn sẽ ghi lại mọi truy vấn. Một dòng log điển hình sẽ trông như thế này:
20231027 14:05:01,localhost,root,localhost,5,12,QUERY,,'DELETE FROM customers WHERE id = 101',0
Thiết lập Audit Logging trong PostgreSQL
Người dùng PostgreSQL nên sử dụng pgAudit. Đây là tiêu chuẩn công nghiệp cho Postgres vì nó cung cấp khả năng ghi nhật ký chi tiết ở cấp độ session và object mà tính năng logging mặc định không thể sánh bằng.
1. Cài đặt
Trên các hệ thống Ubuntu hoặc Debian, hãy cài đặt gói phù hợp với phiên bản Postgres của bạn:
sudo apt-get install postgresql-15-pgaudit
2. Cấu hình
PostgreSQL phải tải thư viện pgAudit khi khởi động. Mở tệp postgresql.conf của bạn và cập nhật các tham số sau:
shared_preload_libraries = 'pgaudit'
pgaudit.log = 'write, ddl'
pgaudit.log_catalog = off
pgaudit.log_parameter = on
pgaudit.log_relation = on
Cài đặt pgaudit.log = 'write, ddl' là “điểm cân bằng lý tưởng”. Nó ghi lại tất cả các sửa đổi dữ liệu và thay đổi schema mà không làm tràn ngập log của bạn với hàng ngàn truy vấn SELECT thông thường. Khởi động lại dịch vụ Postgres để áp dụng các thay đổi này.
3. Kích hoạt Extension
Cuối cùng, hãy bật extension trong cơ sở dữ liệu cụ thể của bạn:
CREATE EXTENSION pgaudit;
Để kiểm tra, hãy tạo một bảng giả. Log của Postgres (thường nằm trong /var/log/postgresql/) giờ đây sẽ chứa các mục có cấu trúc chi tiết chính xác người dùng nào đã thực hiện lệnh.
Quản lý lượng Log khổng lồ
Audit logs có thể tăng kích thước rất nhanh. Trên một hệ thống có lưu lượng truy cập cao, tôi đã thấy log đạt tới 50GB trong chưa đầy 24 giờ. Khối lượng này tạo ra một thách thức: làm thế nào để bạn thực sự phân tích dữ liệu?
Các kiểm toán viên thường yêu cầu các log này ở các định dạng cụ thể như JSON để đưa vào các công cụ SIEM. Nếu bạn cần chuyển đổi nhanh các log này cho một báo cáo hoặc dashboard, toolcraft.app/vi/tools/data/csv-to-json là một công cụ tiện lợi. Vì nó xử lý dữ liệu hoàn toàn trong trình duyệt của bạn, các bản ghi audit nhạy cảm sẽ không bao giờ rời khỏi máy cục bộ.
Những quy tắc xương máu cho Audit Logs
Thiết lập log mới chỉ là bắt đầu. Quản lý đúng cách sẽ ngăn log trở thành gánh nặng hoặc làm hỏng máy chủ của bạn. Hãy tuân theo các nguyên tắc sau:
- Thực hiện Log Rotation: Đừng bao giờ để tệp log tăng trưởng vô tận. Cấu hình rotation để giữ log trong 7 ngày tại cục bộ và lưu trữ các tệp cũ hơn vào bộ nhớ đám mây được mã hóa như AWS S3.
- Lọc có chiến lược: Đừng log các câu lệnh
SELECTtrên các bảng có lưu lượng truy cập cao trừ khi bạn đang ở trong môi trường bảo mật cực cao. Nhiễu thông tin sẽ vùi lấp các sự kiện “ghi” quan trọng mà bạn thực sự cần. - Thắt chặt quyền hạn: Audit logs là bản đồ cho những kẻ tấn công. Hãy đảm bảo các tệp log chỉ có thể đọc được bởi dịch vụ cơ sở dữ liệu và quản trị viên hệ thống.
- Theo dõi Disk I/O: Auditing thêm một thao tác ghi cho mỗi truy vấn được theo dõi. Sử dụng một công cụ như Prometheus để theo dõi độ trễ của đĩa và đảm bảo việc logging không gây nghẽn cổ chai cho ứng dụng của bạn.
Lời kết
Audit logging thường bị bỏ qua cho đến khi một cuộc khủng hoảng xảy ra khiến nó trở nên không thể thiếu. Bằng cách triển khai MariaDB Audit Plugin hoặc pgAudit, bạn chuyển từ phỏng đoán sang chắc chắn. Bạn có được một bản ghi xác thực, có dấu thời gian về mọi thay đổi trong hệ thống của mình. Hãy bắt đầu bằng việc log các thay đổi DDL để theo dõi cập nhật schema, sau đó mở rộng sang log DML khi bạn đã kiểm soát được yêu cầu lưu trữ của mình.

