การตรวจสอบไฟล์ใน Linux: วิธีดูทรีไดเรกทอรีสำหรับการลบ?


9

ฉันมีสคริปท์ฟอรัมอยู่บนเซิร์ฟเวอร์และไฟล์แนบขนาดเล็กเริ่มหลงทาง ฉันต้องการค้นหาสิ่งที่กำลังลบและในเวลาใด ฉันจะตั้งค่า Linux auditd (auditctl) เพื่อดูแผนผังไดเรกทอรี (สิ่งที่แนบมาจะถูกเก็บไว้ในแผนผังไดเรกทอรีหลายระดับ) เพื่อดูการลบไฟล์ที่นั่นได้อย่างไร

ฉันควรใช้เครื่องมืออื่นสำหรับสิ่งนี้ได้ไหม

คำตอบ:


8

นี่คือคำตอบที่ฉันเขียนถึงคำถามก่อนหน้า:

โดยทั่วไปหากคุณต้องการทราบว่ากระบวนการ / ผู้ใช้ / ไฟล์กำลังทำอะไรโดยไม่ต้องเรียกใช้ lsof กับ 24/7 คุณใช้ auditctl

สมมติว่าคุณมีการควบคุมการตรวจสอบเคอร์เนล-ish ที่ผ่านมาควรจะเป็นการดำเนินการอย่างง่าย (นี่เป็นภาษาเดเบียน - ฟูถ้าคุณใช้ Red Hat แปลตามความเหมาะสม)

# apt-get install auditd

ตรวจสอบให้แน่ใจว่าสถานะกำลังทำงาน (/etc/init.d/auditd)

auditctl -a entry,always -F arch=b64 -S open -F pid=<process id>

แทนที่ b64 ด้วย b32 หากคุณใช้งานอาร์คแบบ 32 บิตการเปิดสามารถถูกแทนที่ด้วยการเรียกของระบบหรือคำว่า 'all'

สำหรับการอ่านเพิ่มเติม manctctctl

คุณสามารถใช้วิธีนี้และขอให้ดูการโทรของระบบ 'unlink'

พารามิเตอร์ -w มีประโยชน์สำหรับการดูไฟล์ / ไดเรกทอรี แต่ในขณะที่หน้าคนอธิบายว่ามี caveats

-w พา ธ แทรกนาฬิกาสำหรับวัตถุระบบไฟล์ที่เส้นทาง คุณไม่สามารถแทรกนาฬิกาในไดเรกทอรีระดับบนสุด สิ่งนี้ถูกห้ามโดยเคอร์เนล ไม่สนับสนุนการใช้สัญลักษณ์แทนและจะสร้างคำเตือน วิธีการดูการทำงานคือการติดตาม inode ภายใน ซึ่งหมายความว่าหากคุณวางการเฝ้าดูในไดเรกทอรีคุณจะเห็นสิ่งที่ดูเหมือนจะเป็นเหตุการณ์ไฟล์ แต่จริงๆแล้วเป็นเพียงการอัปเดตข้อมูลเมตา คุณอาจพลาดเหตุการณ์บางอย่างด้วยการทำเช่นนี้ หากคุณต้องการดูไฟล์ทั้งหมดในไดเรกทอรีแนะนำให้ทำการวางแต่ละไฟล์ในแต่ละไฟล์ ซึ่งแตกต่างจากกฎการตรวจสอบ syscall นาฬิกาไม่ส่งผลกระทบต่อประสิทธิภาพการทำงานขึ้นอยู่กับจำนวนของกฎที่ส่งไปยังเคอร์เนล


ฉันไม่สามารถ :( ฉันได้ PHP ทำงานในโหมด CGI ก็มักจะเป็นกระบวนการใหม่มีนอกจากนี้ฉันไม่ต้องการที่จะดูขั้นตอนเดียว แต่ดูส่วนใดส่วนหนึ่งของระบบแฟ้มสำหรับการปรับเปลี่ยน...
วลา Rastrusny

ใช่เห็นการแก้ไขที่ฉันทำมีพารามิเตอร์สำหรับการดูไดเรกทอรีระบบแฟ้ม แต่มีคำเตือนหรือไฟล์
Aaron Tate

มีโฟลเดอร์ประมาณ 1,000 โฟลเดอร์และไฟล์ประมาณ 50k ดังนั้นนี่จะไม่ทำงาน ... :(
Vladislav Rastrusny

โดยทั่วไปตราบใดที่คุณทราบ caveats คุณควรจะสามารถไปข้างหน้าและวางนาฬิกาในไดเรกทอรีระดับบนสุดที่มีโฟลเดอร์ที่คุณต้องการดู
Aaron Tate

ฉันต้องทำสิ่งเดียวกัน (ดูโฟลเดอร์สำหรับการลบเพื่อให้สามารถค้นหาชื่อ PID / กระบวนการที่ทำ) แต่ดูเหมือนจะไม่ทำงาน (อย่างน้อยบนเคอร์เนล 3.x) ถ้าฉันเรียกใช้ "auditctl -a entry -F arch = b64 -S unlink -w / path / to / dir" เสมอเพื่อติดตามการลบแล้วฉันจะได้รับ "ตัวเลือกการเฝ้าดูไม่สามารถให้กับ syscall" ใครมีความคิดเห็นบ้าง
IBBoard


0

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

อีกแนวคิดหนึ่งคือการใช้งานinotifywaitจากนั้นlsof/fuserในไฟล์เพื่อดูว่ามีการใช้อะไร คุณสามารถลองเรียกใช้สคริปต์นี้ในลำดับความสำคัญสูง (หากคุณสามารถ) เพื่อให้ได้ข้อมูลที่ถูกต้องที่สุด มันอาจจะไม่ได้รับunlinkสายเนื่องจากไฟล์จะหายไปก่อนที่จะมีการส่งมอบเหตุการณ์


ฉันไม่สามารถ. ฉันไม่ทราบว่าจะเรียกใช้ strace บนกระบวนการใดเพราะฉันพบไฟล์ที่ถูกลบหลังจากผ่านไประยะหนึ่ง inotifywait จะไม่ทำงานเนื่องจาก PHP ทำงานเป็น CGI และมีกระบวนการ PHP จำนวนมากที่มีรหัสที่แตกต่างกันออกไป
Vladislav Rastrusny

inotify ใช้เพื่อตรวจสอบระบบไฟล์ไม่ใช่กระบวนการที่กำลังทำงานอยู่ สำหรับ strace คุณต้องติดตามกระบวนการพาเรนต์หลักพร้อมกับ-fแฟล็กเพื่อติดตามลูก ๆ
Dan Andreatta

0

แม้ว่าคำแนะนำในการตรวจสอบของ fenix นั้นดูจะเหมาะสม แต่คุณอาจพบ IDS ของระบบไฟล์เช่นAIDE มีประโยชน์ น่าเสียดายที่มันไม่น่าจะมีความละเอียดเพียงพอสำหรับสิ่งที่คุณพยายามจะแยก

ฉันมักจะเขียนสคริปต์เป็นวิธีแก้ปัญหาเช่นสิ่งที่คุณอธิบาย หากคุณไม่สามารถทำสิ่งที่คุณต้องการได้ด้วยการแนะนำวิธีแก้ปัญหาให้เขียนบางอย่างด้วยตัวเอง มันมักจะไม่ซับซ้อนมาก


ดูเหมือนว่าเป็นเพียงการระบุตำแหน่งการเปลี่ยนแปลงไฟล์ ไม่ได้สำหรับการตรวจสอบเรียลไทม์
Vladislav Rastrusny
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.