Ist es möglich herauszufinden, welches Programm oder Skript eine bestimmte Datei erstellt hat?

35

In meinem Ausgangsverzeichnis sind plötzlich drei Dateien mit den Namen "client_state.xml", "lockfile" und "time_stats_log" aufgetaucht. Die letzten beiden sind leer. Ich frage mich, wie sie dorthin gekommen sind. Es ist nicht das erste Mal, dass es passiert ist, aber das letzte Mal war vor Wochen; Ich habe die Dateien gelöscht und nichts ist kaputt gegangen oder ich habe mich beschwert. Ich konnte mir nicht vorstellen, was ich zu dem Zeitpunkt tat, als von berichtet wurde stat $filename. Kann ich auf irgendeine Weise herausfinden, woher sie kommen?

Gibt es alternativ eine Möglichkeit, das Ausgangsverzeichnis (aber nicht die Unterverzeichnisse) für die Erstellung von Dateien zu überwachen?

Wolf
quelle
Da ich sicher bin, dass es jemand erwähnen wird, habe ich keinen Hinweis.
Wolf

Antworten:

18

Ich glaube nicht, dass es eine Möglichkeit gibt, festzustellen, mit welchem ​​Programm eine Datei erstellt wurde.

Zu Ihrer alternativen Frage: Sie können die wiederherzustellende Datei jedoch mit überwachen inotify. inotifywaitist eine Befehlszeilenschnittstelle für das inotifySubsystem; Sie können festlegen, dass createin Ihrem Home-Verzeichnis nach Ereignissen gesucht werden soll:

$ (sleep 5; touch ~/making-a-test-file) &
[1] 22526

$ inotifywait -e create ~/
Setting up watches.
Watches established.
/home/mmrozek/ CREATE making-a-test-file

Sie möchten es wahrscheinlich mit -m(monitor) ausführen, um zu verhindern, dass es nach dem ersten Ereignis beendet wird

Michael Mrozek
quelle
Wie bekomme ich inotify? Es ist nicht installiert (Kernel 2.6.34) und es gibt keine /dev/inotify.
Wolf
1
@Wolf Welche Distribution? Wenn Sie Ihren eigenen Kernel erstellen, ist dies CONFIG_INOTIFY_USER( Filesystems-> Inotify support for userspace). inotifywaitist wahrscheinlich in einem Paket mit dem Nameninotify-tools
Michael Mrozek
@Michael, es ist openSUSE 11.3. Ich habe noch nie einen Kernel gebaut. Ich benutze Linux erst seit ungefähr 5 Monaten und es ist ein entmutigendes Konzept. Aber ich werde mich nach einem Tutorial umsehen oder so.
Wolf
@Wolf Nun, die Antwort von dogbane könnte einfacher sein, wenn der Kernel, den du hast, nicht dabei ist
Michael Mrozek
2
@Michael Eigentlich habe ich nach ein wenig mehr Recherche und Recherche ein Community-Repository hinzugefügt, das, wie sich herausstellt, das inotify-toolsPaket enthält , also habe ich jetzt inotifywait(und inotifywatch). Ich habe es ausprobiert und es scheint zu funktionieren.
Wolf
22

Sie können alles beobachten, was in einem Dateisystem passiert, indem Sie über LoggedFS darauf zugreifen . Dies ist ein gestapeltes Dateisystem , das jeden Zugriff in einem Verzeichnisbaum protokolliert.

loggedfs -l /var/tmp/$USER-home-fs.log ~

Wenn Sie Ihr gesamtes Basisverzeichnis protokollieren, wird Ihr System möglicherweise langsamer. Sie sollten mindestens eine Konfigurationsdatei mit strengen Filtern schreiben .

Wenn Sie unter Linux über Root-Zugriff verfügen, können Sie mit dem Überwachungssubsystem eine Vielzahl von Dingen protokollieren, einschließlich Dateisystemzugriffen. Stellen Sie sicher, dass der auditdDämon gestartet ist, und konfigurieren Sie dann, mit was Sie sich anmelden möchten auditctl. Jeder protokollierte Vorgang wird in /var/log/audit/audit.log(bei typischen Distributionen) aufgezeichnet . So starten Sie das Ansehen einer bestimmten Datei:

auditctl -w /path/to/file

oder in der langen Form

auditctl -a exit,always -F path=/path/to/file

Wenn Sie ein Verzeichnis (mit -woder -F dir=) überwachen, werden auch die darin enthaltenen Dateien und deren Unterverzeichnisse rekursiv überwacht.

Gilles 'SO - hör auf böse zu sein'
quelle
BSD unterstützt dies auch über Security Event Auditing. freebsd.org/doc/en_US.ISO8859-1/books/handbook/audit.html
Shawn J. Goff
4

