Analysieren von Protokolldateien für häufige IPs

Analysieren von Protokolldateien für häufige IPs

Ich habe das hier also zusammengehackt, während ich einen DDOS-Angriff durchmachte, umfrechips aus meinen Protokollen. Hat jemand Verbesserungen oder andere Vorschläge, um es besser zu machen?

Hier ist die allgemeine Idee:

  1. ziehe IPs nur aus der Logdatei
  2. sortieren
  3. uniq und zähle sie
  4. sortiere sie erneut

Und die Pfeifensaite:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt

Antwort1

Ich habe immer dies verwendet:

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

Damit tailkann ich die Grenze festlegen, wie weit ich wirklich zurückgehen möchte – gut, wenn Sie die Protokollrotation nicht verwenden (aus welchem ​​Grund auch immer). Zweitens nutze ich awk– da die meisten Protokolle durch Leerzeichen getrennt sind, habe ich mir die Möglichkeit gelassen, zusätzliche Informationen herauszuziehen (möglicherweise welche URLs sie aufgerufen haben, Status, Browser usw.), indem ich die entsprechende $Variable hinzufüge. Schließlich gibt es einen Fehler darin, uniqder nur bei sich berührenden Paaren funktioniert – IE:

A
A
A
A
B
A
A

Wird herstellen:

4 A
1 B
2 A

Nicht die gewünschte Ausgabe. Also sortieren wir die erste Spalte (in diesem Fall die IPs, aber wir könnten auch andere Spalten sortieren), dann uniqdiese und schließlich die Anzahl aufsteigend, damit ich die größten Übeltäter sehen kann.

Antwort2

Es klingt, als wären Sie gerade dabei, dasFehler2BanRad.

Schauen Sie sich fail2ban an. Es macht wahrscheinlich schon, was Sie wollen, und wenn nicht, lässt es sich leicht anpassen.

Antwort3

Marco Ceppi hat Recht, dass awkes hierfür das bessere Tool ist, aber awk ist auch ein besseres Tool als sortund uniq, da diese Logik in verschoben werden kann awk. Es macht keinen großen Unterschied, wenn Sie nur 1000 Zeilen verfolgen, aber wenn Sie sich eine riesige Protokolldatei mit mehreren Gigabyte ansehen möchten, kann es um Größenordnungen schneller sein, diese in zu verschieben awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -nerledigt, was Sie brauchen, ist aber bei großen Dateien viel schneller. Es erstellt ein Array von IPs in awk, wobei die IP-Adresse als Schlüssel und die Häufigkeit des Auftretens der IPs als Wert verwendet wird.

Die Beschleunigung ergibt sich daraus, dass awk einen Durchgang über die Daten durchführt und die meiste Arbeit erledigt, mit Ausnahme des Sortierens der endgültigen Ausgabe. Wenn Sie bei der anderen Methode 1.000.000 Zeilen im Übertragungsprotokoll haben, liest awk diese 1.000.000 Zeilen und gibt 1.000.000 IPs aus. Anschließend durchläuft sort die gesamten 1.000.000 IPs und sendet die nun sortierten 1.000.000 IPs an uniq, das sie auf eine viel kleinere Datenmenge reduziert, bevor diese an sort übergeben wird. Anstatt herumzuleiten/mehrere Durchläufe über 1.000.000 IPs durchzuführen, erledigt awk fast alles in einem Durchgang.

Anhand eines 5.513.132 Zeilen umfassenden Apache-Protokolls (1,1 GB) auf meinem Laptop lässt sich folgender Geschwindigkeitsvergleich durchführen:

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

verwandte Informationen