Hướng dẫn cấu hình auditd trên Linux: Giám sát file nhạy cảm, log lệnh user và truy vết xâm nhập

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Bối cảnh & Tại sao bash_history là chưa đủ

Nhiều sysadmin vẫn dựa vào ~/.bash_history để theo dõi thao tác người dùng. Cách này rất rủi ro. Bất kỳ ai vào được shell đều có thể vô hiệu hóa history bằng vài chiêu đơn giản: gõ unset HISTFILE, chèn khoảng trắng trước câu lệnh, hoặc link file này vào /dev/null. Khi file cấu hình bị sửa lén hay dữ liệu rò rỉ, bạn hầu như không còn dấu vết để đối soát.

Linux Audit Framework (với daemon auditd) xử lý bài toán này ngay tại tầng kernel. Mọi system call quan trọng như mở file (openat), chỉnh sửa (write), xóa (unlinkat), hay chạy file nhị phân (execve) đều bị kernel bắt lại. Kẻ tấn công có thể xóa history trong user-space, nhưng không thể can thiệp vào log đã ghi ở tầng nhân.

Về tài nguyên, bạn không cần quá lo lắng. Trên cụm máy chủ Ubuntu 22.04 (2 vCPU, 4GB RAM) chạy Nginx và Node.js tải khoảng 1.200 req/s, daemon auditd chỉ ngốn chưa tới 35MB RAM và dưới 1.5% CPU.

Cài đặt dịch vụ

Các distro họ Red Hat (RHEL, Rocky Linux, AlmaLinux) thường tích hợp sẵn auditd. Trên Ubuntu/Debian, bạn cài đặt bổ sung qua APT:

sudo apt update
sudo apt install -y auditd audispd-plugins

Với CentOS Stream hoặc Rocky Linux (nếu bản minimal chưa có):

sudo dnf install -y audit

Kích hoạt để service khởi động cùng OS:

sudo systemctl enable auditd
sudo systemctl start auditd

Lưu ý quan trọng: Lệnh systemctl restart auditd thường bị chặn cố ý. Thiết kế này nhằm ngăn tiến trình lạ tự restart daemon để ngắt quãng luồng log. Khi cần nạp lại rule mà không gián đoạn dịch vụ, bạn hãy dùng:

sudo augenrules --load
# Trường hợp bắt buộc phải restart cả tiến trình:
sudo service auditd restart

Cấu hình chi tiết

Hệ thống auditd chuẩn gồm hai phần tách biệt: file cấu hình daemon /etc/audit/auditd.conf và thư mục chứa rule giám sát /etc/audit/rules.d/.

1. Tối ưu auditd.conf chống tràn đĩa

File log mặc định tại /var/log/audit/audit.log có thể phình to rất nhanh. Mở file /etc/audit/auditd.conf và điều chỉnh các giá trị kiểm soát dung lượng:

# Giới hạn mỗi file log tối đa 50MB
max_log_file = 50

# Giữ lại tối đa 10 file xoay vòng (tổng dung lượng cố định ~500MB)
num_logs = 10

# Tự động rotate khi chạm ngưỡng dung lượng
max_log_file_action = ROTATE

# Cơ chế ghi đĩa bất đồng bộ để tránh nghẽn I/O
flush = INCREMENTAL_ASYNC
freq = 50

2. Thiết lập bộ quy tắc giám sát (Audit Rules)

Đừng sửa trực tiếp file /etc/audit/audit.rules vì hệ thống sẽ ghi đè nội dung này sau mỗi lần reboot. Hãy tạo file riêng tại /etc/audit/rules.d/custom.rules:

sudo nano /etc/audit/rules.d/custom.rules

Dưới đây là mẫu cấu hình thực chiến cho server production:

# Reset sạch rule cũ trước khi nạp
-D

# Bộ đệm 8192 events (tránh rớt gói log khi server chịu tải spike đột ngột)
-b 8192

