Cài đặt và cấu hình AIDE trên CentOS Stream 9: Giám sát toàn vẹn file và chống can thiệp trái phép

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Giám sát file integrity trên Linux: Chọn công cụ nào cho hệ thống RHEL/CentOS?

Mỗi đợt chuẩn bị audit PCI-DSS (Requirement 11.5) hay ISO 27001, bài toán File Integrity Monitoring (FIM) luôn là mục bắt buộc. Thực tế khi kẻ tấn công khai thác thành công lỗ hổng RCE, đích đến tiếp theo gần như chắc chắn là file hệ thống. Chúng thường sửa binary /usr/bin/login, cấy mã độc vào /etc/crontab, hoặc mở cổng hậu trong /etc/ssh/sshd_config.

Để bắt được các thay đổi này trước khi quá muộn, dân Sysadmin thường cân nhắc 3 phương án:

  • Tự viết Bash script + sha256sum: Định kỳ quét hash rồi so sánh bằng diff. Nhanh nhưng sơ sài.
  • Triển khai cụm SIEM/FIM tập trung (Wazuh, OSSEC): Giám sát thời gian thực rất tốt. Tuy nhiên kiến trúc cồng kềnh, ngốn tối thiểu 2-4 GB RAM cho server quản lý.
  • Dùng AIDE (Advanced Intrusion Detection Environment): Gọn nhẹ, chuẩn chỉ, nằm sẵn trong kho AppStream của RHEL/CentOS.

So sánh 3 hướng tiếp cận trên thực tế

Bảng đối chiếu nhanh dựa trên kinh nghiệm vận hành thực tế:

Tiêu chí Script tự chế (Bash + Hash) Agent tập trung (Wazuh/OSSEC) AIDE
Độ phức tạp triển khai Dễ làm lúc đầu, ác mộng khi scale Phức tạp, cần dựng manager, database và dashboard Cài 1 lệnh dnf là xong ngay
Tài nguyên CPU/RAM Thấp nếu ít file, treo máy nếu quét sâu Chạy daemon nền liên tục, tốn RAM 0% RAM nền; chỉ dùng CPU và I/O khi chạy quét
Phạm vi kiểm tra Thường chỉ check hash nội dung Real-time event, log correlation, audit rule Check hash (SHA256/SHA512), permissions, inode, SELinux, mtime
Độ phù hợp Chữa cháy tạm thời Hệ sinh thái lớn từ 50-100 servers trở lên Server độc lập, gateway, VPS hoặc quản lý qua Ansible

Script tự viết thường bỏ sót nhiều chỉ số then chốt. Nó không kiểm tra được phân quyền file, symlink bất thường hay SELinux context. Ngược lại, nếu dựng cả cụm Wazuh chỉ để canh chừng 2-3 con VPS chạy web/database thì lại quá thừa thãi.

Khi nào nên chọn AIDE cho CentOS Stream 9?

Trên các máy chủ public gateway hoặc database standalone chạy CentOS Stream 9, mình ưu tiên AIDE vì tính thực dụng. Công cụ này không duy trì process chạy ngầm gây nghẽn RAM. Toàn bộ thông số từ quyền sở hữu (UID/GID), timestamp, kích thước file đến hash mật mã đều được kiểm tra triệt để.

Hơn nữa, bạn không mất thêm chi phí duy trì server quản lý trung gian mà vẫn hoàn thành đầy đủ báo cáo kiểm toán bảo mật.

Các bước triển khai AIDE trên CentOS Stream 9

Bước 1: Cài đặt AIDE từ AppStream

Gói cài đặt đã có sẵn trên repository mặc định của hệ thống. Bạn chỉ cần chạy lệnh sau:

sudo dnf install -y aide aide-selinux

Đừng bỏ qua package aide-selinux. Thiếu nó, SELinux ở chế độ Enforcing sẽ chặn đứng AIDE khi đọc các file nhạy cảm trong hệ thống.

Bước 2: Tinh chỉnh quy tắc trong file cấu hình

Mở file cấu hình chính của công cụ:

sudo nano /etc/aide.conf

Mặc định file này định nghĩa sẵn các macro thuộc tính cần kiểm tra:

# Macro chuẩn: kiểm tra hash SHA256, quyền, inode, user, group, SELinux, ACL
CONTENT_EX = sha256+ftype+p+u+g+n+acl+selinux+xattrs
DATAONLY   = p+u+g+sha256

Kinh nghiệm thực tế: Lỗi phổ biến nhất là quẳng nguyên thư mục /var/log vào diện kiểm tra nội dung. Hậu quả là scan lần nào cũng dính cảnh báo rác vì log ghi liên tục. Hãy dùng dấu ! để loại trừ các đường dẫn biến động:

# 1. Các thư mục cốt lõi cần giám sát nghiêm ngặt
/etc          CONTENT_EX
/usr/bin      CONTENT_EX
/usr/sbin     CONTENT_EX
/boot         CONTENT_EX

# 2. Loại trừ log, file tạm và dữ liệu container
!/var/log/.*
!/var/tmp/.*
!/tmp/.*
!/var/lib/docker/.*
!/var/lib/containers/.*

