Come recuperare gli indirizzi IP di possibili aggressori ssh?


17

Ho appena cat /var/log/auth.logregistrato e vedo che ci sono molti | grep "Failed password for"record.

Tuttavia, esistono due tipi di record possibili: per utente valido / non valido. Ciò complica i miei tentativi nei | cutloro confronti.

Vorrei vedere creare un elenco (file di testo) con gli indirizzi IP dei possibili aggressori e il numero di tentativi per ciascun indirizzo IP. C'è un modo semplice per crearlo?

Inoltre, per quanto riguarda solo ssh: quali elementi di tutti i record /var/log/auth.logdovrei considerare quando faccio un elenco di possibili aggressori?

Esempio del mio "auth.log" con numeri nascosti:

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

Risultato:

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

Ti suggerisco di creare chiavi ssh, installarle sul tuo server e disabilitare le password interamente nel tuo file di configurazione sshd del server /etc/ssh/sshd_config... impostazioni di ricerca PasswordAuthentication noe PermitRootLogin without-password ... quindi tutti questi tentativi di password verranno contrastati prima di entrare nel file auth.log ...
Scott Stensland,

Risposte:


19

Puoi usare qualcosa del genere:

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

Greps per la stringa Failed password fored estrae ( -o) l'indirizzo IP. È ordinato e uniqconta il numero di occorrenze.

L'output sarebbe quindi simile a questo (con il tuo esempio come file di input):

  1 111.111.111.1
  3 111.11.111.111
  6 111.111.11.111

L'ultimo nell'output ha provato 6 volte.


questa è la migliore risposta @chaos - aggiunta alla mia scatola di utili oneliners - grazie!
Jake,

Ottima soluzione Non sapevo che grep potesse estrarre corrispondenze regex, non solo filtrare le linee. Ho appena aggiunto | sort -nalla catena.
kravemir,

1
Buona risposta - più greps sono di solito un segno per usare sed. sed -nr '/Failed/{s/.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1/;p}'sostituisce entrambe le greps.
Orione,

1
@orion true, ma immagina che il primo grep possa essere zgrep "Failed" /var/log/auth.log*anche quello di cercare negli archivi di log compressi, cosa sedno.
caos,

1
Che dire di IPv6?
Ortomala Lokni,

6

Potrebbe essere una soluzione gonfia, ma ti suggerisco di guardare a installare qualcosa come Fail2Ban

È fatto per questo tipo di registrazione + aggiunge il vantaggio di poter aggiungere regole (temporanee) nel firewall per bloccare i recidivi. Assicurati di autorizzare il tuo IP, però, sono riuscito a bloccarmi temporaneamente in alcune occasioni


Bene, bel commento, ma non una risposta alla domanda. È più come un suggerimento che potrebbe rimuovere la necessità della domanda, ma non ho bisogno di un demone per monitorare i miei file. Ho i miei motivi per cui ho bisogno di fare quella lista come file di testo solo tramite script. :)
kravemir,

Sono d'accordo con @Miro, se non lo avessi menzionato qui lo avrei aggiunto in un commento.
SailorCire,

@Miro, hai ragione, non una risposta alla domanda stessa, mi è appena venuto in mente come uno strumento conveniente per questo tipo di registrazione.
Jake,

0

Questo ha funzionato davvero bene per me. (Gli IP sono stati cambiati per proteggere i colpevoli)

$ 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

0
grep "Failed password for" /var/log/auth.log |
    awk -F"from" {'print $2'} |
    awk {'print $1'} |
    sort -u

Il risultato è password: non funziona. Non copre nemmeno diversi tipi di voci, la awkcolonna di stampa è alternativa alla cut, non la soluzione.
kravemir,

Funziona con me o con un esempio sopra ou real /var/log/auth.log
Archemar

Bene, non ha funzionato prima della modifica - quando il commento era stato fatto. Ora funziona correttamente. Tuttavia, manca uniq -ccome nella migliore risposta.
kravemir,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.