จะค้นหา pid ของกระบวนการที่ลบไฟล์ได้อย่างไร


13

ฉันกำลังทำงานในโครงการที่เกี่ยวข้องกับการโยกย้าย VM บางครั้งอิมเมจ VM จะหายไปและฉันแค่อยากรู้ว่าใครคือผู้ร้าย ฉันลองใช้กระบวนการที่น่าสงสัย แต่ก็ไม่มีประโยชน์


ผมหวังที่จะหาวิธีที่จะติดตามเรียกระบบยกเลิกการเชื่อมโยงกับกระบวนการแทนเพียงหนึ่งทุกคน แต่ผมคิดว่าไม่มีวิธีที่ง่ายที่จะทำนี้ ...
โมฮัมหมัด

คำตอบ:


14

ในที่สุดผมก็พบคำตอบที่นี่

ภูต Audit Audit ภูตจะทำเคล็ดลับ

sudo auditctl -w /path/to/somefile -p wra

แล้ว

ausearch -f /path/to/somefile -i

ดี แต่มันมีผลต่อประสิทธิภาพอย่างไร
vartec

@vartec ไม่มากเกินไปหลังจากปรับlinux-audit.com/tuning-auditd-high-performance-linux-auditing
Nikolay Fominyh

1

คุณสามารถหา PID lsofของกระบวนการซึ่งมีบางส่วนเปิดไฟล์โดยใช้

เมื่อไฟล์ถูกปิดและลบคุณจะไม่สามารถรับข้อมูลนั้นได้

BTW โปรดทราบว่าการลบไฟล์เป็นการดำเนินการในไดเรกทอรีที่อยู่ไม่ใช่ในไฟล์เอง


น่าเสียดายที่ไม่จำเป็นต้องเปิดไฟล์เพื่อลบ อย่างน้อยตัวอย่างเช่นเอาต์พุต "strace rm some-file" ไม่ได้แสดงว่าคำสั่ง rm เปิดไฟล์ก่อนแล้วจึงลบออก ดังนั้นฉันคิดว่า lsof ไม่เป็นประโยชน์
Mohammad

อ่านประโยคสุดท้ายของคำตอบของฉัน
vartec

1

ให้ฉันแนะนำทางเลือกกับsysdigเนื่องจากคำตอบข้างบนคืออายุ อนุญาตแสดงpidและกระบวนการที่ลบไฟล์name ครั้งแรกที่เราสร้างไฟล์ที่มี/tmp/test touch /tmp/testจากนั้นเราเริ่มต้นsysdigด้วยตัวกรองต่อไปนี้:

$ sudo sysdig -p'%proc.pid,%proc.name' '(evt.type=unlinkat and (evt.arg.name=test or evt.arg.name=/tmp/test)) or (evt.type=unlink and evt.arg.path=/tmp/test)'

unlinkat(2)ต้องการorตัวกรองหากเส้นทาง (เช่นevt.arg.name) อาจสัมพันธ์กัน ในการจัดการทั้งสองunlink(ที่โทรunlink(2)) และrm(ซึ่งโทรunlinkat(2)ในรุ่น GNU ของมัน) ตัวกรองควรตรงกับ syscalls ทั้งสอง

sysdigควรจะทำงานเมื่อกระบวนการลบไฟล์ จากนั้นเมื่อเรารันคำสั่งดังกล่าว:

$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test

มันจะแสดงผลลัพธ์เช่น:

11380,unlink
11407,rm
11662,rm

โปรดดูคู่มือผู้ใช้ sysdigสำหรับคำอธิบายเกี่ยวกับการกรองและการส่งออก

เนื่องจากตัวกรองค่อนข้างยาวฉันจึงพบว่าสะดวกในการเขียนสิ่ว มันเป็นสคริปต์ lua ที่เกี่ยวข้องกับsysdigคำสั่ง:

description = "displays processes that delete a file"
short_description = "spy file deletion"
category = "files"

args = 
{
    {
        name = "path", 
        description = "the path of the file to monitor", 
        argtype = "string"
    },
}

function on_set_arg(name, val)
    path = val
    return true
end

function on_init()
    local filename = path
    for i in string.gmatch(path, "[^/]+") do
        filename = i
    end
    chisel.set_event_formatter("%proc.pid\t%proc.name")
    chisel.set_filter(
        "(evt.type=unlinkat and (evt.arg.name=" .. path .. " or \
                             evt.arg.name=" .. filename .. ")) or \
     (evt.type=unlink and evt.arg.path=" .. path .. ")")
    return true
end

รู้สึกอิสระที่จะแสดงความคิดเห็นและปรับปรุง คุณสามารถวางสคริปต์ lua ไว้ในspy_deletes.luaไฟล์ในไดเรกทอรีและดำเนินการsysdigในไดเรกทอรีนี้เพื่อให้สิ่วใช้งานได้ เมื่อพิมพ์sudo sysdig -clคุณจะเห็นเป็น:

Category: files
---------------
spy_deletes         spy file deletion

ตอนนี้คุณสามารถเรียกมันว่า:

$ sudo sysdig -c spy_deletes /tmp/test

และในเทอร์มินัลชนิดอื่น:

$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test

มันจะออก:

16025   unlink
16033   unlink
16041   rm
16049   rm

unlinkatกรองจะสมควรที่จะถูกต้องมากขึ้นและมีเพียงตรงกับเส้นทางที่แน่นอน เรื่องนี้จะต้องเพื่อดึง FD unlinkat(2)ของไดเรกทอรีส่งผ่านไปยัง


ฉันไม่มีเอาต์พุตพร้อมกับคำสั่งของคุณ
AB

ฉันพิมพ์rm /tmp/testในเทอร์มินัลอื่น ฉันแก้ไขคำตอบเพื่อให้ชัดเจนยิ่งขึ้น
Greg Leclercq
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.