ตั้งค่า Linux Auditd บน VPS: บันทึกทุกกิจกรรมระบบ
Linux Audit Daemon (auditd) คือระบบบันทึกกิจกรรมระดับ kernel ที่ฝังอยู่ใน Linux kernel ตั้งแต่ version 2.6 เป็นต้นมา ต่างจาก syslog ทั่วไปตรงที่ auditd บันทึก ทุก syscall ที่น่าสงสัย — ใครเปิดไฟล์ไหน ใครแก้ไข /etc/passwd ใครใช้ sudo และเมื่อไหร่
สำหรับ VPS ที่ต้องการ compliance กับมาตรฐาน PCI-DSS, HIPAA, หรือ ISO 27001 — auditd เป็นข้อกำหนดบังคับ บทความนี้จะพาตั้งค่าตั้งแต่ติดตั้งจนถึงเขียน rule และวิเคราะห์ log ด้วย ausearch และ aureport
สิ่งที่ต้องเตรียม
- VPS รัน Ubuntu 20.04/22.04/24.04 หรือ Debian 11/12 (หรือ RHEL/AlmaLinux)
- สิทธิ์ root หรือ sudo
- พื้นที่ disk สำหรับ log (แนะนำ 2 GB+)
ขั้นตอนที่ 1: ติดตั้ง auditd
ติดตั้งบน Ubuntu/Debian:
sudo apt update
sudo apt install -y auditd audispd-plugins
ติดตั้งบน RHEL/AlmaLinux/Rocky Linux:
sudo dnf install -y audit audit-libs
เปิดใช้งานและตั้งให้ start อัตโนมัติ:
sudo systemctl enable auditd
sudo systemctl start auditd
sudo systemctl status auditd
dpkg -l auditd ก่อนขั้นตอนที่ 2: ทำความเข้าใจโครงสร้าง auditd
auditd ประกอบด้วยส่วนสำคัญ 3 ส่วน:
| ส่วนประกอบ | หน้าที่ | ไฟล์ |
|---|---|---|
| auditd | daemon รับและบันทึก log จาก kernel | /var/log/audit/audit.log |
| auditctl | เครื่องมือตั้งค่า rule แบบ real-time | - |
| audit.rules | ไฟล์ rule ถาวรที่โหลดเมื่อ boot | /etc/audit/rules.d/ |
ขั้นตอนที่ 3: ตั้งค่า auditd.conf
แก้ไขไฟล์ config หลัก:
sudo nano /etc/audit/auditd.conf
ตั้งค่าที่แนะนำ:
# ขนาด log สูงสุด (MB) ก่อน rotate
max_log_file = 50
# จำนวน log file ที่เก็บไว้
num_logs = 10
# action เมื่อ disk เต็ม: SUSPEND หยุดบันทึก, ROTATE หมุนไฟล์
disk_full_action = ROTATE
# action เมื่อ disk เกือบเต็ม (space_left MB)
space_left = 500
space_left_action = email
action_mail_acct = root
# เขียน log แบบ append เสมอ
write_logs = yes
log_format = ENRICHED
Restart auditd หลังแก้ config:
sudo systemctl restart auditd
ขั้นตอนที่ 4: เขียน Audit Rules
สร้างไฟล์ rule ใหม่:
sudo nano /etc/audit/rules.d/99-custom.rules
Rule พื้นฐานที่ทุก VPS ควรมี:
# ลบ rule ทั้งหมดก่อน
-D
# ตั้ง buffer ขนาดใหญ่พอ
-b 8192
# ล็อก rate เพื่อป้องกัน log flood
--backlog_wait_time 60000
# === Authentication ===
# บันทึกการ login/logout ทุกครั้ง
-w /var/log/lastlog -p wa -k logins
-w /var/run/faillock/ -p wa -k logins
-w /var/log/wtmp -p wa -k logins
-w /var/log/btmp -p wa -k logins
# === User/Group Management ===
-w /etc/passwd -p wa -k user_changes
-w /etc/shadow -p wa -k user_changes
-w /etc/group -p wa -k user_changes
-w /etc/gshadow -p wa -k user_changes
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
# === SSH Configuration ===
-w /etc/ssh/sshd_config -p wa -k ssh_config
# === Network Configuration ===
-w /etc/hosts -p wa -k network_config
-w /etc/resolv.conf -p wa -k network_config
# === Privileged Commands ===
-a always,exit -F path=/usr/bin/sudo -F perm=x -F auid>=1000 -F auid!=unset -k privileged
-a always,exit -F path=/usr/bin/su -F perm=x -F auid>=1000 -F auid!=unset -k privileged
# === Kernel Module Loading ===
-w /sbin/insmod -p x -k modules
-w /sbin/rmmod -p x -k modules
-w /sbin/modprobe -p x -k modules
# === Crontab Changes ===
-w /etc/cron.d/ -p wa -k cron
-w /etc/crontab -p wa -k cron
-w /var/spool/cron/ -p wa -k cron
# === Unsuccessful File Access ===
-a always,exit -F arch=b64 -S open,creat,truncate,ftruncate,openat -F exit=-EACCES -k access
-a always,exit -F arch=b64 -S open,creat,truncate,ftruncate,openat -F exit=-EPERM -k access
# Lock rules (ป้องกันการแก้ไข rule ระหว่าง runtime)
-e 2
โหลด rule ใหม่โดยไม่ต้อง reboot:
sudo augenrules --load
sudo auditctl -l
ขั้นตอนที่ 5: ค้นหา Log ด้วย ausearch
ausearch เป็นเครื่องมือค้นหา audit log แบบ structured:
ดู event ที่เกี่ยวกับการแก้ /etc/passwd:
sudo ausearch -f /etc/passwd
sudo ausearch -k user_changes
ดู event ของ user คนใดคนหนึ่ง:
sudo ausearch -ua 1001
# หรือใช้ชื่อ
sudo ausearch -ua john
ดู event ในช่วงเวลาที่กำหนด:
sudo ausearch -ts "09/15/2026 07:00:00" -te "09/15/2026 08:00:00"
ดู login failed:
sudo ausearch -m USER_LOGIN -sv no
ขั้นตอนที่ 6: สรุปรายงานด้วย aureport
aureport สร้างรายงานสรุปจาก audit log:
# รายงานภาพรวม
sudo aureport
# สรุปการ authenticate
sudo aureport -au --summary
# รายงาน login ล้มเหลว
sudo aureport --login --failed
# รายงาน syscall
sudo aureport -s --summary
# รายงาน user ที่ใช้ sudo
sudo aureport -x --summary | grep sudo
sudo aureport --summary ทุกเช้าเพื่อดูภาพรวมกิจกรรมของคืนที่ผ่านมาอย่างรวดเร็วขั้นตอนที่ 7: ส่ง Audit Log ออกนอกระบบ (Remote Logging)
เพื่อความปลอดภัยสูงสุด ควรส่ง log ออกไปยัง remote server แยกต่างหากเพื่อป้องกัน attacker ลบ log:
# ติดตั้ง audispd-plugins
sudo apt install -y audispd-plugins
# แก้ไข /etc/audit/plugins.d/au-remote.conf
active = yes
direction = out
path = /sbin/audisp-remote
type = always
args = REMOTE_SERVER_IP 60
format = string
บน remote server รับ log:
# ใน /etc/audit/auditd.conf ของ remote server
tcp_listen_port = 60
tcp_listen_queue = 5
tcp_max_per_addr = 1
ตรวจสอบว่า auditd ทำงานถูกต้อง
# ตรวจสอบ status
sudo systemctl status auditd
# ดู rule ที่โหลดอยู่
sudo auditctl -l
# ดู stats ของ audit system
sudo auditctl -s
# ทดสอบ: แก้ไขไฟล์ที่ monitor แล้วดู log
echo "test" | sudo tee -a /etc/hosts
sudo ausearch -k network_config -ts today
# ตรวจว่า log ถูกเขียน
sudo tail -20 /var/log/audit/audit.log
auditctl -s แสดง enabled 2 แปลว่า audit อยู่ในโหมด locked — ไม่สามารถแก้ rule ได้จนกว่าจะ reboot ซึ่งเป็นพฤติกรรมตั้งใจจาก -e 2 ในไฟล์ ruleแก้ปัญหาที่พบบ่อย
Error: "backlog limit exceeded"
เกิดเมื่อ event เกิดเร็วกว่าที่ daemon จะเขียน log ทัน ทำให้ event ถูกทิ้ง
# เพิ่ม buffer
sudo auditctl -b 16384
# หรือแก้ในไฟล์ rule
echo "-b 16384" | sudo tee -a /etc/audit/rules.d/99-custom.rules
sudo augenrules --load
Error: "audit: audit_backlog=322 > audit_backlog_limit=320"
เพิ่ม kernel parameter:
sudo sysctl -w kernel.audit_backlog_limit=8192
echo "kernel.audit_backlog_limit=8192" | sudo tee -a /etc/sysctl.d/99-audit.conf
auditd ไม่ start: "Cannot open /var/log/audit"
sudo mkdir -p /var/log/audit
sudo chmod 700 /var/log/audit
sudo chown root:root /var/log/audit
sudo systemctl start auditd
ausearch ไม่แสดงผล (no matches)
ตรวจสอบว่า key ถูกต้องและ log ยังไม่ถูก rotate:
# ดู key ทั้งหมดที่มี
sudo ausearch --help | grep key
sudo auditctl -l | grep -k
# ค้นหาแบบไม่ใช้ key
sudo ausearch -m SYSCALL -ts recent
Log ใหญ่เกินไป (disk เต็ม)
# rotate ทันที
sudo service auditd rotate
# ลด verbose — ดู rule ที่ generate event เยอะที่สุด
sudo aureport -s --summary | head -20
# พิจารณาลบ rule ที่ไม่จำเป็น
sudo auditctl -l
คำถามที่พบบ่อย
auditd ต่างจาก syslog อย่างไร?
syslog บันทึก event ที่ application ส่งมา — application ต้องเลือกส่งเอง auditd บันทึกที่ระดับ kernel — ทุก syscall ที่ตรงกับ rule จะถูกบันทึกโดยอัตโนมัติโดยไม่ขึ้นกับ application ทำให้ยาก bypass กว่ามาก และใช้เป็นหลักฐาน forensic ได้
auditd กิน performance เยอะไหม?
ขึ้นอยู่กับจำนวน rule และความถี่ event บน VPS ทั่วไปที่ใช้ rule มาตรฐาน overhead อยู่ที่ 1-3% ของ CPU ถ้าต้องการลด overhead ให้หลีกเลี่ยง rule ที่ monitor syscall บ่อยๆ เช่น read/write แต่ใช้ monitor เฉพาะไฟล์ critical แทน
สามารถส่ง audit log ไปที่ SIEM เช่น Wazuh ได้ไหม?
ได้เลย — Wazuh agent อ่าน /var/log/audit/audit.log โดยตรงและแปลง audit event เป็น alert อัตโนมัติ auditd จึงเป็นแหล่ง log ที่สำคัญที่สุดสำหรับ SIEM บน Linux ถ้ายังไม่มี SIEM แนะนำให้ดูบทความ ติดตั้ง Wazuh SIEM บน VPS