Monitorowanie dostępu do plików w systemie Linux

20

Czy w Unixie jest jakiś sposób, aby dowiedzieć się, kto uzyskał dostęp do określonego pliku w ciągu ostatniego tygodnia? Może to być użytkownik lub jakiś skrypt ftp w inne miejsce. Czy mogę uzyskać listę nazw użytkowników, którzy uzyskali dostęp do określonego pliku? Jak mogę dowiedzieć się, kto ma dostęp do konkretnego pliku?

Jacek
źródło

Odpowiedzi:

39

Chyba że masz bardzo nietypowe zasady rejestrowania, kto uzyskał dostęp do pliku, który nie jest rejestrowany (byłoby to ogromną ilością informacji). Możesz dowiedzieć się, kto był zalogowany o której godzinie w logach systemowych; lastkomenda daje historia i inne dzienniki zalogować takich jak /var/log/auth.logpowie Ci, w jaki sposób użytkownicy uwierzytelniony i skąd zalogowany (który zacisk, lub które gospodarz czy zdalnie).

Data ostatniego odczytu pliku nazywana jest czasem dostępu lub w skrócie atime . Wszystkie systemy plików unix mogą go przechowywać, ale wiele systemów go nie rejestruje, ponieważ ma (zwykle niewielki) spadek wydajności. ls -ltu /path/to/filelub stat /path/to/filepokazuje czas dostępu do pliku.

Jeśli użytkownik uzyskał dostęp do pliku i nie próbował ukryć swoich śladów, jego historia powłoki (np. ~/.bash_history) Może zawierać wskazówki.

Aby dowiedzieć się, co lub kto ma teraz otwarty plik, użyj lsof /path/to/file.

Aby zarejestrować, co stanie się z plikiem w przyszłości, istnieje kilka sposobów:

  • Użyj inotifywait . inotifywait -e access /path/towypisze wiersz, /path/to/ ACCESS filegdy ktoś czyta file. Ten interfejs nie powie Ci, kto uzyskał dostęp do pliku; możesz zadzwonić, lsof /path/to/filegdy tylko pojawi się ta linia, ale jest warunek wyścigu (dostęp może się skończyć, zanim lsof zacznie działać).

  • LoggedFS to system plików, który można ustawiać jeden na drugim, który zapewnia widok drzewa systemu plików i może wykonywać bardziej zaawansowane rejestrowanie wszystkich dostępów za pośrednictwem tego widoku. Aby go skonfigurować, zobacz Składnia pliku konfiguracyjnego LoggedFS .

  • Za pomocą podsystemu kontroli systemu Linux można rejestrować wiele rzeczy, w tym dostęp do systemu plików. Upewnij się, że auditddemon jest uruchomiony, a następnie skonfiguruj, z czym chcesz się zalogować auditctl. Każda zarejestrowana operacja jest rejestrowana w /var/log/audit/audit.log(w typowych dystrybucjach). Aby rozpocząć oglądanie określonego pliku:

    auditctl -w /path/to/file
    

    Jeśli umieścisz zegarek w katalogu, pliki w nim i jego podkatalogi będą również rekurencyjnie oglądane.

Gilles „SO- przestań być zły”
źródło
Dziękuję Gilles .. Mam ten plik danych utworzony przez skrypt. Chcę tylko wiedzieć, co stanie się z tym plikiem po jego utworzeniu. Żaden z innych skryptów nie wybiera go do dalszego przetwarzania, więc chcę zobaczyć, czy ktoś ręcznie uzyskuje dostęp do tego pliku danych
Jack
@Jack: Trudno powiedzieć, nie wiedząc o wiele więcej o twojej konfiguracji, ale dopóki nic nie usunie ani nie zmieni nazwy pliku, będą dostępne inne skrypty, niezależnie od tego, czy ktoś ma do niego dostęp. Po twoim komentarzu uważam, że powinieneś przyjrzeć się temu, co dzieje się po uruchomieniu skryptów.
Gilles 'SO - przestań być zły'
2
Hej, możesz stworzyć ładną okrągłą pętlę za pomocą tego:syslogd access log file /var/log/audit.log at 10:01\nsyslogd access log file /var/log/audit.log at 10:02\n...
penguin359 28.04.11
7

Powyższy przykład z inotifywait powinien być jednym z (więcej informacji na stronie podręcznika):

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

Lub z trybem monitorowania i znacznikiem czasu:

inotifywait -m --format '%w:%e:%T' --timefmt '%F %T %Z %z'
Milan Kerslager
źródło
6

Poprzednia odpowiedź nie jest najlepszą praktyką do robienia tego, o co prosisz. Linux ma do tego API. inotifyAPI http://linux.die.net/man/7/inotify

  1. Możesz napisać program C, aby zrobić to, co chcesz, bezpośrednio wywołując inotifyinterfejs API
  2. Możesz użyć kfsmd, http://www.linux.com/archive/feature/124903 demona, który używainotify
  3. Jeśli chcesz czegoś, co działa na różnych platformach ( inotifyjest specyficzne dla Linuksa) i używasz Javy, JNotify działa na różnych platformach (Linux, Mac, Windows), wyodrębniając podstawowy interfejs API natywnego systemu operacyjnego.
Dolina górska
źródło
3
Witamy w Stack Exchange . Odpowiedzi nie są prezentowane w kolejności chronologicznej, więc „poprzednia odpowiedź” nie określa, którą odpowiedź masz na myśli. Zastanawiam się, do którego z pozostałych dwóch odwołujesz się i tak: jeden nie ma niczego, co wygląda na dobrą lub złą praktykę, a drugi nie wspomina o API inotify.
Gilles 'SO - przestań być zły'
Najprawdopodobniej Glen odnosi się do powyższej odpowiedzi z domyślnym sortowaniem głosów. Rzeczywiście najpopularniejsza odpowiedź nie przedstawia rozwiązania tego pytania. Może istnieć wiele powodów, dla których można zobaczyć, ile razy dostęp do plików w danym przedziale czasowym.
Wtower,
1
Jak wyjaśniono w unix.stackexchange.com/a/12251/20336 API inotify nie dostarcza informacji o tym, kto uzyskał dostęp do danego pliku. Plus inotify naprawdę nie pomaga dowiedzieć się, kto uzyskał dostęp do pliku w zeszłym tygodniu. Potrzebujesz do tego funkcji kontroli, która wymaga użycia oprogramowania o nazwie auditd(jednak nawet to nie pomaga dowiedzieć się, kto uzyskał dostęp do pliku w zeszłym tygodniu, chyba że auditdjuż uruchomiłeś go w zeszłym tygodniu).
Mikko Rantalainen
3

Zasadniczo nie jest to możliwe. Widziałem systemy plików z wystarczającą ilością inspekcji, aby było to możliwe w ten czy inny sposób, ale nie jest to ogólna sprawa Uniksa, nie.

tchrist
źródło