Dateiprüfung unter Linux: Wie wird der Verzeichnisbaum auf Löschungen überprüft?

9

Ich habe ein Forum-Skript auf dem Server und irgendwie geht eine kleine Anzahl von Anhängen verloren. Ich möchte herausfinden, was sie zu welchem ​​Zeitpunkt löscht. Wie kann ich Linux auditd (auditctl) so einrichten, dass der Verzeichnisbaum überwacht wird (Anhänge werden im mehrstufigen Verzeichnisbaum gespeichert), um dort nach Löschungen von Dateien zu suchen?

Vielleicht sollte ich dafür ein anderes Tool verwenden?

Vladislav Rastrusny
quelle

Antworten:

8

Dies ist eine Antwort, die ich auf eine vorherige Frage geschrieben habe:

Wenn Sie wissen möchten, was ein Prozess / Benutzer / eine Datei tut, ohne lsof rund um die Uhr ausführen zu müssen, verwenden Sie im Allgemeinen auditctl.

Angenommen, Sie haben ein aktuelles Kernel-Audit-Steuerelement, sollte eine einfache Operation sein. (Dies ist in Debian-fu, wenn Sie Red Hat Translate entsprechend ausführen)

# apt-get install auditd

Stellen Sie sicher, dass es ausgeführt wird (/etc/init.d/auditd Status).

auditctl -a entry,always -F arch=b64 -S open -F pid=<process id>

Ersetzen Sie b64 durch b32, wenn Sie einen 32-Bit-Bogen ausführen. Open kann durch einen beliebigen Systemaufruf oder das Wort "all" ersetzt werden.

Weitere Informationen finden Sie in der Manpage auditctl.

Sie können diese Methode verwenden und sie bitten, auf den Systemaufruf "Verknüpfung aufheben" zu achten.

Der Parameter -w ist nützlich, um Dateien / Verzeichnisse zu überwachen. Wie in der Manpage erläutert, gibt es jedoch einige Einschränkungen.

-w Pfad Fügen Sie am Pfad eine Überwachung für das Dateisystemobjekt ein. Sie können keine Uhr in das Verzeichnis der obersten Ebene einfügen. Dies ist vom Kernel verboten. Platzhalter werden ebenfalls nicht unterstützt und generieren eine Warnung. Die Art und Weise, wie Uhren funktionieren, besteht darin, den Inode intern zu verfolgen. Dies bedeutet, dass Sie, wenn Sie ein Verzeichnis überwachen, sehen, was als Dateiereignisse erscheint, aber es ist wirklich nur die Aktualisierung von Metadaten. Auf diese Weise könnten Sie einige Ereignisse verpassen. Wenn Sie alle Dateien in einem Verzeichnis überwachen müssen, wird empfohlen, für jede Datei eine eigene Überwachung durchzuführen. Im Gegensatz zu Syscall-Überwachungsregeln wirken sich Uhren nicht auf die Leistung aus, die auf der Anzahl der an den Kernel gesendeten Regeln basiert.

Aaron Tate
quelle
Ich kann nicht :( Ich habe PHP im CGI-Modus ausgeführt. Es ist dort immer ein neuer Prozess. Außerdem möchte ich nicht einen einzelnen Prozess beobachten, sondern einen bestimmten Teil des Dateisystems auf Änderungen
überprüfen
Ja, siehe die Bearbeitung, die ich vorgenommen habe, es gibt Parameter zum Überwachen von Dateisystemverzeichnissen, aber mit Einschränkungen oder Dateien.
Aaron Tate
Es gibt ungefähr 1000 Ordner und ungefähr 50.000 Dateien. Das wird also auch nicht funktionieren ... :(
Vladislav Rastrusny
Im Allgemeinen sollten Sie, solange Sie sich der Vorbehalte bewusst sind, in der Lage sein, die Uhr einfach in das Verzeichnis der obersten Ebene zu legen, das die Ordner enthält, die Sie ansehen möchten.
Aaron Tate
Ich muss das Gleiche tun (in einem Ordner nach Löschungen suchen, damit ich die PID / den Prozessnamen finden kann, die / der dies getan hat), aber dies scheint nicht zu funktionieren (zumindest auf einem 3.x-Kernel). Wenn ich "auditctl -a Eintrag, immer -F arch = b64 -S unlink -w / path / to / dir" ausführe, um Löschungen zu verfolgen, erhalte ich "Überwachungsoption kann nicht mit einem Systemaufruf angegeben werden". Hat jemand irgendwelche Ideen?
IBBoard
1

Vielleicht könnte Incron verwendet werden?

ptman
quelle
Es erlaubt nicht, den Baum in einem Ganzen zu beobachten. Nur pro Verzeichnis, wie ich sehen kann.
Vladislav Rastrusny
0

Ein paar Ideen. Sie können verwenden, um stracezu sehen, was Ihre Anwendung tut, aber es kann ein Protokoll von Protokollen generieren und das System verlangsamen.

Eine andere Idee ist inotifywait, dann lsof/fuserin der Datei zu sehen, was sie verwendet. Sie können versuchen, dieses Skript mit hoher Priorität auszuführen (wenn Sie können), um Informationen so genau wie möglich zu erhalten. Der unlinkAnruf wird wahrscheinlich nicht abgefangen , da die Datei vor der Zustellung des Ereignisses gelöscht wird.

Dan Andreatta
quelle
Ich kann nicht. Ich weiß nicht, auf welchem ​​Prozess strace ausgeführt werden soll, da ich nach einiger Zeit gelöschte Dateien finde. inotifywait funktioniert auch nicht, da PHP als CGI ausgeführt wird und es viele PHP-Prozesse mit unterschiedlichen IDs gibt.
Vladislav Rastrusny
Inotify wird verwendet, um das Dateisystem zu überwachen, nicht die laufenden Prozesse. Für strace müssen Sie den übergeordneten Masterprozess mit dem -fFlag verfolgen, um den untergeordneten Elementen zu folgen.
Dan Andreatta
0

Während die auditd-Empfehlung von fenix ideal erscheint, finden Sie möglicherweise ein Dateisystem-IDS wie AIDE hilfreich. Leider ist es unwahrscheinlich, dass es für das, was Sie zu isolieren versuchen, feinkörnig genug ist.

Ich schreibe oft Skripte als Lösung für Probleme wie das, was Sie beschreiben. Wenn Sie mit den empfohlenen Lösungen nicht das erreichen können, was Sie wollen, schreiben Sie selbst etwas. Es ist oft nicht sehr kompliziert.

Warner
quelle
Es scheint, es ist nur zum Auffinden von Dateiänderungen. Nicht für die Echtzeitüberwachung.
Vladislav Rastrusny