คำตอบสั้น ๆ: ตั้ง auditd บันทึกว่าใครแก้ /etc/passwd หรือ sudoers และรันคำสั่งอะไรแม้ใช้ sudo ค้นด้วย ausearch สรุปด้วย aureport คุมขนาดล็อก และส่งล็อกออกนอกเครื่อง
คู่มือนี้อธิบาย auditd ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
auditd คือบริการของ Linux Audit Framework ที่บันทึกเหตุการณ์ระดับเคอร์เนลตามกฎที่ผู้ดูแลกำหนด เช่น ใครแก้ไฟล์ /etc/passwd ใครเปิดไฟล์ sudoers และผู้ใช้แต่ละคนรันคำสั่งอะไรบ้าง จุดเด่นของ auditd คือเก็บค่า auid (audit UID) ซึ่งเป็นตัวตนตอนล็อกอินที่ไม่เปลี่ยนแม้ผู้ใช้จะใช้ sudo -i หรือ su กลายเป็น root แล้ว จึงตอบคำถาม "ใครทำ" ได้ ไม่ใช่แค่ "root ทำ"
คู่มือนี้เหมาะกับผู้ดูแล Linux Server ที่มีหลายคนเข้าเครื่องเดียวกัน หรือต้องมีหลักฐานการใช้งานไว้ตรวจสอบภายหลัง เมื่อทำครบ คุณจะติดตั้งและเปิด auditd เขียนกฎเฝ้าไฟล์บัญชีผู้ใช้ sudoers และคำสั่งที่ผู้ใช้รัน ค้นและสรุปรายงานด้วย ausearch และ aureport คุมขนาดล็อกไม่ให้ดิสก์เต็ม และส่งล็อกออกไปเก็บนอกเครื่อง
สิ่งที่ต้องเตรียม
- สิทธิ์ root หรือ sudo บน Ubuntu, Debian, AlmaLinux หรือ Rocky Linux
- ผู้ดูแลแต่ละคนมีบัญชีของตัวเองและใช้ sudo ถ้าทุกคนล็อกอินด้วย root บัญชีเดียวกัน auditd จะบอกได้แค่ว่า root ทำ ดูการตั้งคีย์รายบุคคลได้ใน คู่มือตั้งค่า SSH Key บน Linux
- พื้นที่ดิสก์สำหรับล็อก ค่าเริ่มต้นเก็บ 5 ไฟล์ ไฟล์ละ 8 MB การบันทึกทุกคำสั่งบนเครื่องที่มีงานอัตโนมัติมากจะใช้พื้นที่เพิ่มขึ้นเร็ว
- ปลายทางเก็บล็อกนอกเครื่อง (ถ้ามี) เช่น เซิร์ฟเวอร์ rsyslog กลาง
ขั้นตอนที่ 1: ติดตั้งและเปิดบริการ auditd
บน AlmaLinux และ Rocky Linux มีแพ็กเกจ audit ติดตั้งและทำงานอยู่แล้ว บน Ubuntu และ Debian ต้องติดตั้งเอง
# Ubuntu / Debian
sudo apt update
sudo apt install auditd audispd-plugins
# AlmaLinux / Rocky Linux (ถ้ายังไม่มี)
sudo dnf install audit audispd-plugins
sudo systemctl enable --now auditd
sudo auditctl -s
ผลของ auditctl -s ต้องมีบรรทัด enabled 1 และค่า lost 0 ถ้า lost เพิ่มขึ้นเรื่อย ๆ แปลว่าบัฟเฟอร์ของเคอร์เนลไม่พอ ให้เพิ่ม -b 8192 ในไฟล์กฎ ล็อกทั้งหมดอยู่ที่ /var/log/audit/audit.log
ขั้นตอนที่ 2: เขียนกฎเฝ้าไฟล์สำคัญและคำสั่งของผู้ใช้
กฎถาวรของ auditd อยู่ในโฟลเดอร์ /etc/audit/rules.d/ ระบบรวมทุกไฟล์ในโฟลเดอร์ตามลำดับชื่อแล้วโหลดตอนบูต สร้างไฟล์ /etc/audit/rules.d/50-admin.rules
## บัญชีผู้ใช้และกลุ่ม
-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
## สิทธิ์ sudo
-w /etc/sudoers -p wa -k sudoers
-w /etc/sudoers.d/ -p wa -k sudoers
## คอนฟิก SSH
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /etc/ssh/sshd_config.d/ -p wa -k sshd_config
## ทุกคำสั่งที่ผู้ใช้ซึ่งล็อกอินจริงรัน (รวมหลัง sudo)
-a always,exit -F arch=b64 -S execve -F auid>=1000 -F auid!=unset -k user_cmd
-a always,exit -F arch=b32 -S execve -F auid>=1000 -F auid!=unset -k user_cmd
-w คือเฝ้าไฟล์หรือโฟลเดอร์ -p wa คือบันทึกเมื่อมีการเขียน (w) หรือเปลี่ยนคุณสมบัติ (a) และ -k คือป้ายชื่อที่ใช้ค้นภายหลัง กฎ execve บันทึกทุกโปรแกรมที่ถูกรันโดยผู้ใช้ที่มี auid ตั้งแต่ 1000 ขึ้นไป ซึ่งเป็นช่วงของบัญชีคนจริงบน Ubuntu และ AlmaLinux ส่วน auid!=unset ตัดบริการระบบที่ไม่ได้มาจากการล็อกอินออก ถ้าทีมยังล็อกอินด้วย root โดยตรง ให้เพิ่มกฎแบบเดียวกันด้วย -F auid=0 แต่จะได้ cron ของ root ปนมาด้วย
โหลดกฎแล้วตรวจว่าเข้าเคอร์เนลครบ
sudo augenrules --load
sudo auditctl -l
รูปแบบกฎทั้งหมดอยู่ในเอกสาร audit.rules(7)
ขั้นตอนที่ 3: ค้นเหตุการณ์ที่ auditd บันทึกด้วย ausearch
ทดสอบโดยให้ผู้ใช้ทั่วไปเพิ่มไฟล์ใน sudoers.d เช่น echo '# test' | sudo tee -a /etc/sudoers.d/deploy แล้วค้นด้วยป้ายชื่อ (ลบไฟล์ทดสอบออกหลังตรวจเสร็จ) ตัวเลือก -i แปลงเลข UID และ syscall เป็นชื่อที่อ่านได้ ส่วน --format text สรุปแต่ละเหตุการณ์เป็นประโยคเดียว
sudo ausearch -k sudoers --start today -i
sudo ausearch -k sudoers --start today --format text
sudo ausearch -k user_cmd --loginuid somchai --start today --format text
sudo ausearch -k identity --start this-week -i
ในผลแบบ -i ให้อ่านฟิลด์เหล่านี้ใน record type=SYSCALL: auid คือบัญชีที่ล็อกอินเข้ามาจริง uid และ euid คือสิทธิ์ที่ใช้ขณะนั้น exe คือโปรแกรม tty และ ses ใช้แยกว่ามาจาก session ใด ส่วน record type=PROCTITLE แสดงบรรทัดคำสั่งเต็ม ค้นตามช่วงเวลาได้ด้วย --start และ --end ซึ่งรับคำอย่าง today, yesterday, this-week หรือวันที่ตามรูปแบบ locale ของเครื่อง
ขั้นตอนที่ 4: สรุปภาพรวมด้วย aureport
เมื่อต้องรายงานผู้บริหารหรือไล่ดูว่าช่วงไหนผิดปกติ aureport สรุปจากล็อกของ auditd ชุดเดียวกันเป็นตาราง
sudo aureport --summary
sudo aureport -k --summary
sudo aureport -l --start this-week
sudo aureport -au --failed --start today
sudo aureport -x --summary --start today
-k --summary นับเหตุการณ์ตามป้ายชื่อ ถ้า identity หรือ sudoers มีจำนวนมากผิดปกติให้ใช้ ausearch เจาะดูต่อ -l คือรายงานการล็อกอิน -au --failed คือการยืนยันตัวตนที่ล้มเหลว ซึ่งใช้คู่กับการป้องกันการเดารหัสผ่านอย่าง Fail2ban และ -x --summary นับโปรแกรมที่ถูกรันมากที่สุด ช่วยหาสคริปต์ที่ทำให้ล็อกโตเร็ว