Linux-Dateizugriffsüberwachung

20

Gibt es eine Möglichkeit in Unix herauszufinden, wer in der letzten Woche auf bestimmte Dateien zugegriffen hat? Es kann ein Benutzer oder ein Skript sein, das es an einen anderen Ort transportiert. Kann ich eine Liste mit Benutzernamen erhalten, die auf bestimmte Dateien zugegriffen haben? Wie kann ich herausfinden, wer auf eine bestimmte Datei zugreift?

Jack
quelle

Antworten:

39

Es sei denn, Sie verfügen über äußerst ungewöhnliche Protokollierungsrichtlinien. Wer auf welche Datei zugegriffen hat, wird nicht protokolliert (das wäre eine große Menge an Informationen). In den Systemprotokollen können Sie herausfinden, wer zu welchem ​​Zeitpunkt angemeldet war. Der lastBefehl gibt Ihnen den Anmeldeverlauf und andere Protokolle, die /var/log/auth.logIhnen Aufschluss darüber geben, wie Benutzer sich authentifiziert haben und von wo aus sie sich angemeldet haben (welches Terminal oder welcher Host, wenn remote).

Das Datum, an dem eine Datei zuletzt gelesen wurde, wird als Zugriffszeit oder kurz als Zeit bezeichnet . Alle Unix-Dateisysteme können es speichern, aber viele Systeme zeichnen es nicht auf, da es einen (normalerweise geringen) Leistungsverlust hat. ls -ltu /path/to/fileoder stat /path/to/filezeigt die Zugriffszeit der Datei an.

Wenn ein Benutzer auf die Datei zugegriffen hat und nicht versucht hat, seine Tracks zu verbergen, hat sein Shell-Verlauf ~/.bash_historymöglicherweise Hinweise.

Um herauszufinden, was oder wer gerade eine Datei geöffnet hat, verwenden Sie lsof /path/to/file.

Es gibt verschiedene Möglichkeiten, um zu protokollieren, was in Zukunft mit einer Datei passiert:

  • Verwenden Sie inotifywait . inotifywait -e access /path/todruckt eine Zeile, /path/to/ ACCESS filewenn jemand liest file. Diese Schnittstelle sagt Ihnen nicht, wer auf die Datei zugegriffen hat. Sie können anrufen lsof /path/to/file, sobald diese Zeile angezeigt wird, es besteht jedoch eine Race-Bedingung (der Zugriff ist möglicherweise zu dem Zeitpunkt beendet, zu dem die Verbindung hergestellt wird).

  • LoggedFS ist ein stapelbares Dateisystem, das eine Ansicht eines Dateisystembaums bietet und eine bessere Protokollierung aller Zugriffe über diese Ansicht durchführen kann. So konfigurieren Sie es finden LoggedFS Syntax der Konfigurationsdatei .

  • Sie können Linux verwenden Audit - Subsystem zu protokollieren , eine große Anzahl von Dingen, einschließlich Dateisystem - Zugriffe. 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
    

    Wenn Sie ein Verzeichnis überwachen, werden auch die darin enthaltenen Dateien und deren Unterverzeichnisse rekursiv überwacht.

Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank, Gilles. Ich habe diese Dat-Datei durch das Skript erstellt. Ich möchte nur wissen, was mit dieser Datei passiert, nachdem sie erstellt wurde. Keines der anderen Skripte wählt sie für den weiteren Prozess aus. Ich möchte also sehen, ob jemand manuell auf diese Datei zugreift
Jack
@Jack: Es ist schwer zu sagen, ohne viel mehr über Ihr Setup zu wissen, aber solange nichts die Datei entfernt oder umbenennt, können die anderen Skripte darauf zugreifen, unabhängig davon, ob jemand darauf zugreift oder nicht. Nach Ihrem Kommentar sollten Sie sich überlegen, was passiert, wenn Sie Ihre Skripte ausführen.
Gilles 'SO- hör auf böse zu sein'
2
Hey, du könntest eine schöne runde Schleife damit erstellen:syslogd access log file /var/log/audit.log at 10:01\nsyslogd access log file /var/log/audit.log at 10:02\n...
penguin359
7

Das obige Beispiel mit inotifywait sollte eines von folgenden sein (weitere Informationen finden Sie auf der Manpage):

inotifywait /path/to/file
inotifywait -e open /pat/to/file

Oder mit Überwachungsmodus und Zeitstempel:

inotifywait -m --format '%w:%e:%T' --timefmt '%F %T %Z %z'
Milan Kerslager
quelle
6

Die vorherige Antwort ist nicht die beste Methode, um das zu tun, was Sie verlangen. Linux hat eine API dafür. Die inotifyAPI http://linux.die.net/man/7/inotify

  1. Sie können ein C-Programm schreiben, um das zu tun, was Sie wollen, indem Sie die inotifyAPI direkt aufrufen
  2. Sie können kfsmd, http://www.linux.com/archive/feature/124903, einen Daemon verwenden, der verwendetinotify
  3. Wenn Sie plattformübergreifende Funktionen ( inotifyLinux-spezifisch) und Java verwenden möchten, funktioniert JNotify plattformübergreifend (Linux, Mac, Windows) und abstrahiert die zugrunde liegende API des nativen Betriebssystems.
Tal
quelle
3
Willkommen bei Stack Exchange . Die Antworten werden nicht in chronologischer Reihenfolge angezeigt, daher gibt die „vorherige Antwort“ nicht an, welche Antwort Sie meinen. Ich frage mich, auf welche der beiden anderen Sie sich sowieso beziehen: Eine hat nichts, was nach guter oder schlechter Praxis aussieht, und die andere erwähnt die inotify-API.
Gilles 'SO- hör auf böse zu sein'
Höchstwahrscheinlich bezieht sich Glen auf die Antwort oben mit der Standard-Abstimmungssortierung. In der Tat kann die beliebteste Antwort keine Lösung für die Frage liefern. Es kann eine Reihe von Gründen geben, aus denen überprüft werden muss, wie oft in einem bestimmten Zeitraum auf eine Datei zugegriffen wird.
Wtower
1
Wie in unix.stackexchange.com/a/12251/20336 erläutert, liefert die inotify-API keine Informationen darüber, wer auf eine bestimmte Datei zugegriffen hat. Außerdem hilft inotify nicht, herauszufinden, wer letzte Woche auf die Datei zugegriffen hat. Dafür benötigen Sie Überwachungsfunktionen, für die die Verwendung einer so genannten Software erforderlich ist auditd(auch dies hilft nicht, herauszufinden, wer letzte Woche auf die Datei zugegriffen hat, es sei denn, Sie haben sie auditdbereits letzte Woche ausgeführt).
Mikko Rantalainen
3

Dies ist im Allgemeinen nicht möglich. Ich habe Dateisysteme mit genügend Auditing gesehen, um es auf die eine oder andere Weise zu ermöglichen, aber es ist keine allgemeine Unix-Sache, nein.

tchrist
quelle