Vielleicht möchten Sie einen Blick darauf werfen auditd, mit diesem Paket können Sie Sicherheitsüberprüfungen durchführen und eine Menge Informationen darüber erhalten, wer was im Dateisystem geändert hat.

Lutzky
quelle
Wenn Sie über einen Server verfügen, der mehreren Benutzern Shell-Zugriff bietet und für einzelne Aktionen eine gewisse Rechenschaftspflicht haben muss, können Sie bestimmte Shells (z. B. bash und tcsh) mit der Befehlsverlaufsprotokollierung erstellen. Ich habe unter < timkennedy.net/2010/12/07/… > einen Blogbeitrag über das Einloggen in Shells geschrieben . Die Shell-Protokollierung ist kein Ersatz für ein echtes Prüfsystem, da sie keine Befehle protokolliert, die von nicht interaktiven Shells (wie Skripten oder Programmen) ausgeführt werden. Um diese Granularität zu erreichen, benötigen Sie wirklich eine gute Auditing-Lösung.
Tim Kennedy
1
@TimKennedy - Ihr Blogpost wird nicht mehr angezeigt.
SLM
1
Es tut uns leid. Die Seite wurde gehackt und war für eine Weile nicht erreichbar. Neue Seite ist bei timkennedy.net/2010/12/logging-shell-commands-to-syslog-on.html
Tim Kennedy
3

Ich weiß, dass dies eine alte Frage ist, aber ich werde einen anderen Ansatz vorschlagen, nur für den Fall, dass jemand es nützlich findet. Ich habe dies ursprünglich als Antwort auf eine Frage gepostet, die auf diese Frage gestellt wurde.

Eine Option ist die Verwendung sysdigeiner Open-Source-Systemüberwachungsanwendung. Mit dieser Funktion können Sie die Aktivität einer Datei nach Namen überwachen. Angenommen, Sie möchten sehen, bei welchem ​​Prozess eine Datei mit dem Namen erstellt wurde /tmp/example.txt:

# sysdig fd.name=/tmp/example.txt
567335 16:18:39.654437223 0 touch (5470) < openat fd=3(<f>/tmp/example.txt) dirfd=-100(AT_FDCWD) name=/tmp/example.txt flags=70(O_NONBLOCK|O_CREAT|O_WRONLY) mode=0666
567336 16:18:39.654438248 0 touch (5470) > dup fd=3(<f>/tmp/example.txt)
567337 16:18:39.654438592 0 touch (5470) < dup res=0(<f>/tmp/example.txt)
567338 16:18:39.654439629 0 touch (5470) > close fd=3(<f>/tmp/example.txt)
567339 16:18:39.654439764 0 touch (5470) < close res=0
567342 16:18:39.654441958 0 touch (5470) > close fd=0(<f>/tmp/example.txt)
567343 16:18:39.654442111 0 touch (5470) < close res=0

An dieser Ausgabe können Sie erkennen, dass ein touchmit pid 5470 benannter Prozess die Datei geöffnet hat.

Wenn Sie weitere Informationen wünschen, können Sie im "Erfassungsmodus" ausführen, in dem eine Systemaufruf-Ablaufverfolgung gesammelt wird:

# sysdig -w /tmp/dumpfile.scap

Warten Sie, bis die Datei erstellt wurde. Halten Sie dann an sysdigund führen Sie Folgendes aus:

# csysdig -r /tmp/dumpfile.scap

So können Sie alles erkunden, was passiert ist. Sie können drücken <F2>und auswählen Files. Drücken Sie <F4>, um nach dem Dateinamen zu suchen. Drücken Sie dann, um <F6>zu "graben" (was eine Ausgabe ähnlich dem obigen Befehl anzeigt). Auf diese Weise können Sie auf dieselbe Weise nach Informationen über den Prozess suchen, der die Datei tatsächlich erstellt hat.

Es gibt eine GUI-Version von csysdigCalled sysdig-inspect, wenn das mehr Ihre Tasse Tee ist.

Andy Dalton
quelle
oder vielleicht eine beschäftigte Schleife, die ständig versucht zu sehen, ob / wann ein Prozess in diese Datei schreibt
rogerdpack
2

Sie haben nicht die Möglichkeit inotify, ein Skript zu schreiben, das in einer Schleife nach der Datei sucht:

#!/bin/sh

while [ true ]; do                     # Run for as long as nessesary
  if [ -f /path/to/file ]; then        # If fileexists
    echo "Found file"                  # Notify and stop monitoring
    exit 0
  fi
  sleep 5                             # Else wait 5 secs
done
Dogbane
quelle
2
Dies zeigt nicht, welches Programm es erstellt hat
OverCoder