मैं VM प्रवास से संबंधित परियोजना पर काम कर रहा हूं। कभी-कभी वीएम छवि गायब हो जाएगी और मैं सिर्फ यह जानना चाहता हूं कि अपराधी कौन है। मैंने संदिग्ध प्रक्रियाओं पर रोक लगाने की कोशिश की लेकिन कोई फायदा नहीं हुआ।
मैं VM प्रवास से संबंधित परियोजना पर काम कर रहा हूं। कभी-कभी वीएम छवि गायब हो जाएगी और मैं सिर्फ यह जानना चाहता हूं कि अपराधी कौन है। मैंने संदिग्ध प्रक्रियाओं पर रोक लगाने की कोशिश की लेकिन कोई फायदा नहीं हुआ।
जवाबों:
अंत में मुझे यहाँ उत्तर मिल गया ।
लिनक्स ऑडिट डेमॉन ट्रिक करेगा।
sudo auditctl -w /path/to/somefile -p wra
और फिर
ausearch -f /path/to/somefile -i
आप एक प्रक्रिया के पीआईडी का पता लगा सकते हैं, जिसमें कुछ फ़ाइल का उपयोग करके खुला है lsof।
एक बार फ़ाइल बंद और हटा दी गई है, तो आपको वह जानकारी नहीं मिल सकती है।
Btw। ध्यान रखें, कि फ़ाइल हटाना उस निर्देशिका में ऑपरेशन है जो किसी फ़ाइल में नहीं है।
मुझे ssdig के साथ एक विकल्प सुझाने दें क्योंकि उपरोक्त उत्तर उम्र बढ़ने के हैं। आज्ञा देना प्रदर्शित 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 उपयोगकर्ता मार्गदर्शिका देखें ।
चूंकि फ़िल्टर बहुत लंबा है, इसलिए मुझे छेनी लिखना सुविधाजनक लगा। यह एक लुआ स्क्रिप्ट है जो एक 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
बेझिझक टिप्पणी करें और इसे सुधारें। आप 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दूसरे टर्मिनल में टाइप कर रहा था । मैंने इसे स्पष्ट करने के लिए अपने उत्तर को संपादित किया।