Bước 3: Khởi tạo database gốc (Baseline)

AIDE hoạt động bằng cách snapshot trạng thái hiện tại của filesystem vào một file cơ sở dữ liệu. Thực hiện snapshot ban đầu:

sudo aide --init

Trên ổ SSD NVMe với khoảng 50.000 file chuẩn, tiến trình mất chừng 20-40 giây. Khi xong, hệ thống tạo ra file /var/lib/aide/aide.db.new.gz (dung lượng tầm 3-8 MB).

Kích hoạt database này làm mốc so sánh chính thức:

sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

Tăng cường bảo vệ: Kẻ tấn công sau khi leo quyền root có thể chạy lệnh ghi đè database này để phi tang dấu vết. Để phòng ngừa, hãy bật thuộc tính bất biến cho file database:

sudo chattr +i /var/lib/aide/aide.db.gz

Bước 4: Thử nghiệm phát hiện thay đổi

Hãy thử can thiệp vào file phân giải tên miền hệ thống:

echo "192.168.1.50 rogue-c2.internal" | sudo tee -a /etc/hosts

Kích hoạt tiến trình quét đối chiếu:

sudo aide --check

AIDE lập tức phát hiện sự sai lệch và xuất báo cáo chi tiết:

AIDE 0.16 found differences between database and filesystem!!
Start timestamp: 2026-10-25 10:30:00

Summary:
  Total number of entries:      54210
  Added entries:                0
  Removed entries:              0
  Changed entries:              1

---------------------------------------------------
Changed entries:
---------------------------------------------------
changed: /etc/hosts

---------------------------------------------------
Detailed information about changes:
---------------------------------------------------
File: /etc/hosts
  Size     : 158                              , 192
  Mtime    : 2026-10-25 09:12:00              , 2026-10-25 10:29:45
  SHA256   : e3b0c44298fc1c149afbf4c8996fb924 , b94d27b9934d3e08a52e52d7da7dabfa

Bước 5: Cập nhật baseline sau mỗi đợt update OS

Mỗi khi chạy dnf upgrade, hàng loạt binary và thư viện sẽ đổi checksum. Nếu chạy check ngay, bạn sẽ ngập trong cảnh báo giả. Giải pháp là tái tạo baseline mới:

# Tạm gỡ cờ immutable nếu đã bật ở bước 3
sudo chattr -i /var/lib/aide/aide.db.gz

# Cập nhật và thay thế database
sudo aide --update
sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

# Khóa lại file
sudo chattr +i /var/lib/aide/aide.db.gz

Bước 6: Tự động hóa qua cron và gửi alert về Telegram

Không ai đủ kiên nhẫn gõ lệnh thủ công mỗi ngày. Hãy viết script tự động xử lý kết quả tại /usr/local/bin/aide-monitor.sh:

#!/usr/bin/env bash

BOT_TOKEN="123456789:ABCdefGHIjklMNOpqrSTUvwxYZ"
CHAT_ID="-987654321"

# Chạy quét với độ ưu tiên I/O thấp nhất để không giật lag server
OUTPUT=$(ionice -c 3 /usr/sbin/aide --check 2>&1)
EXIT_CODE=$?

# AIDE exit code: 0 = sạch; khác 0 = có thay đổi hoặc phát sinh lỗi
if [ $EXIT_CODE -ne 0 ]; then
    REPORT_SNIP=$(echo "$OUTPUT" | head -n 25)
    TEXT="⚠️ <b>CẢNH BÁO FIM TRÊN $(hostname)</b>%0A%0A<code>${REPORT_SNIP}"
    curl -s -X POST "https://api.telegram.org/bot${BOT_TOKEN}/sendMessage" \
        -d "chat_id=${CHAT_ID}" \
        -d "parse_mode=HTML" \
        -d "text=${TEXT}" > /dev/null
fi

Phân quyền nghiêm ngặt cho script:

sudo chmod 700 /usr/local/bin/aide-monitor.sh
sudo chown root:root /usr/local/bin/aide-monitor.sh

Đặt lịch chạy tự động lúc 03:00 sáng hàng ngày trong crontab của root:

echo "0 3 * * * /usr/local/bin/aide-monitor.sh" | sudo tee -a /var/spool/cron/root

3 lưu ý sống còn khi vận hành AIDE

  1. Kiểm soát tài nguyên I/O ổ đĩa: Việc quét đồng loạt 50.000 file dễ gây nghẽn disk I/O, nhất là trên các máy chủ MySQL/PostgreSQL. Luôn bọc lệnh quét bằng ionice -c 3 để AIDE chỉ tận dụng I/O nhàn rỗi.
  2. Cất giữ bản sao database ngoài server: Nếu hacker chiếm toàn quyền root, chúng hoàn toàn có thể vô hiệu hóa chattr +i. Hãy đồng bộ file aide.db.gz sang một storage server độc lập (như NFS mount read-only hoặc S3 bucket bật Object Lock).
  3. Quản lý chặt binary của AIDE: Hãy lưu hash SHA256 của file /usr/sbin/aide vào tài liệu ngoại vi để có thể xác thực tính toàn vẹn của chính công cụ bất cứ lúc nào.
Share: