Mục tiêu không phải là ghi càng nhiều càng tốt, mà là ghi đúng thứ cần ghi, để phục vụ việc phân tích, giám sát và phản ứng bảo mật về sau.
Triết lý thiết kế database của Init Sentinel
Init Sentinel được xây dựng dựa trên ba nguyên tắc cốt lõi nhằm đảm bảo hiệu quả, an toàn và khả năng mở rộng lâu dài.
- Silent: Ghi log không gây tác động tới trải nghiệm người dùng.
- Minimal PII: Tránh lưu dữ liệu nhạy cảm không cần thiết.
- Phân tích được: Dữ liệu đủ để phát hiện hành vi bất thường.
Nhờ vậy, hệ thống vừa an toàn về mặt pháp lý, vừa đủ mạnh để mở rộng các lớp bảo vệ phía sau.
Cấu trúc bảng init_sentinel_security_log
Bảng log của Init Sentinel được thiết kế để cân bằng giữa khả năng phân tích và hiệu năng truy vấn trong môi trường WordPress.
- id: Khoá chính, tự tăng.
- user_id: ID user WordPress, nếu truy cập có đăng nhập.
- ip_address: Địa chỉ IP, hỗ trợ cả IPv4 và IPv6.
- endpoint: Endpoint hoặc URL bị truy cập.
- action: Loại hành vi bị ghi nhận.
- status_code: HTTP status code, trọng tâm là các lỗi 403.
- user_agent: Chuỗi User-Agent phục vụ nhận diện bot.
- created_at: Thời điểm phát sinh log.
Các index được tạo sẵn để phục vụ các truy vấn phổ biến như lọc theo IP, theo user hoặc theo khoảng thời gian mà không gây full table scan.
Hàm tạo bảng database cho Init Sentinel
Dưới đây là hàm core với prefix init_html_*, chịu trách nhiệm tạo bảng security log cho module Init Sentinel.
// Tạo bảng security log (silent, minimal PII)
function init_html_create_security_log_table() {
global $wpdb;
$table = $wpdb->prefix . 'init_sentinel_security_log';
$charset_collate = $wpdb->get_charset_collate();
$sql = "
CREATE TABLE {$table} (
id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
user_id BIGINT(20) UNSIGNED DEFAULT NULL,
ip_address VARCHAR(45) NOT NULL,
endpoint VARCHAR(255) NOT NULL,
action VARCHAR(100) NOT NULL,
status_code INT(3) NOT NULL,
user_agent TEXT,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY user_id (user_id),
KEY ip_address (ip_address),
KEY created_at (created_at)
) {$charset_collate};
";
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
dbDelta($sql);
}
Vì sao Init Sentinel sử dụng dbDelta
Thay vì chạy câu lệnh SQL trực tiếp, Init Sentinel sử dụng dbDelta để đảm bảo khả năng nâng cấp cấu trúc bảng trong tương lai mà không làm mất dữ liệu hiện có.
- Tự động thêm hoặc điều chỉnh cột và index khi schema thay đổi.
- An toàn khi deploy trên nhiều môi trường khác nhau.
- Phù hợp với vòng đời phát triển dài hạn của module.
Đây là nền tảng quan trọng để Init Sentinel không chỉ là một hệ thống ghi log tạm thời mà là một lớp bảo mật sống.
Lưu ý khi triển khai thực tế
Khi áp dụng bảng log này trong môi trường production, cần tuân thủ một số nguyên tắc để tránh phản tác dụng.
- Không ghi log mọi request, chỉ tập trung vào truy cập bất thường.
- Không lưu payload request hoặc dữ liệu form.
- Cần có chiến lược xoay log hoặc dọn dẹp định kỳ.
Một bảng database tốt không tự tạo ra bảo mật, nhưng nó là điều kiện bắt buộc để bảo mật tồn tại và có thể kiểm soát.
Kết luận
Với bảng database này, Init Sentinel đã có nền móng vững chắc để theo dõi và phân tích các truy cập trái phép trong WordPress một cách có hệ thống.
Ở bài tiếp theo, chúng ta sẽ đi vào hàm core ghi log của Init Sentinel, nơi dữ liệu bắt đầu thực sự có giá trị.
Bình luận