Análisis de archivos de registro para IP frecuentes

Análisis de archivos de registro para IP frecuentes

Entonces, hackeé esto mientras sufría un ataque DDOS para sacartraviesoips fuera de mis registros. ¿Alguien tiene alguna mejora u otras sugerencias para mejorarlo?

Aquí está la idea general:

  1. extraer las IP únicamente del archivo de registro
  2. ordenarlos
  3. uniq y contarlos
  4. ordenarlos de nuevo

Y la cuerda de flautas:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt

Respuesta1

Siempre he usado esto:

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

Con tailPuedo establecer el límite de qué tan atrás realmente quiero llegar; bueno si no usas la rotación de registros (por cualquier motivo), segundo, lo estoy usando, awkya que la mayoría de los registros están delimitados por espacios. Me he dejado con la capacidad de extraer información adicional (posiblemente qué URL estaban visitando, estados, navegadores, etc.) agregando la $variable apropiada. Por último, hay un defecto en uniqque solo funciona en pares que se tocan, es decir:

A
A
A
A
B
A
A

Producirá:

4 A
1 B
2 A

No es el resultado deseado. Entonces ordenamos la primera columna (en este caso las ips, pero podríamos ordenar otras columnas), luego uniqlas ordenamos y finalmente ordenamos el recuento de manera ascendente para poder ver los infractores más altos.

Respuesta2

Parece que estás en medio de reinventar elfalla2banrueda.

Échale un vistazo a fail2ban. Probablemente ya haga lo que desea y, si no, es fácil de personalizar.

Respuesta3

Marco Ceppi tiene razón al decir que awkes una mejor herramienta para esto, pero awk también es una mejor herramienta sorty uniqdesde entonces esa lógica se puede trasladar a awk. No hace mucha diferencia si solo estás siguiendo 1000 líneas, pero si quieres ver un enorme archivo de registro de varios gigas, puede ser mucho más rápido moverlo a awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -nhará lo que necesita pero es mucho más rápido para archivos grandes. Crea una matriz de IP en awk, utilizando la dirección IP como clave y la cantidad de veces que aparece la IP como valor.

La aceleración se debe a que awk pasa los datos y hace la mayor parte del trabajo, excepto ordenar el resultado final. Usando el otro método, si tiene 1.000.000 de líneas en el registro de transferencia, awk lee esas 1.000.000 de líneas escupiendo 1.000.000 de IP, luego ordena las 1.000.000 de IP completas y envía las 1.000.000 de IP ahora ordenadas a uniq, lo que las reduce a un número mucho más pequeño. cantidad de datos antes de darlos para ordenar. En lugar de realizar múltiples pasadas en 1.000.000 de IP, awk hace casi todo en una sola pasada.

Usando un registro de Apache de 5.513.132 líneas (1,1 gigas) en mi computadora portátil, aquí hay una comparación de velocidades:

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

información relacionada