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

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

การติดตั้ง

sudo apt install auditd audispd-plugins
sudo systemctl status auditd

ข้อสังเกตหนึ่ง: ในบางเวอร์ชัน auditd รีสตาร์ตผ่าน systemctl restart ไม่ได้ — บริการถูกจัดการด้วยคำสั่งของตัวเอง กฎถูกอ่านใหม่แบบนี้:

sudo augenrules --load
sudo auditctl -l

คำสั่งที่สองแสดงสิ่งที่โหลดจริง เชื่อมัน อย่าเชื่อเนื้อหาของไฟล์

ชุดกฎ

กฎไปอยู่ใน /etc/audit/rules.d/ เป็นไฟล์แยก ด้านล่างคือชุดขั้นต่ำที่คุ้มค่า: มันตอบคำถามส่วนใหญ่ที่เกิดขึ้นระหว่างเหตุการณ์โดยไม่ฝังกลบดิสก์

sudo tee /etc/audit/rules.d/50-baseline.rules <<'EOF'
## ผู้ใช้และสิทธิ์
-w /etc/passwd -p wa -k identity
-w /etc/shadow -p wa -k identity
-w /etc/group -p wa -k identity
-w /etc/sudoers -p wa -k privileges
-w /etc/sudoers.d/ -p wa -k privileges

## การเข้าถึง SSH
-w /etc/ssh/sshd_config -p wa -k sshd_config
-w /root/.ssh/ -p wa -k ssh_keys

## งานตามตารางเวลา
-w /etc/crontab -p wa -k cron
-w /etc/cron.d/ -p wa -k cron
-w /var/spool/cron/ -p wa -k cron

## โมดูลเคอร์เนล
-w /sbin/insmod -p x -k modules
-w /sbin/modprobe -p x -k modules
-a always,exit -F arch=b64 -S init_module -S delete_module -k modules

## การใช้ sudo และ su
-w /usr/bin/sudo -p x -k privileged
-w /bin/su -p x -k privileged
EOF
sudo augenrules --load

ไวยากรณ์สั้น: -w คือเส้นทางที่เฝ้าดู, -p wa หมายถึงตอบสนองต่อการเขียนและการเปลี่ยนแอตทริบิวต์, -p x ต่อการทำงาน, -k คือคีย์ที่ใช้ค้นหาภายหลัง คีย์เหล่านั้นคือความสะดวกหลัก: ถ้าไม่มีมัน การค้นในเจอร์นัลก็กลายเป็นการร่อนข้อความกิกะไบต์หนึ่ง

อะไรที่ไม่อยู่ในรายการนั้น และทำไม

คู่มือมักแนะนำให้บันทึกทุกการเรียก execve — นั่นคือการเริ่มทำงานของทุกโปรแกรมทุกครั้ง สิ่งล่อใจนั้นเข้าใจได้: ภาพครบถ้วนของสิ่งที่ถูกทำ ในทางปฏิบัติ บนเซิร์ฟเวอร์ที่ใช้งานจริงมันสร้างข้อมูลหลายร้อยเมกะไบต์ต่อวัน กินโปรเซสเซอร์ไปส่วนหนึ่งอย่างเห็นได้ชัด และทำให้เจอร์นัลถูกตัดก่อนที่จะได้ใช้ ถ้าต้องการรายละเอียดระดับนั้น ให้เปิดใช้อย่างจำกัด — สำหรับผู้ใช้คนเดียว หรือสำหรับช่วงเวลาการสอบสวน

เรื่องเดียวกันใช้กับการเฝ้าดูไดเรกทอรีของเว็บไซต์: การเขียนลงในนั้นเกิดขึ้นตลอดเวลา และกฎก็เปลี่ยนเจอร์นัลให้เป็นกระแสของเหตุการณ์ที่ไร้ความหมาย

การอ่าน

ค้นตามคีย์ พร้อมแปลงตัวระบุตัวเลขเป็นชื่อ:

sudo ausearch -k identity -i
sudo ausearch -k privileges -i -ts today

ธง -i จำเป็นเพื่อให้อ่านได้: ถ้าไม่มีมันคุณจะได้ตัวเลขแทนชื่อผู้ใช้และการเรียกระบบ -ts จำกัดช่วงเวลา (today, recent หรือวันที่เจาะจง)

สรุปของช่วงเวลา:

sudo aureport --summary -i
sudo aureport --auth -i --failed

ในบันทึกเหตุการณ์มีสามฟิลด์ที่น่าสนใจ: auid ตัวระบุของผู้ใช้ที่เริ่มเซสชัน, uid ตัวตนที่การกระทำนั้นทำงานภายใต้ และ exe โปรแกรมที่ดำเนินการ ความต่างระหว่าง auid กับ uid คือคำตอบของ «ใครกันแน่ที่กลายเป็น root»: uid=0 พร้อม auid ของบุคคลหนึ่งระบุตัวผู้กระทำได้อย่างไม่กำกวม ไม่ว่าเขาจะอ้างว่าเป็นใครภายในเซสชันก็ตาม

ดิสก์

การตั้งค่าขนาดอยู่ใน /etc/audit/auditd.conf:

max_log_file = 50
num_logs = 5
max_log_file_action = ROTATE
space_left = 500
space_left_action = SYSLOG

ดู disk_full_action แยกต่างหาก บางการตั้งค่ามีค่าเริ่มต้นเป็นการหยุดระบบเมื่อดิสก์เต็ม — พฤติกรรมที่สมเหตุสมผลบนเครื่องที่มีข้อกำหนดด้านการตรวจสอบ และไม่เข้ากันเลยบนเว็บเซิร์ฟเวอร์ ตรวจค่านั้นก่อนดิสก์จะหมด

กฎที่เปลี่ยนแปลงไม่ได้

บรรทัด -e 2 ที่ท้ายไฟล์กฎห้ามการเปลี่ยนกฎจนกว่าจะรีบูต — รวมถึงโดยคนที่ได้ root มาแล้ว นั่นเพิ่มคุณค่าของเจอร์นัลอย่างเห็นได้ชัด: ผู้บุกรุกปิดการเฝ้าดูไม่ได้หากไม่รีบูตเครื่อง และการรีบูตก็เด่นชัดในตัวมันเอง

ด้านกลับก็ชัดเจน: คุณเองก็เปลี่ยนกฎของตัวเองไม่ได้หากไม่รีบูต เปิดใช้มันเมื่อชุดกฎลงตัวแล้วและคุณอยู่กับมันมาหนึ่งเดือน

ทำไมต้องมีบนเซิร์ฟเวอร์ธรรมดา

auditd ไม่ป้องกันอะไรเลย คุณค่าของมันแสดงออกเพียงครั้งเดียว — เมื่อต้องประกอบลำดับเหตุการณ์ขึ้นมาใหม่ และข้อมูลก็มีหรือไม่มีเท่านั้น มันเก็บย้อนหลังไม่ได้ นั่นคือเหตุผลที่ชุดกฎถูกวางไว้ล่วงหน้าแล้วปล่อยไว้เฉย ๆ

สัญญาณในทางปฏิบัติว่าการตั้งค่าถูกต้อง: รายการกฎไม่ว่างเปล่า เจอร์นัลไม่โตอย่างควบคุมไม่ได้ และเหตุการณ์ที่มีคีย์ identity กับ privileges ปรากฏไม่บ่อยและอธิบายได้ทุกครั้ง ภาพบนหน้าเดียวเป็นอย่างไรดูได้ที่เดโมด้านล่าง