ฉันกำลังทำงานในโครงการที่เกี่ยวข้องกับการโยกย้าย VM บางครั้งอิมเมจ VM จะหายไปและฉันแค่อยากรู้ว่าใครคือผู้ร้าย ฉันลองใช้กระบวนการที่น่าสงสัย แต่ก็ไม่มีประโยชน์
ฉันกำลังทำงานในโครงการที่เกี่ยวข้องกับการโยกย้าย VM บางครั้งอิมเมจ VM จะหายไปและฉันแค่อยากรู้ว่าใครคือผู้ร้าย ฉันลองใช้กระบวนการที่น่าสงสัย แต่ก็ไม่มีประโยชน์
คำตอบ:
ภูต Audit Audit ภูตจะทำเคล็ดลับ
sudo auditctl -w /path/to/somefile -p wra
แล้ว
ausearch -f /path/to/somefile -i
คุณสามารถหา PID lsof
ของกระบวนการซึ่งมีบางส่วนเปิดไฟล์โดยใช้
เมื่อไฟล์ถูกปิดและลบคุณจะไม่สามารถรับข้อมูลนั้นได้
BTW โปรดทราบว่าการลบไฟล์เป็นการดำเนินการในไดเรกทอรีที่อยู่ไม่ใช่ในไฟล์เอง
ให้ฉันแนะนำทางเลือกกับ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)
ของไดเรกทอรีส่งผ่านไปยัง
rm /tmp/test
ในเทอร์มินัลอื่น ฉันแก้ไขคำตอบเพื่อให้ชัดเจนยิ่งขึ้น