ตรวจสอบกิจกรรมเซิร์ฟเวอร์ด้วย Linux Auditd บน VPS
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 ช่วยตอบคำถามเหล่านี้:
- ใคร login เข้าระบบเมื่อไร และ login สำเร็จหรือไม่
- มีใครเปิดหรือแก้ไขไฟล์
/etc/passwd,/etc/shadowหรือเปล่า - มีการ
sudoหรือsuเป็น root เมื่อไร - process ไหนเปิด network connection ออกไปภายนอก
- มีการสร้างหรือลบ user account ในระบบ
ต่างจาก 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
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
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 ให้พร้อม