Analyser les fichiers journaux pour les IP fréquentes


12

Donc, j'ai piraté cela ensemble tout en subissant une attaque DDOS pour retirer les ips coquins de mes journaux. Quelqu'un a-t-il des améliorations ou d'autres suggestions pour l'améliorer?

Voici l'idée générale:

  1. extraire uniquement l'IP du fichier journal
  2. les trier
  3. uniq et les compter
  4. les trier à nouveau

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


Je ne sais pas si cela serait mieux demandé dans les webmasters ... mais comme il utilise tous des utilitaires Unix et la ligne de commande ... je me suis dit que ce serait plus approprié.
gabe.

Semble bien ici. Il est basé sur Unix et n'est pas spécifique aux éléments Web (cela pourrait éventuellement s'appliquer à de nombreuses choses dans les IP des journaux Apache ou du pare-feu)
Stefan Lasiewski

Réponses:


7

Je l'ai toujours utilisé:

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

Avec tailje suis en mesure de définir la limite de l'arrière-plan que je veux vraiment aller - bon si vous n'utilisez pas la rotation des journaux (pour une raison quelconque), deuxièmement, j'utilise awk- car la plupart des journaux sont délimités par l'espace, je ' Je me suis laissé la possibilité d'extraire des informations supplémentaires (éventuellement les URL qu'ils atteignaient, les statuts, les navigateurs, etc.) en ajoutant la $variable appropriée . Enfin, un défaut uniqne fonctionne que par paires touchantes - IE:

A
A
A
A
B
A
A

Produira:

4 A
1 B
2 A

Pas la sortie souhaitée. Nous trions donc la première colonne (dans ce cas, les ips, mais nous pourrions trier d'autres colonnes) puis uniqelles, puis trions le nombre croissant pour que je puisse voir les délinquants les plus élevés.


Oui, j'ai également réalisé le problème avec uniq, d'où mon premier tri pour mettre tous les IPS en ordre afin que les doublons soient côte à côte. La pointe de la queue est agréable, car l'analyse de l'ensemble du journal à environ 4 Go peut prendre un certain temps. Bon, merci.
gabe.

-k1est redondant, (1) il n'y a qu'une seule touche (2) sortcommence quand même à utiliser le premier mot comme clé.
Lekensteyn

7

On dirait que vous êtes en train de réinventer la roue fail2ban .

Jetez un œil à fail2ban. Il fait probablement ce que vous voulez déjà, et sinon, il est facile à personnaliser.


1
C'est un projet assez intéressant dont je n'étais pas au courant, merci. En même temps, je ne veux rien installer sur le serveur de journalisation qui ne soit pas nécessaire, et c'est assez facile de faire ce que je fais déjà. Je cherche juste des suggestions d'améliorations. Merci!
gabe.

Cela a l'air vraiment cool, et la GPL aussi.
Eli Frey

7

Marco Ceppi a raison d' awkêtre un meilleur outil pour cela, mais awk est également un meilleur outil que sortet uniqpuisque cette logique peut être déplacée vers awk. Cela ne fait pas beaucoup de différence si vous ne faites que suivre 1000 lignes, mais si vous souhaitez consulter un énorme fichier journal multi-gig, il peut être plus rapide de déplacer cela vers awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -nfera ce dont vous avez besoin mais est beaucoup plus rapide pour les gros fichiers. Il crée un tableau d'adresses IP dans awk, en utilisant l'adresse IP comme clé et le nombre de fois où les adresses IP se produisent comme valeur.

L'accélération vient du fait qu'awk passe les données et fait la plupart du travail, sauf pour trier la sortie finale. En utilisant l'autre méthode, si vous avez 1 000 000 de lignes dans le journal de transfert, awk lit ces 1 000 000 lignes crachant 1 000 000 IP, puis le tri passe sur l'ensemble des 1 000 000 IP, envoyant les 1 000 000 IP désormais triées à uniq, ce qui le réduit à un nombre beaucoup plus petit. quantité de données avant de donner à trier. Au lieu de contourner / faire plusieurs passes sur 1 000 000 IP, awk fait presque tout en une seule passe.

En utilisant un journal Apache de 5 513 132 lignes (1,1 Go) sur mon ordinateur portable, voici une comparaison de vitesse:

  • 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

Très cool. J'ajoute cela à mon sac de trucs.
gabe.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.