Jak mogę przechowywać lokalny, opatrzony znacznikiem czasu rejestr wszystkich zdalnych poleceń, z których korzystam ssh
(uruchomiono klienta openssh z wiersza poleceń bash
)?
Wymagania:
Kluczowy:
- 100% po stronie klienta, bez polegania na logowaniu na serwerze
- Skonfigurowany lub zainstalowany na użytkownika z dziennikami przechowywanymi w katalogu osobistym użytkownika.
- Obsługa rozróżniania wielu sesji jednocześnie z różnymi użytkownikami i hostami.
- Nieinwazyjne (nie trzeba go aktywować za każdym razem i nie koliduje znacząco z używaniem ssh)
Wysoki priorytet:
- Każde wyjście nie jest rejestrowane ani filtrowane w jak największym stopniu
- Wpisy hasła nie są rejestrowane lub plik jest szyfrowany
- Wskazuje używane polecenia (po przetworzeniu tabulacji / historii, spacje, CTRL+ Citd.)
Miło jest mieć:
- Rejestruje również polecenia w połączonych sesjach (polecenia wprowadzone podczas sesji zdalnej
ssh
lubsu <user>
sesji) - Początek i koniec sesji powinny być rejestrowane
- Prosty
bash
-na, rozwiązanie niż root byłoby najlepsze (być możealias
lubbash
wrapper script dossh
polecenia?)
- Rejestruje również polecenia w połączonych sesjach (polecenia wprowadzone podczas sesji zdalnej
Mój poziom umiejętności:
- Nie jestem nowy w programowaniu, ale nadal uczę się
bash
i „Linux”, więc próbki kodu z krótkimi objaśnieniami byłyby bardzo mile widziane.
Możliwe strategie
- keylogger - Problem: rejestruje hasła, nie rejestruje zakończenia karty / historii (patrz odpowiedź Glenna )
screen
ze zrzutem przewijania raz na sekundę idiff
między nimi, aby znaleźć nowe linie przewijania - Problem: jak można to zaimplementować w przydatny zautomatyzowany sposób?ssh "$@" | tee >(some_cleaner_function >> $logfile)
- Problem: nie można obsłużyć wieloliniowych poleceń ani historii w połączonych sesjach, konieczne jest staranne czyszczenie (patrz moja odpowiedź)- Połączenie niektórych z powyższych
Przykład
Następująca sesja SSH:
user@local:~$ ssh user@remote
Last login: Tue Jun 17 16:34:23 2014 from local
user@remote:~$ cd test
user@remote:~/test$ ls
a b
user@remote:~/test$ exit
Może to prowadzić do dziennika ~/logs/ssh.log
takiego jak:
2014-06-17 16:34:50 [user@remote - start]
2014-06-17 16:34:51 [user@remote] cd test
2014-06-17 16:34:52 [user@remote] ls
2014-06-17 16:34:53 [user@remote] exit
2014-06-17 16:34:53 [user@remote - end]
Lub być może zostanie utworzony osobny dziennik dla każdej sesji z wierszem poleceń używanym do rozpoczęcia sesji na górze pliku.
bash
shell
command-line
openssh
Oleg
źródło
źródło
Odpowiedzi:
Zaintrygowało mnie twoje pytanie. Początkowo nie zamierzałem udzielać odpowiedzi, ale mnie uzależniło.
Wykorzystuje
expect
to i jest naprawdę kluczowym rejestratorem.Uwagi:
uptime
polecenia), w pliku dziennika pojawi się „upt \ t”, a nie „uptime”^?
w pliku dziennika pojawi się wiele znaków (backspace).źródło
Obecnie używam poniższego skryptu bash. Ma wiele problemów, ale jest to jedyne znalezione przeze mnie rozwiązanie, które spełnia wszystkie wymagania, priorytety i „miło jest mieć” (przynajmniej przez większość czasu).
Ta odpowiedź wyjaśnia, dlaczego lokalne rejestrowanie sesji ssh jest tak trudne.
Problemy ze skryptem, które znalazłem do tej pory:
Polecenia wielowierszowe powodują problemy:
Połączone sesje (używanie
ssh
lubsu
polecenia na zdalnym końcu) powodują przewijanie historii w celu rejestrowania przewijanych poleceń zamiast rzeczywistych używanych poleceńWyrażenia regularne można ulepszyć i może wymagać modyfikacji w niektórych środowiskach:
cat -v
przed czyszczeniem. W rezultacie ważna treść może zostać usunięta, jeśli kiedykolwiek użyjesz ciągów znaków jak^[[
w swoich poleceniach.Brak sashowania komendy ssh, na przykład dla nazwy hosta.Można uzyskać zakończenia bash jeśli alias ten skryptssh
zalias ssh="sshlog"
Źródło i instalacja skryptu:
Aby zainstalować, wklej następujące elementy do ~ / bin / sshlog i uczyń plik wykonywalny. Zadzwoń z
sshlog <ssh command options>
. Opcjonalnie alias do „ssh” w pliku .bashrc użytkownika.Przykładowa zawartość dziennika:
źródło
Mam mniej skomplikowaną odpowiedź, a na pewno nie keylogger. Nie rozumiem, że jesteś niezależny od dziennika serwera (oznacza to, że wszystkie działania muszą być podjęte na serwerze, a wszystkie dzienniki są dziennikami po stronie serwera), dlatego pomyślałem, że dobrym pomysłem jest przejście do całego systemu bashrc polecenie zachęty, takie jak:
W Debianie powinieneś edytować plik: /etc/bash.bashrc, aw centos plik: / etc / bashrc
Jeśli chcesz zacząć rejestrować sesję, w której jesteś, musisz źródłowy plik, który edytowałeś, na przykład wykonaj:
w systemie debian lub
w systemie centos.Odtąd każde polecenie każdej sesji ssh będzie rejestrowane w / var / log / syslog w systemie debian, a w / var / log / messages w systemie centos.
Jeśli chcesz zapisać je w osobnym pliku i nie zadzierać z innymi plikami dziennika, których możesz użyć:
zamiast poprzedniego przykładu PROMPT_COMMAND, a następnie odpowiednio skonfiguruj rsyslogd.Na przykład w systemie Debian edytuj plik /etc/rsyslog.conf : zmień wiersz:
do i dodaj następujący wiersz na końcu pliku:następnie wykonaj:
źródło
Jak o
strace -o /tmp/ssh_log -ff -s8192 -T -ttt -fp $(pidof sshd)
? To rejestruje wszystkie sesje ssh. Może trzeba narzędzie do analizowania dziennika następnie, lub po prostu użyćgrep
,awk
etc.-f
: śledzić rozwidlone dzieci-ff
: zaloguj każde dziecko osobno dossh_log.PID
-s8192
: zwiększ limit rejestrowania ciągu (w razie potrzeby)-T -ttt
: mikrosekundowe tłoczenie w ciągu kilku sekund od Epoki-p N
: dołącz do pidN
źródło