Jak zalogować każdą komendę linux do serwera logów

13

Chcę, aby każde wpisane polecenie trafiło do serwera logów. Syslog-ng jest już skonfigurowany do wysyłania wszystkich dzienników do serwera logów.

Interesują mnie wszystkie metody, aby to zrobić. Spodziewałbym się dyskusji o nieuczciwych użytkownikach i bezpieczeństwie, ale pierwszym podstawowym celem jest po prostu rejestrowanie sesji. Wszystkie sesje są zakończone przez ssh, ale komendy połączenia z konsolą również powinny zostać zarejestrowane. Chciałbym, aby tak się stało dla dowolnej powłoki, ale podstawową jest bash. (Znów wiem, że nieuczciwy użytkownik może stworzyć własną powłokę ...)

Lew
źródło

Odpowiedzi:

29

Nie tak podchodzisz do problemu. Kiedy dajesz użytkownikowi dostęp do powłoki, powierzasz mu, aby zrobił wszystko, do czego ma odpowiednie uprawnienia. Zapomnij o logowaniu poleceń, istnieje zbyt wiele sposobów na wykonanie polecenia w dowolnym systemie uniksowym.

Na przykład użytkownik może uruchomić klienta pocztowego (na przykład jedynym zalogowanym poleceniem pine), tam wybiera „Utwórz”, który uruchamia VI, a od VI uruchamia dowolne polecenie, za pomocą którego chce :!cmd. To polecenie nie jest nigdzie logowane, a z punktu widzenia systemu jest jak każda aplikacja pomocnicza wywoływana przez VI, na przykład grep lub sort. Jedynym poleceniem zarejestrowanym przez powłokę było pine.

Wygląda na to, że tak naprawdę chcesz nazywać się audytem . Włącz podsystem kontroli i użyj auditctlpolecenia i auditddemona z pakietu kontroli , aby kontrolować, co jest rejestrowane. Więcej informacji znajduje się na stronie podręcznika auditctl (8) .

Pamiętaj, że rejestrowanie każdej instancji procesu może również nie być optymalne. Na przykład proste ./configuredla pakietu oprogramowania (utworzonego za pomocą narzędzi automatycznych) jest godne uwagi w przypadku tworzenia tysięcy instancji procesów. Spowoduje to zalanie dziennika audytu tak dużą ilością hałasu, że bardzo trudno będzie go później przeanalizować.

Juliano
źródło
13

Zainstaluj acctpakiet (nazwa pakietu różni się w zależności od dystrybucji, znana również jako rozliczanie procesów) i użyj lastcomm <username>:

[mithrandir]-[/home/sernin]-[1951] % lastcomm sernin
tr                     sernin   pts/2      0.00 secs Fri Nov 12 12:02
zsh               F    sernin   pts/2      0.00 secs Fri Nov 12 12:02
tr                     sernin   pts/2      0.02 secs Fri Nov 12 12:02
zsh               F    sernin   pts/2      0.00 secs Fri Nov 12 12:02
fortune                sernin   pts/2      0.00 secs Fri Nov 12 12:02
xmodmap                sernin   pts/2      0.00 secs Fri Nov 12 12:02
xrdb                   sernin   pts/2      0.00 secs Fri Nov 12 12:02
sh                     sernin   pts/2      0.00 secs Fri Nov 12 12:02
cpp                    sernin   pts/2      0.00 secs Fri Nov 12 12:02

Możesz także wyszukiwać według nazwy tty lub polecenia. Jak zwykle, man lastcommaby uzyskać więcej informacji.

Sam Halicke
źródło
11

Jeśli chcesz zrobić trochę programowania w C, możesz to zrobić, pisząc bibliotekę, która otacza execve, loguje się do syslog, a następnie dlopen jest biblioteką zawierającą prawdziwe wykonanie syscall. Następnie w / etc / environment ustaw LD_PRELOAD na ścieżkę do utworzonej biblioteki.

Należy zachować ostrożność przy wprowadzaniu pętli tutaj, więc możesz chcieć rejestrować tylko exec niektórych plików binarnych lub wykluczyć inne (np. Syslog) z logowania.

znak
źródło
W rzeczywistości jest to bardzo pomocne. Pierwsze wyszukiwanie w execve wrapper wywołuje snoopy ( sourceforge.net/projects/snoopylogger ). Wydaje się to bliskie temu, czego szukałem, choć trochę gadatliwe. Po testach widzę, że będę potrzebować zgody kierownictwa, aby umieścić to w środowisku produkcyjnym. (Ostrzeżenie dla wszystkich nikczemnych typów)
Leo
@Leo Ponieważ wersja 2.0.0 Snoopy obsługuje specyfikację niestandardowego formatu dziennika podczas wykonywania ./configure, więc nadmierna gadatliwość nie powinna już stanowić problemu. Ujawnienie: Opiekun Snoopy tutaj.
Bostjan Skufca
7

Wydaje mi się, że szukasz czegoś takiego jak rootsh ( strona podręcznika użytkownika ). Aby zacytować stronę podręcznika:

Rootsh to opakowanie dla powłok, które rejestruje wszystkie powtórzone naciśnięcia klawiszy i dane wyjściowe terminala do pliku i / lub syslog.

Mimo nazwy może być używany przez każdego użytkownika.

Andrew M.
źródło
2

Prawdopodobnie lepiej, aby użytkownicy używali sudo (lub podobnego) do uruchamiania poleceń, na których Ci zależy, i ufając użytkownikom na pewnym poziomie. Im bardziej zbliżasz się do „pełnej kontroli” rzeczy, tym trudniej jest wyśledzić, co robią. Ostatnio przyglądałem się na przykład takim narzędziom. Przeważnie tworzą one dzienniki, które są trudne do zarządzania, jeśli masz wystarczającą liczbę użytkowników i maszyn, aby coś takiego było opłacalne. :)

Rozważ wszystkie informacje, które będziesz generować. Jak bardzo ci na tym zależy? Prawdopodobnie bardzo mało - więc generujesz dzienniki, które są w większości bezwartościowe. Audytowanie rzeczy, na których ci naprawdę zależy, jak sugerują inni, prawdopodobnie prowadzi cię do lepszego stanu końcowego.

dannysauer
źródło
1

Bash można kompilować z obsługą syslog od wersji 4.1.

Nie jest to niezawodne (rozliczanie procesów może być lepsze do tego), ale głównie interakcja użytkownika; wolumin powinien być łatwiejszy w zarządzaniu, a będziesz mógł przejść na coś bardziej szczegółowego, jeśli podejrzewasz coś nienormalnego.

To powiedziawszy, jest to dość inwazyjne i jako użytkownik oczekiwałbym bardzo konkretnego ostrzeżenia o prywatności, zanim zaczniesz to robić.

Tobu
źródło
0

Istnieje również sudosh ( http://sudosh.sourceforge.net ), który będzie rejestrował sesje. Masz możliwość uruchomienia go jako zdefiniowanej powłoki dla użytkownika lub poprzez sudo. Śledzi także czasy dla każdej sesji, dzięki czemu możesz odtworzyć sesję i obejrzeć ją (w tym sesje edycji i tak dalej).

Kij
źródło