# 1. Giám sát các file tài khoản và phân quyền
-w /etc/passwd -p wa -k identity_changes
-w /etc/shadow -p wa -k identity_changes
-w /etc/group -p wa -k identity_changes
-w /etc/gshadow -p wa -k identity_changes
-w /etc/sudoers -p wa -k sudoers_changes
-w /etc/sudoers.d/ -p wa -k sudoers_changes

# 2. Giám sát cấu hình SSH
-w /etc/ssh/sshd_config -p wa -k sshd_config

# 3. Ghi lại mọi lệnh thực thi từ người dùng thật (UID >= 1000)
-a always,exit -F arch=b64 -S execve -F auid>=1000 -F auid!=unset -k user_commands
-a always,exit -F arch=b32 -S execve -F auid>=1000 -F auid!=unset -k user_commands

# 4. Giám sát hành vi thay đổi đồng hồ hệ thống
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change
-a always,exit -F arch=b64 -S clock_settime -k time_change

# 5. Khóa rules bất biến (phải đặt ở dòng cuối cùng)
-e 2

Các tham số cốt lõi cần nhớ:

  • -w <path>: Đường dẫn file hoặc thư mục cần theo dõi.
  • -p wa: Bắt sự kiện ghi (w – write) và đổi thuộc tính file (a – attribute change).
  • -k <key>: Gắn nhãn để truy vấn log nhanh bằng ausearch.
  • -F auid>=1000: Chỉ bắt sự kiện do user người thật đăng nhập thực hiện. Bộ lọc này loại bỏ các daemon ngầm như cron, nginx hay prometheus để tránh ngập log.
  • -e 2: Đưa toàn bộ rule vào trạng thái khóa cứng (Immutable). Khi kích hoạt dòng này, không tài khoản nào — kể cả root — sửa hay tắt rule được nếu không khởi động lại server.

Sau khi lưu file, nạp cấu hình mới vào kernel:

sudo augenrules --load

Truy vấn và phân tích log sự cố

File log gốc lưu các chuỗi mã hóa hex và unix timestamp thô nên rất khó đọc thủ công. Bạn nên phân tích qua hai tiện ích tiêu chuẩn: ausearch và aureport.

1. Kiểm tra rule đang nạp trong kernel

sudo auditctl -l

2. Truy vết sửa đổi file nhạy cảm

Khi nghi ngờ ai đó vừa can thiệp vào tài khoản hệ thống, bạn lọc sự kiện theo key identity_changes:

sudo ausearch -k identity_changes -i

Tùy chọn -i (interpret) sẽ tự động giải mã timestamp về giờ địa phương và chuyển UID/GID sang username cụ thể. Đầu ra hiển thị rõ ràng:

type=SYSCALL msg=audit(21/10/2026 14:22:05.312:108) : arch=x86_64 syscall=openat success=yes exit=3 comm="vim" exe="/usr/bin/vim" auid=kien.nguyen uid=root gid=root key="identity_changes"

Log trên chỉ ra chính xác: user kien.nguyen (auid ban đầu) đã dùng quyền root thông qua công cụ vim để can thiệp file.

3. Lọc lệnh người dùng chạy trong ngày

Để rà soát toàn bộ command do user gõ từ đầu ngày tới giờ:

sudo ausearch -ts today -k user_commands -i

Kết quả trả về đầy đủ tham số dòng lệnh và tiến trình cha thực thi lệnh đó.

4. Xuất báo cáo tổng quan với aureport

Khi cần làm việc với đội audit bảo mật hoặc rà soát định kỳ, aureport giúp tổng hợp nhanh các chỉ số quan trọng:

  • Thống kê các lần đăng nhập (thành công lẫn thất bại):
sudo aureport --auth -i
  • Thống kê danh sách file bị truy cập nhiều nhất:
sudo aureport -f -i --summary
  • Rà soát các phiên chuyển quyền (sudo / su):
sudo aureport -u -i

Chỉ cần kiểm soát đúng các file phân quyền trọng yếu và lệnh của user, bạn đã có một cơ chế ghi log độc lập, đủ dữ liệu đối soát khi có sự cố mà không lo bị can thiệp xóa dấu vết từ user-space.

Share: