auditd: บันทึกว่าใครทำอะไรบน Linux Server เพื่อการตรวจสอบ

ตั้ง auditd บันทึกว่าใครแก้ /etc/passwd หรือ sudoers และรันคำสั่งอะไรแม้ใช้ sudo ค้นด้วย ausearch สรุปด้วย aureport คุมขนาดล็อก และส่งล็อกออกนอกเครื่อง

โดย ทีมงาน THAI DATA CLOUD อ่าน 12 นาที

แชร์FacebookXLINELinkedIn
auditd — auditd: บันทึกว่าใครทำอะไรบน Linux Server เพื่อการตรวจสอบ
auditd: บันทึกว่าใครทำอะไรบน Linux Server เพื่อการตรวจสอบ

คำตอบสั้น ๆ: ตั้ง 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 กลาง
แผนภาพเส้นทางเหตุการณ์จากผู้ใช้ที่ล็อกอินและใช้ sudo ผ่านเคอร์เนล Audit ไปยัง auditd ausearch และเซิร์ฟเวอร์ล็อกกลาง
แม้ผู้ใช้จะกลายเป็น root ด้วย sudo ค่า auid ยังชี้กลับไปที่บัญชีที่ล็อกอินจริงเสมอ

ขั้นตอนที่ 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 ของเครื่อง

ผลคำสั่ง ausearch แบบ text แสดง somchai ใช้สิทธิ์ root แก้ไฟล์ใน sudoers.d และรันคำสั่ง พร้อมรายงานสรุปตามป้ายชื่อจาก aureport ของ auditd
ชื่อหน้า acting as คือบัญชีที่ล็อกอินจริง ส่วนชื่อหลัง acting as คือสิทธิ์ที่ใช้ตอนนั้น

ขั้นตอนที่ 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 นับโปรแกรมที่ถูกรันมากที่สุด ช่วยหาสคริปต์ที่ทำให้ล็อกโตเร็ว

ขั้นตอนที่ 5: คุมขนาดล็อกของ auditd

auditd หมุนไฟล์เองตามค่าใน /etc/audit/auditd.conf ห้ามใช้ logrotate กับ audit.log เพราะจะชนกับการหมุนของ auditd ค่าที่ควรรู้มีดังนี้

max_log_file = 50
num_logs = 10
max_log_file_action = ROTATE
space_left = 75
space_left_action = SYSLOG
admin_space_left = 50
admin_space_left_action = SUSPEND
disk_full_action = SUSPEND

max_log_file มีหน่วยเป็น MB ตัวอย่างนี้เก็บได้ประมาณ 500 MB ก่อนไฟล์เก่าสุดถูกลบ ค่าเริ่มต้นคือ 8 MB และ 5 ไฟล์ ซึ่งเครื่องที่บันทึกทุกคำสั่งอาจเก็บได้แค่ไม่กี่วัน space_left และ admin_space_left คือพื้นที่ว่างเป็น MB ที่ทำให้ auditd เริ่มเตือนและหยุดเขียน ส่วน SUSPEND คือหยุดบันทึกแต่เครื่องทำงานต่อ อย่าตั้ง HALT บนเซิร์ฟเวอร์ทั่วไป เพราะดิสก์เต็มจะทำให้เครื่องปิดตัวเอง หลังแก้ไฟล์ ให้รีสตาร์ตบริการ

# Ubuntu / Debian
sudo systemctl restart auditd

# AlmaLinux / Rocky Linux (systemctl ไม่อนุญาตให้หยุด auditd ด้วยมือ)
sudo service auditd restart

ขั้นตอนที่ 6: ส่งล็อกออกไปเก็บนอกเครื่อง

ผู้บุกรุกที่ได้สิทธิ์ root ลบหรือแก้ audit.log บนเครื่องได้ ล็อกของ auditd ที่เชื่อถือได้จึงต้องมีสำเนาอยู่ที่อื่น วิธีที่ง่ายที่สุดคือเปิดปลั๊กอิน syslog ของ auditd แล้วให้ rsyslog ส่งต่อไปยังเซิร์ฟเวอร์ล็อกกลาง เปิดไฟล์ /etc/audit/plugins.d/syslog.conf (บน Ubuntu 20.04 อยู่ที่ /etc/audisp/plugins.d/ ถ้ายังไม่มีไฟล์ให้ติดตั้งแพ็กเกจ audispd-plugins) แล้วเปลี่ยนบรรทัด active จาก no เป็น yes บรรทัดอื่นคงค่าเดิมของแพ็กเกจไว้

sudo sed -i 's/^active = no/active = yes/' /etc/audit/plugins.d/syslog.conf
grep -E '^(active|args)' /etc/audit/plugins.d/syslog.conf

