Jak odzyskać adresy IP potencjalnych atakujących ssh?

17

Właśnie się cat /var/log/auth.logzalogowałem i zobaczyłem, że istnieje wiele | grep "Failed password for"zapisów.

Istnieją jednak dwa możliwe typy rekordów - dla ważnego / nieprawidłowego użytkownika. To komplikuje moje próby | cut.

Chciałbym zobaczyć utworzenie listy (pliku tekstowego) z adresami IP potencjalnych atakujących i liczbą prób dla każdego adresu IP. Czy jest jakiś prosty sposób na jego utworzenie?

Także, jeśli chodzi tylko o ssh: Jakie wszystkie zapisy /var/log/auth.logpowinienem wziąć pod uwagę przy tworzeniu listy potencjalnych napastników?

Przykład mojego „dziennika auth.log” z ukrytymi numerami:

cat /var/log/auth.log | grep "Failed password for" | sed 's/[0-9]/1/g' | sort -u | tail

Wynik:

Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user ucpss from 111.11.111.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user vijay from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user webalizer from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user xapolicymgr from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user yarn from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user zookeeper from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user zt from 111.11.111.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for mysql from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for root from 111.11.111.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for root from 111.111.111.1 port 11111 ssh1
kravemir
źródło
Sugeruję, abyś utworzył klucze ssh, zainstalował je na swoim serwerze i całkowicie wyłączył hasła w pliku konfiguracyjnym sshd serwera /etc/ssh/sshd_config... ustawienia wyszukiwania PasswordAuthentication noi PermitRootLogin without-password ... wtedy wszystkie takie próby hasła zostaną udaremnione przed wejściem na auth.log ...
Scott Stensland,

Odpowiedzi:

19

Możesz użyć czegoś takiego:

grep "Failed password for" /var/log/auth.log | grep -Po "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" \
| sort | uniq -c

Greps dla ciągu znaków Failed password fori wyciąga ( -o) adres IP. Jest posortowane i uniqliczy liczbę wystąpień.

Dane wyjściowe wyglądałyby następująco (z twoim przykładem jako plikiem wejściowym):

  1 111.111.111.1
  3 111.11.111.111
  6 111.111.11.111

Ostatni na wyjściu próbował 6 razy.

chaos
źródło
to najlepsza odpowiedź @chaos - dodana do mojego zestawu przydatnych onelinerów - dzięki!
Jake
Świetne rozwiązanie. Nie wiedziałem, że grep może wyodrębniać dopasowania wyrażeń regularnych, a nie tylko filtrować linie. Właśnie dodałem | sort -ndo łańcucha.
kravemir
1
Dobra odpowiedź - wielokrotne grepy są zwykle znakiem używanym sed. sed -nr '/Failed/{s/.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1/;p}'zastępuje oba greps.
Orion
1
@orion prawda, ale wyobraź sobie, że pierwszym grepem może być zgrep "Failed" /var/log/auth.log*także przeszukiwanie skompresowanych archiwów logów, czego sednie można.
chaos
1
Co z IPv6?
Ortomala Lokni 14.04.16
6

Może to być rozdęte rozwiązanie, ale sugeruję przyjrzenie się instalacji czegoś takiego jak Fail2Ban

Jest przeznaczony do tego rodzaju logowania + dodaje premię za możliwość dodania (tymczasowych) reguł w zaporze sieciowej, aby zablokować powtarzających się przestępców. Pamiętaj jednak, aby dodać do białej listy swoje własne adresy IP, udało mi się jednak chwilowo zablokować się

Jake
źródło
Cóż, miły komentarz, ale nie odpowiedź na pytanie. To bardziej sugestia, która mogłaby usunąć potrzebę pytania, ale nie potrzebuję demona do monitorowania moich plików. Mam swoje powody, dla których muszę tworzyć tę listę jako plik tekstowy tylko za pomocą skryptów. :)
kravemir
Zgadzam się z @Miro, gdybyś nie wspomniał o tym tutaj, dodałbym to w komentarzu.
SailorCire,
@Miro, masz rację, a nie odpowiedź na samo pytanie, po prostu przyszło ci do głowy jako wygodne narzędzie do tego rodzaju logowania.
Jake,
0

Sprawdziło się to dla mnie naprawdę dobrze. (Adresy IP zostały zmienione, aby chronić winnych)

$ awk '/Failed/ {x[$(NF-3)]++} END {for (i in x){printf "%3d %s\n", x[i], i}}' /var/log/auth.log | sort -nr
 65 10.0.0.1
 14 10.0.0.2
  4 10.0.0.3
  1 10.0.0.4
Falsenames
źródło
0
grep "Failed password for" /var/log/auth.log |
    awk -F"from" {'print $2'} |
    awk {'print $1'} |
    sort -u
Liviu Popescu
źródło
Rezultat jest password- nie działa. Nie obejmuje nawet różnych typów pozycji, awkkolumna drukowania jest alternatywą dla cut, a nie rozwiązaniem.
kravemir
Działa dla mnie albo z próbką powyżej ou real /var/log/auth.log
Archemar
Cóż, nie działało to przed edycją - kiedy komentarz został dodany. Teraz działa poprawnie. Jednak tęskni uniq -cjak w najlepszej odpowiedzi.
kravemir