Linux Auditd บันทึกและตรวจสอบกิจกรรมบน VPS
Security Linux Compliance 15 กันยายน 2569

ตั้งค่า 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

สิ่งที่ต้องเตรียม

ขั้นตอนที่ 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
หมายเหตุ: บน Ubuntu 22.04+ auditd อาจถูกติดตั้งมาแล้ว ให้ตรวจสอบด้วย dpkg -l auditd ก่อน

ขั้นตอนที่ 2: ทำความเข้าใจโครงสร้าง auditd

auditd ประกอบด้วยส่วนสำคัญ 3 ส่วน:

ส่วนประกอบหน้าที่ไฟล์
auditddaemon รับและบันทึก 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
Tip: รัน 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
Tip: ถ้า 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