Analisi dei file di registro per IP frequenti


12

Quindi, ho hackerato questo insieme mentre subivo un attacco DDOS per estrarre ip cattivi dai miei registri. Qualcuno ha qualche miglioramento o altri suggerimenti per renderlo migliore?

Ecco l'idea generale:

  1. estrarre solo ip dal file di registro
  2. ordinali
  3. uniq e contali
  4. riordinali di nuovo

E la stringa o'pipes:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt


Non sono sicuro se questo sarebbe meglio chiedere ai webmaster ... ma dal momento che utilizza tutto unix utils e la riga di comando ... Ho pensato che qui sarebbe più appropriato.
gabe.

Qui va bene. È basato su Unix e non è specifico per le cose Web (questo potrebbe eventualmente applicarsi a molte cose diverse negli IP dei registri di Apache o firewall)
Stefan Lasiewski,

Risposte:


7

L'ho sempre usato:

tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1

Con tailsono in grado di impostare il limite di quanto lontano voglio davvero andare - bene se non si utilizza la rotazione del registro (per qualsiasi motivo), secondo che sto facendo uso di awk- dal momento che la maggior parte dei registri sono delimitati da spazio io ' mi sono lasciato con la possibilità di estrarre informazioni aggiuntive (possibilmente quali URL stavano colpendo, stati, browser, ecc.) aggiungendo la $variabile appropriata . Infine, un difetto uniqfunziona solo in coppie toccanti - IE:

A
A
A
A
B
A
A

Produrrà:

4 A
1 B
2 A

Non l'output desiderato. Quindi ordiniamo la prima colonna (in questo caso l'IP, ma potremmo ordinare altre colonne), quindi le uniqstesse, infine ordiniamo il conteggio crescente in modo che io possa vedere i criminali più alti.


Sì, ho capito anche il problema con uniq, quindi il mio primo tipo per mettere in ordine tutti gli IPS in modo che i duplicati siano uno accanto all'altro. La punta della coda è bella, poiché l'analisi del registro a circa 4 GB può richiedere del tempo. Roba buona, grazie.
gabe.

-k1è ridondante, (1) c'è solo una chiave (2) sortinizia ad usare la prima parola come chiave comunque.
Lekensteyn,

7

Sembra che tu sia nel bel mezzo di reinventare la ruota fail2ban .

Dai un'occhiata a fail2ban. Probabilmente fa già quello che vuoi e, in caso contrario, è facile da personalizzare.


1
È un progetto piuttosto interessante di cui non ero a conoscenza, grazie. Allo stesso tempo, non voglio installare sul log server nulla che non sia necessario ed è abbastanza facile fare quello che sto già facendo. Sto solo cercando suggerimenti su miglioramenti. Grazie!
gabe.

Sembra davvero bello, e anche GPL.
Eli Frey,

7

Marco Ceppi ha ragione awksull'essere uno strumento migliore per questo, ma Awk è anche uno strumento migliore di sorte uniqpoiché questa logica può essere spostata awk. Non fa molta differenza se stai solo tagliando 1000 linee ma se vuoi guardare un enorme file di registro multi-concerto, possono essere ordini di grandezza più veloci a spostarlo in awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -nfarà ciò di cui hai bisogno ma è molto più veloce per file di grandi dimensioni. Crea un array di IP in awk, usando l'indirizzo IP come chiave e il numero di volte in cui si verifica l'IP come valore.

L'accelerazione arriva perché awk esegue un passaggio sui dati e svolge gran parte del lavoro, tranne che per l'ordinamento dell'output finale. Utilizzando l'altro metodo, se nel registro di trasferimento sono presenti 1.000.000 di righe, awk legge quelle 1.000.000 di righe che emettono 1.000.000 di IP, quindi l'ordinamento va oltre gli interi 1.000.000 di IP, inviando i 1.000.000 di IP ora ordinati a uniq che lo riducono a un valore molto più piccolo quantità di dati prima di fornirli. Invece di eseguire il piping / eseguire più passaggi su 1.000.000 di IP, awk esegue quasi tutto in un unico passaggio.

Utilizzando un registro apache di 5.513.132 righe (1.1 concerti) sul mio laptop, ecco un confronto di velocità:

  • 2m 45s cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
  • 0m 40s cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n

Molto bello. Sto aggiungendo questo alla mia borsa di trucchi.
gabe.
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.