Tại sao General Log là chưa đủ?
Đã bao giờ bạn thức dậy và phát hiện một bảng dữ liệu quan trọng bỗng dưng “bay màu”? Tệ hơn nữa, khi kiểm tra General Log, bạn lạc lối giữa hàng triệu dòng truy vấn vô thưởng vô phạt. Slow Query Log cũng không giúp ích gì vì nó chỉ ghi lại những câu lệnh chạy chậm, chứ không phải những lệnh “nguy hiểm”.
Với các tiêu chuẩn khắt khe như PCI DSS, HIPAA hay GDPR, việc truy vết chính xác Ai đã tác động, vào Lúc nào và từ IP nào là bắt buộc. MySQL Audit Log Plugin sinh ra để lấp đầy khoảng trống này. Nó không chỉ ghi lại log mà còn cung cấp khả năng lọc thông minh, giúp bạn kiểm soát mọi biến động trong hệ thống.
Kinh nghiệm từ hệ thống 50GB mình đang vận hành: Nếu bật Audit Log cho toàn bộ 2.000 query/giây, CPU sẽ tăng vọt thêm 30%. Tuy nhiên, khi mình cấu hình chỉ lọc các lệnh DROP, DELETE hoặc GRANT, hiệu suất gần như không thay đổi. Việc này giúp mình hoàn toàn yên tâm khi cấp quyền cho team Dev truy cập môi trường staging.
Nên chọn Audit Plugin nào cho bản Community?
Nếu không dùng bản Enterprise đắt đỏ, bạn vẫn có 3 lựa chọn xuất sắc từ cộng đồng:
- Percona Audit Log Plugin: Lựa chọn số 1 hiện nay. Hỗ trợ format JSON cực mượt và tương thích hoàn hảo với MySQL 8.0.
- MariaDB Audit Plugin: Có thể chạy trên MySQL nhưng đôi khi xảy ra lỗi kịch bản khi nâng cấp version lớn.
- McAfee MySQL Audit Plugin: Từng rất nổi tiếng nhưng hiện tại tốc độ cập nhật tính năng mới khá chậm.
Bài viết này mình sẽ hướng dẫn dựa trên Percona Audit Log Plugin vì tính ổn định vượt trội trong môi trường thực tế.
Các bước cài đặt nhanh
Đầu tiên, bạn cần xác định vị trí lưu trữ plugin của hệ thống. Hãy đăng nhập MySQL và gõ:
SHOW VARIABLES LIKE 'plugin_dir';
Sau khi copy file audit_log.so vào thư mục trên, hãy kích hoạt plugin bằng lệnh sau:
INSTALL PLUGIN audit_log SONAME 'audit_log.so';
Để chắc chắn mọi thứ đã sẵn sàng, bạn hãy kiểm tra lại trạng thái:
SHOW PLUGINS;
-- Kiểm tra các thông số cấu hình
SHOW VARIABLES LIKE 'audit_log%';
Nếu dòng audit_log hiện trạng thái ACTIVE, chúc mừng bạn đã đi được nửa chặng đường.
Cấu hình tối ưu: Tránh tràn ổ cứng
Đừng bao giờ để cấu hình mặc định nếu bạn không muốn ổ cứng đầy trong vài tiếng. Dưới đây là cách mình tối ưu cho server production.
1. Ưu tiên định dạng JSON
Hãy quên format XML cũ kỹ đi. JSON giúp các công cụ như ELK Stack hoặc script Python xử lý log nhanh hơn 40%.
SET GLOBAL audit_log_format = 'JSON';
2. Thiết lập chính sách ghi log (Policy)
Bạn có 4 lựa chọn: ALL (Ghi tất cả), NONE (Tắt), LOGINS (Chỉ ghi đăng nhập), và QUERIES (Chỉ ghi truy vấn). Mẹo nhỏ: Hãy chọn ALL nhưng sử dụng tính năng exclude_accounts để loại bỏ các user hệ thống thường xuyên ghi log rác.
3. Cấu hình bền vững trong my.cnf
Để đảm bảo cấu hình không mất đi khi restart MySQL, hãy thêm các dòng sau vào file my.cnf:
[mysqld]
audit_log_policy=ALL
audit_log_format=JSON
audit_log_file=/var/log/mysql/audit.log
audit_log_rotate_on_size=100M
audit_log_rotations=10
Việc chia nhỏ file log 100MB giúp bạn mở file kiểm tra cực nhanh, thay vì ngồi chờ text editor “treo máy” với file log vài GB.
Thành quả: Truy tìm dấu vết
Thử thực hiện một lệnh nhạy cảm và theo dõi file log ngay lập tức:
tail -f /var/log/mysql/audit.log
Bạn sẽ nhận được một bản ghi chi tiết như sau:
{
"audit_record": {
"name": "Query",
"timestamp": "2026-05-19T10:00:00Z",
"command_class": "drop_table",
"user": "dev_user[dev_user] @ localhost [192.168.1.15]",
"sqltext": "DROP TABLE customer_data"
}
}
Nhìn vào log, rõ ràng dev_user từ IP 192.168.1.15 đã thực hiện lệnh xóa bảng. Mọi thứ đều minh bạch.
Lời khuyên để “ngủ ngon” hơn
Đừng lưu log mãi trên server database. Hacker sau khi xâm nhập thường có thói quen xóa log để phi tang. Mình luôn dùng logrotate kết hợp một script nhỏ để đẩy log lên S3 mỗi giờ một lần. Điều này đảm bảo dữ liệu truy vết luôn an toàn dù server có gặp sự cố.
Nếu bạn chỉ quan tâm đến các bảng chứa lương hay thông tin khách hàng, hãy dùng Audit Filtering để tập trung vào đúng mục tiêu. Cách làm này vừa tiết kiệm tài nguyên, vừa giúp bạn tìm kiếm thông tin nhanh gấp nhiều lần.
MySQL Audit Log không phải là chiếc đũa thần, nhưng nó là lớp khiên vững chắc bảo vệ dữ liệu. Chúc các bạn triển khai thành công!

