6.Audit Log & System Metadata
6.1. Mục tiêu chương
Chương này quy định cách quản lý dữ liệu audit nhằm:
-
Đảm bảo khả năng truy vết toàn bộ hoạt động hệ thống
-
Phục vụ kiểm tra, giám sát và điều tra sự cố
-
Đáp ứng yêu cầu kiểm toán và tuân thủ
-
Bảo vệ dữ liệu hệ thống khỏi việc chỉnh sửa trái phép
6.2. Khái niệm / phạm vi áp dụng
Audit log là dữ liệu ghi nhận:
-
Hành động của người dùng
-
Thay đổi dữ liệu quan trọng
-
Sự kiện hệ thống
-
Hoạt động bảo mật
Các bảng audit:
-
audit_log
-
action_history
-
system_event
Các bảng này được coi là dữ liệu core của hệ thống.
Quy định này áp dụng cho:
-
Tất cả module trong hệ thống
-
Core Team và Partner Team
Mọi thay đổi liên quan đến audit
6.3. Quy định chính
Partner không được phép:
-
Thay đổi cấu trúc bảng audit
-
Thêm hoặc xóa cột trong bảng audit
-
Xóa dữ liệu audit
-
Chỉnh sửa dữ liệu audit thủ công
-
Thay đổi logic ghi log
Các bảng audit được coi là:
Core system data
Mọi thay đổi liên quan đến:
-
Cấu trúc bảng audit
-
Logic ghi log
-
Cơ chế lưu trữ audit
phải được:
Core Team phê duyệt
6.4. Cách thực hiện / quy trình
Trường hợp 1: Module cần ghi thêm audit
Bước 1: Sử dụng cơ chế audit có sẵn của hệ thống

Ví dụ:
-
AuditService
-
Annotation audit
-
Event audit
Bước 2: Không được tự tạo bảng audit riêng
Bước 3: Nếu cần mở rộng dữ liệu audit:
Tạo ticket:
[AUDIT CHANGE REQUEST] <mô tả thay đổi>

Bước 4: Core Team review:
-
Xem xét nhu cầu
-
Đánh giá ảnh hưởng hệ thống
-
Quyết định phương án mở rộng
Trường hợp 2: Cần thay đổi cấu trúc bảng audit
Bước 1: Tạo ticket:
[DB CORE CHANGE REQUEST] Audit table change

Bước 2: Cung cấp thông tin:
-
Bảng audit bị ảnh hưởng
-
Field cần thêm/sửa
-
Lý do thay đổi
-
Migration script
Bước 3: Core Team review và quyết định
6.5. Ví dụ minh họa
Trường hợp hợp lệ
Module planning muốn ghi log khi tạo kế hoạch:
auditService.logCreate("PLANNING", planningId, userId);
→ Sử dụng cơ chế audit có sẵn → hợp lệ.
Trường hợp không hợp lệ
Partner tự tạo bảng:
CREATE TABLE planning_audit (
id BIGINT,
action VARCHAR(50)
);
→ Sai quy định vì:
-
Tự tạo bảng audit riêng
-
Không dùng hệ thống audit chung
Trường hợp bị cấm
Partner chạy trực tiếp:
DELETE FROM audit_log WHERE created_at < '2024-01-01';
→ Không được phép xóa dữ liệu audit.
6.6. Checklist áp dụng
Trước khi commit hoặc tạo PR:
-
Có thay đổi bảng audit không?
-
Nếu có → phải xin Core Team
-
Có xóa dữ liệu audit không?
-
Nếu có → không được phép
-
Có tự tạo bảng audit riêng không?
-
Nếu có → phải chuyển sang audit chung
-
Có thay đổi logic audit không?
-
Nếu có → phải tạo Audit Change Request
6.7. Kiến trúc và cơ chế ghi Audit chuẩn
Để đảm bảo tính thống nhất và khả năng truy vết hệ thống, việc ghi Audit Log phải tuân thủ kiến trúc chuẩn của backend.
6.7.1. Vị trí ghi Audit
Audit Log phải được ghi tại:
-
Service layer
-
Sau khi thao tác dữ liệu thành công
-
Trong transaction nghiệp vụ
Không được ghi Audit tại:
-
Controller
-
Repository
-
Frontend
-
SQL trigger tự tạo
6.7.2. Sử dụng AuditService chuẩn
Tất cả module phải ghi Audit thông qua cơ chế chuẩn của hệ thống, ví dụ:
Không được:
-
Ghi trực tiếp DB audit
-
Tự dùng repository audit
-
Ghi log bằng logger thay cho audit
6.7.3. Nội dung bản ghi Audit chuẩn
Mỗi bản ghi Audit nên chứa tối thiểu các thông tin:
-
action (CREATE / UPDATE / DELETE / LOGIN / APPROVE…)
-
module (USER / PLANNING / DOCUMENT…)
-
objectId
-
objectType
-
username / userId
-
timestamp
-
oldValue
-
newValue
-
ipAddress
-
traceId
Thông tin này phục vụ:
-
truy vết thay đổi dữ liệu
-
điều tra sự cố
-
kiểm toán hệ thống
6.8. TraceId trong Audit Log
Mỗi Audit Log phải liên kết với request thông qua traceId.
TraceId được:
-
sinh tại filter/interceptor của backend
-
lưu trong context request
-
truyền vào AuditService khi ghi log
Mục đích:
-
liên kết audit với log hệ thống
-
truy vết API gây thay đổi dữ liệu
-
phục vụ điều tra production
6.9. Nguyên tắc ghi Audit trong Transaction
Audit Log phải được ghi cùng transaction với dữ liệu nghiệp vụ:
-
Nếu transaction nghiệp vụ rollback → audit không được ghi
-
Nếu thao tác dữ liệu thành công → audit phải tồn tại
Không được:
-
ghi audit trước khi lưu dữ liệu
-
ghi audit ngoài transaction
-
ghi audit async tách rời nghiệp vụ
6.10. Quy định bảo mật dữ liệu Audit
Dữ liệu Audit được coi là dữ liệu nhạy cảm và phải bảo vệ:
Không được lưu trong audit:
-
password
-
token
-
secret
-
private key
-
dữ liệu cá nhân đầy đủ
-
file nhạy cảm
Nếu cần ghi dữ liệu nhạy cảm → phải mask hoặc hash.
Ví dụ:
6.11. Nguyên tắc bắt buộc bổ sung
Ngoài các quy định ở trên, hệ thống yêu cầu:
-
Audit phải ghi tại Service layer
-
Audit phải qua AuditService chuẩn
-
Audit phải nằm trong transaction
-
Audit phải có traceId
-
Không ghi audit trực tiếp DB
-
Không ghi audit bằng logger
Vi phạm các nguyên tắc này được xem là vi phạm kiến trúc hệ thống.