Tôi đang làm việc trên một dự án liên quan đến di chuyển VM. Đôi khi hình ảnh VM sẽ biến mất và tôi chỉ muốn biết ai là thủ phạm. Tôi đã cố gắng sải bước trên các quy trình đáng ngờ nhưng không có kết quả.
Tôi đang làm việc trên một dự án liên quan đến di chuyển VM. Đôi khi hình ảnh VM sẽ biến mất và tôi chỉ muốn biết ai là thủ phạm. Tôi đã cố gắng sải bước trên các quy trình đáng ngờ nhưng không có kết quả.
Câu trả lời:
Cuối cùng tôi đã tìm thấy câu trả lời ở đây .
Trình nền Linux Audit sẽ thực hiện thủ thuật.
sudo auditctl -w /path/to/somefile -p wra
và sau đó
ausearch -f /path/to/somefile -i
Bạn có thể tìm ra PID của một quá trình, trong đó có một số tệp đang mở bằng cách sử dụng lsof
.
Khi tệp được đóng và xóa, bạn không thể lấy thông tin đó.
BTW. Hãy nhớ rằng việc xóa một tệp đang hoạt động trên thư mục, không phải trên chính tệp đó.
Hãy để tôi đề nghị một thay thế với sysdig vì các câu trả lời ở trên đang già đi. Hãy hiển thị pid
và name
các quá trình xóa tệp /tmp/test
. Đầu tiên chúng ta tạo tập tin với touch /tmp/test
. Sau đó, chúng tôi bắt đầu sysdig
với bộ lọc sau:
$ 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)
yêu cầu một or
bộ lọc nếu đường dẫn (ví dụ evt.arg.name
) có thể là tương đối . Để xử lý cả unlink
(mà gọi unlink(2)
) và rm
(gọi unlinkat(2)
trong phiên bản GNU), bộ lọc phải khớp với cả hai tòa nhà.
sysdig
sẽ được chạy khi một quá trình xóa tập tin. Sau đó, khi chúng tôi thực hiện các lệnh như vậy:
$ unlink /tmp/test
$ touch /tmp/test
$ rm /tmp/test
$ cd /tmp; touch test; rm test
Nó sẽ hiển thị một đầu ra như vậy:
11380,unlink
11407,rm
11662,rm
Vui lòng tham khảo hướng dẫn sử dụng sysdig để được giải thích về lọc và đầu ra.
Vì bộ lọc khá dài, tôi thấy thuận tiện khi viết một cái đục. Đó là một tập lệnh lua được liên kết với một sysdig
lệnh:
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
Hãy bình luận và cải thiện nó. Bạn có thể đặt tập lệnh lua trong một spy_deletes.lua
tập tin bên trong một thư mục và thực thi sysdig
trong thư mục này để làm cho cái đục có sẵn. Khi gõ sudo sysdig -cl
bạn sẽ thấy nó như sau:
Category: files
---------------
spy_deletes spy file deletion
Bây giờ bạn có thể gọi nó:
$ sudo sysdig -c spy_deletes /tmp/test
Và trong một loại thiết bị đầu cuối khác:
$ touch test; unlink test
$ touch test; unlink /tmp/test
$ touch test; rm test
$ touch test; rm /tmp/test
Nó sẽ xuất ra:
16025 unlink
16033 unlink
16041 rm
16049 rm
Bộ unlinkat
lọc sẽ xứng đáng chính xác hơn và chỉ phù hợp với đường dẫn tuyệt đối. Điều này sẽ yêu cầu lấy fd của thư mục được truyền tới unlinkat(2)
.
rm /tmp/test
vào một thiết bị đầu cuối khác. Tôi chỉnh sửa câu trả lời của tôi để làm cho nó rõ ràng hơn.