ตรวจสอบกิจกรรมเซิร์ฟเวอร์ด้วย Linux Auditd บน VPS

ตรวจสอบกิจกรรมเซิร์ฟเวอร์ด้วย Linux Auditd บน VPS

กันยายน 2026 · อ่าน 8 นาที

Linux Audit Daemon (auditd) คือระบบ kernel-level auditing ที่บันทึกทุกกิจกรรมสำคัญบนเซิร์ฟเวอร์ตามกฎที่กำหนด ไม่ว่าจะเป็นการเข้าถึงไฟล์ระบบ การ login/logout การเรียก system call หรือการเปลี่ยนแปลง permission — auditd บันทึกทั้งหมดลงใน audit log ที่ตรวจสอบย้อนหลังได้ เหมาะสำหรับ VPS ที่ต้องการ compliance เช่น PCI-DSS, HIPAA หรือเพียงต้องการตรวจสอบว่าใครทำอะไรกับเซิร์ฟเวอร์บ้าง

ทำไมต้องใช้ auditd บน VPS

เครื่องมือ security อื่น เช่น fail2ban ป้องกันการโจมตีจากภายนอก แต่ auditd ทำงานในระดับ kernel ช่วยตอบคำถามเหล่านี้:

ต่างจาก syslog ที่ application เลือกเองว่าจะ log อะไร auditd ทำงานที่ระดับ kernel ดังนั้นไม่มีทางหลีกเลี่ยงได้หากตั้งกฎไว้ถูกต้อง

ติดตั้ง auditd

# Ubuntu / Debian
sudo apt update && sudo apt install auditd audispd-plugins -y

# RHEL / Rocky Linux / AlmaLinux / CentOS
sudo dnf install audit audit-libs -y

# ตรวจสอบเวอร์ชัน
auditctl --version

# เปิดใช้งานและ start service
sudo systemctl enable auditd --now

# ดูสถานะ
sudo systemctl status auditd

โครงสร้างไฟล์สำคัญ

ไฟล์ / ไดเรกทอรีหน้าที่
/etc/audit/auditd.confตั้งค่า daemon หลัก เช่น log path, rotation, disk space
/etc/audit/rules.d/ไดเรกทอรีสำหรับไฟล์ rule (persist ข้าม reboot)
/etc/audit/audit.rulesรวม rule ทั้งหมดที่ใช้จริง (สร้างอัตโนมัติ)
/var/log/audit/audit.logไฟล์ log หลักที่บันทึกทุก event

ตั้งค่า auditd.conf พื้นฐาน

sudo nano /etc/audit/auditd.conf

แก้ค่าสำคัญเหล่านี้:

# จำนวนไฟล์ log ที่เก็บไว้ (rotation)
num_logs = 10

# ขนาดไฟล์ log สูงสุด (MB) ก่อน rotate
max_log_file = 20

# จะทำอะไรเมื่อ disk เหลือน้อย
space_left_action = SYSLOG
admin_space_left_action = SUSPEND

# จะทำอะไรเมื่อ disk เต็มสนิท
disk_full_action = SUSPEND
disk_error_action = SUSPEND
Tip: บน VPS ที่ disk เล็ก ให้ตั้ง num_logs = 5 และ max_log_file = 10 เพื่อกันไม่ให้ audit log กินพื้นที่มากเกินไป

เขียน Audit Rules

สร้างไฟล์ rule ใหม่ใน /etc/audit/rules.d/:

sudo nano /etc/audit/rules.d/50-security.rules

ใส่ rule ต่อไปนี้:

# ลบ rule เดิมทั้งหมด
-D

# ตั้ง buffer size (เพิ่มหากเกิด backlog)
-b 8192

# ป้องกันแก้ไข rule ขณะ runtime
-e 1

## === ตรวจสอบ Identity / Authentication ===
-w /var/log/wtmp -p wa -k logins
-w /var/log/btmp -p wa -k logins
-w /var/log/lastlog -p wa -k logins
-w /var/run/utmp -p wa -k session

# ไฟล์ user/group
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/gshadow -p wa -k identity
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers

## === ตรวจสอบ SSH ===
-w /etc/ssh/sshd_config -p wa -k ssh_config
-w /root/.ssh/ -p war -k ssh_keys

## === ตรวจสอบ System Calls สำคัญ ===
-a always,exit -F arch=b64 -S execve -F euid=0 -F auid>=1000 -F auid!=4294967295 -k privilege_escalation
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F auid>=1000 -k permission_change
-a always,exit -F arch=b64 -S chown,fchown,fchownat,lchown -F auid>=1000 -k ownership_change
-a always,exit -F arch=b64 -S mount -F auid>=1000 -k mounts

## === ตรวจสอบไฟล์ระบบสำคัญ ===
-w /etc/crontab -p wa -k cron
-w /etc/cron.d/ -p wa -k cron
-w /var/spool/cron/ -p wa -k cron
-w /etc/hosts -p wa -k network_config
-w /etc/sysctl.conf -p wa -k kernel_config
-w /sbin/iptables -p x -k firewall
-w /sbin/nft -p x -k firewall

โหลด rule ใหม่:

# โหลด rule ทันที (ไม่ต้อง restart)
sudo augenrules --load

# หรือ restart service
sudo systemctl restart auditd

# ตรวจสอบว่า rule โหลดสำเร็จ
sudo auditctl -l

อ่านและค้นหา Audit Log

คำสั่ง ausearch และ aureport ช่วยกรองและแปลง audit log ให้อ่านง่ายขึ้น:

# ดู event ทั้งหมดวันนี้
sudo ausearch --start today