รีสตาร์ต auditd ตามขั้นตอนที่ 5 แล้วตั้ง rsyslog ให้ส่งต่อตาม คู่มือรวม Log จากหลายเครื่องด้วย rsyslog ถ้ากฎ execve ทำให้ปริมาณล็อกสูงเกินไป ให้กรองที่ rsyslog เฉพาะบรรทัดที่มี key="identity", key="sudoers" หรือ key="sshd_config" ส่งออกก่อน ส่วนทางเลือกอีกแบบคือปลั๊กอิน audisp-remote ที่ส่งไปยัง auditd อีกเครื่องโดยตรง

ขั้นตอนที่ 7: ล็อกกฎไม่ให้แก้ได้ระหว่างเครื่องทำงาน

เมื่อกฎนิ่งแล้ว ให้ล็อกกฎไว้เพื่อไม่ให้ผู้บุกรุกปิดการบันทึกด้วย auditctl -D สร้างไฟล์ /etc/audit/rules.d/99-finalize.rules ที่มีบรรทัดเดียว

-e 2

หลังโหลดกฎด้วย sudo augenrules --load หรือรีบูต การเปลี่ยนกฎทุกอย่างจะต้องรีบูตเครื่องเท่านั้น ทำขั้นตอนนี้เป็นอย่างสุดท้ายหลังทดสอบกฎครบแล้ว และแจ้งทีมให้รู้ว่าการแก้กฎต้องวางแผนรีบูต

เช็กลิสต์การตั้ง auditd ให้ใช้เป็นหลักฐาน ตั้งแต่บัญชีรายบุคคล กฎที่ตรวจแล้ว ขนาดล็อก การส่งออกนอกเครื่อง จนถึงสิ่งที่ไม่ควรทำ
ล็อกที่อยู่บนเครื่องเดียวกับผู้บุกรุกไม่นับเป็นหลักฐานที่เชื่อถือได้ ต้องมีสำเนานอกเครื่อง

ปัญหาที่พบบ่อยเกี่ยวกับ auditd

ทำไม ausearch แสดง auid=unset หรือ 4294967295?

เหตุการณ์นั้นมาจากโปรเซสที่ไม่ได้เริ่มจากการล็อกอิน เช่น บริการที่ systemd เปิดตอนบูต หรือมาจากโปรแกรมที่ PAM ไม่ได้ตั้ง loginuid ถ้าเป็นการล็อกอินผ่าน SSH ให้ตรวจว่าไฟล์ /etc/pam.d/sshd มี pam_loginuid.so

auditd บันทึกสิ่งที่ผู้ใช้พิมพ์ในโปรแกรมแก้ไฟล์หรือรหัสผ่านด้วยหรือไม่?

กฎในคู่มือนี้บันทึกโปรแกรมที่ถูกรันและพารามิเตอร์ ไม่ได้บันทึกสิ่งที่พิมพ์ภายในโปรแกรม แต่พารามิเตอร์ของคำสั่งอาจมีรหัสผ่านถ้าผู้ใช้พิมพ์ไว้ในบรรทัดคำสั่ง จึงต้องจำกัดสิทธิ์อ่าน audit.log ให้เฉพาะผู้ดูแลที่จำเป็น

เปิดกฎ execve แล้วเครื่องช้าลงหรือไม่?

มีผลเล็กน้อยกับเครื่องทั่วไป แต่เครื่องที่รันสคริปต์สั้น ๆ หลายพันครั้งต่อนาทีจะเห็นทั้ง CPU และขนาดล็อกเพิ่มขึ้น ให้ดู aureport -x --summary ว่าโปรแกรมใดถูกรันมากที่สุด แล้วแยกบัญชีอัตโนมัตินั้นออกด้วยเงื่อนไข -F auid!= ตามด้วย UID ของบัญชีนั้น

audit log ต้องเก็บนานเท่าไร?

ขึ้นกับนโยบายขององค์กรและกฎหมายที่เกี่ยวข้อง ผู้ให้บริการบางประเภทมีหน้าที่เก็บข้อมูลจราจรทางคอมพิวเตอร์ตาม พ.ร.บ.คอมพิวเตอร์ ให้ยืนยันกับที่ปรึกษากฎหมายว่าองค์กรของคุณต้องเก็บอะไรและนานเท่าไร แล้วตั้งขนาดล็อกและการส่งออกนอกเครื่องให้รองรับระยะนั้น

ถ้าต้องการให้ทีมงานช่วยวางกฎ audit ให้เหมาะกับงาน ตั้งระบบเก็บล็อกกลาง หรือเตรียมหลักฐานสำหรับการตรวจสอบ ติดต่อทีมงาน THAI DATA CLOUD ได้ และดูบริการเฝ้าระวังความปลอดภัยแบบต่อเนื่องได้ที่หน้า Managed Security Services

อ่านเพิ่มเติมเกี่ยวกับ auditd

แชร์FacebookXLINELinkedIn

มีคำถามเรื่องบริการ? ติดต่อทีมงาน