Análisis de archivos de registro para IP frecuentes


12

Entonces, pirateé esto juntos mientras sufría un ataque DDOS para sacar ips traviesos de mis registros. ¿Alguien tiene alguna mejora u otras sugerencias para mejorarlo?

Aquí está la idea general:

  1. sacar ip solo del archivo de registro
  2. ordenarlos
  3. uniq y contarlos
  4. ordenarlos de nuevo

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


No estoy seguro de si esto sería mejor preguntar en los webmasters ... pero dado que todo está utilizando utilidades Unix, y la línea de comando ... pensé que aquí sería más apropiado.
Gabe.

Parece bien aquí. Está basado en Unix y no es específico de las cosas web (esto podría aplicarse a muchas cosas diferentes en las IP de los registros de Apache o firewall)
Stefan Lasiewski

Respuestas:


7

Siempre he usado esto:

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

Gracias a tailque soy capaz de establecer el límite de la distancia que realmente quiero llegar, bueno si no usa la rotación de registros (por cualquier razón), en segundo lugar estoy haciendo uso awk, ya que la mayoría de los registros están delimitados por espacios I ' Me dejé a mí mismo con la capacidad de extraer información adicional (posiblemente, qué URL estaban golpeando, estados, navegadores, etc.) agregando la $variable adecuada . Por último, un defecto uniqsolo funciona al tocar pares - IE:

A
A
A
A
B
A
A

Producirá:

4 A
1 B
2 A

No es la salida deseada. Entonces ordenamos la primera columna (en este caso, los ips, pero podríamos ordenar otras columnas) y luego las uniqordenamos, finalmente ordenamos el recuento ascendente para que pueda ver a los delincuentes más altos.


Sí, me di cuenta del problema con uniq también, de ahí mi primer tipo para poner todos los IPS en orden para que los duplicados estén uno al lado del otro. La punta de la cola también es agradable, ya que analizar el registro completo en alrededor de 4 GB puede llevar algo de tiempo. Buenas cosas, gracias.
Gabe.

-k1es redundante, (1) solo hay una clave (2) sortcomienza a usar la primera palabra como clave de todos modos.
Lekensteyn

7

Parece que estás en medio de reinventar la rueda fail2ban .

Dale a fail2ban una mirada. Probablemente ya haga lo que desea, y si no, es fácil de personalizar.


1
Ese es un proyecto bastante interesante del que no estaba al tanto, gracias. Al mismo tiempo, no quiero instalar nada en el servidor de registro que no sea necesario, y es bastante fácil hacer lo que ya estoy haciendo. Solo estoy buscando sugerencias sobre mejoras. ¡Gracias!
Gabe.

Esto se ve realmente genial, y GPL también.
Eli Frey

7

Marco Ceppi tiene razón acerca de awkser una mejor herramienta para esto, pero awk también es una mejor herramienta que sorty uniqdesde que esa lógica se puede trasladar awk. No hace mucha diferencia si solo estás siguiendo 1000 líneas, pero si quieres ver un gran archivo de registro de múltiples conciertos, puede ser mucho más rápido moverlo awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -nhará lo que necesite 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 las IP se producen como valor.

La aceleración se produce porque awk pasa una vez por los datos y hace la mayor parte del trabajo, excepto para ordenar la salida 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 que escupen 1,000,000 de IPs, luego ordena las 1,000,000 de IPs completas, enviando las 1,000,000 de IP ahora clasificadas a uniq, lo que lo reduce a un tamaño mucho más pequeño cantidad de datos antes de dar eso para ordenar. En lugar de pasar / hacer múltiples pases con 1,000,000 de IP, awk hace casi todo en un solo paso.

Utilizando un registro de apache de 5.513.132 líneas (1.1 gigas) en mi computadora portátil, aquí hay una comparación de velocidad:

  • 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

Muy genial. Estoy agregando esto a mi bolsa de trucos.
Gabe.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.