# ค้นหา event จาก key ที่กำหนด
sudo ausearch -k identity
sudo ausearch -k sudoers
sudo ausearch -k ssh_keys

# ค้นหาจาก user
sudo ausearch -ua root --start today

# ดู login failure
sudo ausearch -m USER_AUTH --success no --start today

# รายงานสรุป authentication
sudo aureport -au

# รายงาน sudo ทั้งหมด
sudo aureport --comm -i | grep sudo

# แปลง raw log เป็นรูปแบบอ่านง่าย
sudo ausearch -k identity | aureport --file -i

ใช้ audispd-plugins ส่ง log ไป syslog

ปกติ audit log จะอยู่ที่ /var/log/audit/audit.log เท่านั้น หากต้องการส่งไปยัง syslog หรือ SIEM ด้วย:

# แก้ไข plugin config (Ubuntu/Debian)
sudo nano /etc/audisp/plugins.d/syslog.conf

# เปลี่ยน active = no เป็น
active = yes

# restart auditd
sudo systemctl restart auditd

# ตรวจสอบว่า log ไปถึง syslog
sudo grep audit /var/log/syslog | tail -20

ตรวจสอบว่า auditd ทำงานถูกต้อง

# ดูสถานะ daemon
sudo systemctl status auditd

# ดู rule ที่โหลดอยู่
sudo auditctl -l

# ดู audit status
sudo auditctl -s

# ทดสอบ: แก้ /etc/passwd แล้วดู log
sudo touch /etc/passwd
sudo ausearch -k identity --start recent

# ดูจำนวน event ทั้งหมดวันนี้
sudo aureport --start today --summary

# ดู backlog ปัจจุบัน (ควรเป็น 0 หรือต่ำ)
sudo auditctl -s | grep backlog
Tip: หาก backlog สูงเกิน 1000 ให้เพิ่มค่า -b ใน rule file เป็น 16384 หรือมากกว่า เพื่อกันไม่ให้ event หาย

แก้ปัญหาที่พบบ่อย

Error: "audit: backlog limit exceeded"

เกิดเมื่อ event เพิ่มเร็วกว่า daemon จะประมวลผลได้ kernel จะเริ่มทิ้ง event

# เพิ่ม buffer ใน /etc/audit/rules.d/50-security.rules
-b 16384

# reload
sudo augenrules --load

# ตรวจสอบ
sudo auditctl -s | grep backlog_limit

Error: "auditd: Cannot open /var/log/audit/audit.log"

ไดเรกทอรี log หายหรือ permission ผิด

sudo mkdir -p /var/log/audit
sudo chmod 700 /var/log/audit
sudo chown root:root /var/log/audit
sudo systemctl restart auditd

Error: "Rule exists" เมื่อ augenrules --load

มี rule ซ้ำกันในไฟล์ต่างๆ ภายใน rules.d

# ดู rule ที่โหลดอยู่ทั้งหมด
sudo auditctl -l

# ตรวจสอบว่าไฟล์ rule ใดมี rule ซ้ำ
ls /etc/audit/rules.d/
cat /etc/audit/rules.d/*.rules | sort | uniq -d

Error: "auditd: Unable to set audit daemon PID"

มักเกิดบน container หรือ VPS บางประเภทที่ kernel ไม่รองรับ audit subsystem

# ตรวจสอบว่า kernel รองรับ audit
grep -i audit /boot/config-$(uname -r) | head

# ดู kernel message
dmesg | grep audit

Log file ใหญ่เกินไปเต็ม disk

ตั้ง rotation ให้ถี่ขึ้นใน auditd.conf

# แก้ /etc/audit/auditd.conf
max_log_file = 10
num_logs = 5
max_log_file_action = ROTATE

sudo systemctl restart auditd

# ตรวจสอบขนาด
du -sh /var/log/audit/

Error: "-F auid!=4294967295" ใน rule

ค่า 4294967295 คือ -1 ใน unsigned คือ unset UID บน kernel รุ่นใหม่ใช้ unset แทนได้

# kernel >= 3.x รองรับ
-F auid!=unset

# kernel เก่า ใช้ค่า numeric
-F auid!=4294967295

คำถามที่พบบ่อย

auditd ต่างจาก syslog อย่างไร?

syslog บันทึกข้อมูลที่ application เลือกส่งมาเอง ในขณะที่ auditd ทำงานในระดับ Linux kernel — ทุก system call ที่ตรงกับ rule จะถูกบันทึกโดยอัตโนมัติ ไม่ขึ้นกับว่า application จะ log เองหรือไม่ ทำให้ audit log มีความน่าเชื่อถือสูงกว่าสำหรับการตรวจสอบด้านความปลอดภัย

auditd ทำให้เซิร์ฟเวอร์ช้าลงไหม?

มีผลกระทบเล็กน้อย ขึ้นอยู่กับจำนวน rule และ traffic บนเซิร์ฟเวอร์ ในทางปฏิบัติ VPS ทั่วไปจะสังเกตเห็นความแตกต่างไม่มากนัก ควรหลีกเลี่ยง rule ที่ monitor execve ทุก process (โดยไม่กรอง) เพราะจะสร้าง event จำนวนมากและมีผลต่อ performance

จะส่ง audit log ไปยัง SIEM ได้อย่างไร?

ใช้ audispd-plugins เพื่อส่ง event ไปยัง syslog แล้วต่อด้วย Filebeat, Fluentd หรือ rsyslog เพื่อส่งต่อไปยัง Elasticsearch, Splunk, Graylog หรือ SIEM ที่ใช้อยู่ อีกทางเลือกคือใช้ Wazuh ซึ่ง integrate กับ auditd โดยตรงและมี UI สำหรับ analyze event ให้พร้อม