Parsowanie plików dziennika dla częstych adresów IP

12

Więc zhakowałem to razem, przechodząc atak DDOS, aby wyciągnąć niegrzeczne IP z moich logów. Czy ktoś ma jakieś ulepszenia lub inne sugestie, aby to poprawić?

Oto ogólny pomysł:

  1. wyciągnij ip tylko z pliku dziennika
  2. posortuj je
  3. uniq i policz je
  4. posortuj je ponownie

I rury o'pipe:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt

Gabe.
źródło
Nie jestem pewien, czy lepiej byłoby o to zapytać webmasterów ... ale ponieważ wszystko korzysta z narzędzi unixowych i wiersza poleceń ... Pomyślałem, że tutaj będzie bardziej odpowiednie.
Gabe.
Wygląda tu dobrze. To UNIX, i nie jest specyficzna dla strony internetowej rzeczy (ta mogłaby mieć zastosowanie do wielu różnych rzeczy w Apache lub firewall logi IPS)
Stefan Lasiewski

Odpowiedzi:

7

Zawsze używałem tego:

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

Ponieważ tailjestem w stanie ustawić limit, o ile naprawdę chcę się cofnąć - dobrze, jeśli nie używasz obracania dziennika (z jakiegokolwiek powodu), po drugie korzystam awk- ponieważ większość dzienników jest rozdzielana spacjami, „ pozostawiłem sobie możliwość wyciągnięcia dodatkowych informacji (ewentualnie adresów URL, na które trafiali, statusów, przeglądarek itp.) poprzez dodanie odpowiedniej $zmiennej. Wreszcie błąd w uniqnim działa tylko w dotykających się parach - IE:

A
A
A
A
B
A
A

Będzie produkować:

4 A
1 B
2 A

Nie pożądana moc wyjściowa. Więc sortujemy pierwszą kolumnę (w tym przypadku IP, ale możemy sortować inne kolumny), a następnie uniqje, w końcu sortujemy liczbę rosnąco, aby zobaczyć najwyższych przestępców.

Marco Ceppi
źródło
Tak, zdałem sobie sprawę z problemu z uniq, stąd mój pierwszy rodzaj uporządkowania wszystkich IPS, aby duplikaty były obok siebie. Końcówka ogona jest również ładna, ponieważ analiza całego dziennika na około 4 GB może zająć trochę czasu. Dobre rzeczy, dzięki.
Gabe.
-k1jest redundantny, (1) jest tylko jeden klawisz (2) i tak sortzaczyna używać pierwszego słowa jako klucza.
Lekensteyn,
7

Wygląda na to, że jesteś w trakcie wymyślania koła fail2ban .

Spójrz na fail2ban. Prawdopodobnie robi to, co chcesz, a jeśli nie, łatwo to dostosować.

Warren Young
źródło
1
To całkiem ciekawy projekt, o którym nie wiedziałem, dzięki. Jednocześnie nie chcę instalować na serwerze dziennika niczego, co nie jest konieczne, i łatwo zrobić to, co już robię. Po prostu szukam sugestii ulepszeń. Dzięki!
Gabe.
To wygląda naprawdę fajnie, a także GPL.
Eli Frey,
7

Marco Ceppi ma rację, mówiąc, awkże jest lepszym narzędziem do tego, ale awk jest również lepszym narzędziem niż sorti uniqod kiedy można wprowadzić tę logikę awk. Nie robi to wielkiej różnicy, jeśli po prostu dostosowujesz 1000 linii, ale jeśli chcesz spojrzeć na ogromny plik dziennika z wieloma koncertami, może być szybszy o kilka rzędów wielkości awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -nzrobi to, czego potrzebujesz, ale w przypadku dużych plików jest znacznie szybszy. Tworzy tablicę adresów IP w awk, używając adresu IP jako klucza i liczby wystąpień adresów IP jako wartości.

Przyspieszenie przychodzi, ponieważ awk wykonuje jedno przejście przez dane i wykonuje większość pracy, z wyjątkiem sortowania końcowego wyniku. Używając drugiej metody, jeśli masz 1 000 000 linii w dzienniku przesyłania, awk odczytuje 1 000 000 linii wyrzucających 1 000 000 adresów IP, następnie sortowanie przechodzi przez całe 1 000 000 adresów IP, wysyłając teraz posortowane 1 000 000 adresów IP do uniq, co zmniejsza je do znacznie mniejszej ilość danych przed sortowaniem. Zamiast przesyłać wokół / wykonywać wiele przejść dla 1 000 000 adresów IP, awk robi prawie wszystko za jednym przejściem.

Korzystając z 5513,132 dziennika apache linii (1,1 koncertów) na moim laptopie, oto porównanie prędkości:

  • 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
Mark McKinstry
źródło
Bardzo fajny. Dodaję to do mojej torby sztuczek.
Gabe.