¿Cómo recuperar direcciones IP de posibles atacantes ssh?


17

Acabo de cat /var/log/auth.logregistrarme y ver que hay muchos | grep "Failed password for"registros.

Sin embargo, hay dos tipos de registros posibles: para usuarios válidos / no válidos. Se complica mis intentos de | cutellos.

Me gustaría ver crear una lista (archivo de texto) con direcciones IP de posibles atacantes y número de intentos para cada dirección IP. ¿Hay alguna manera fácil de crearlo?

Además, solo en relación con ssh: ¿Qué registros /var/log/auth.logdebo tener en cuenta al hacer una lista de posibles atacantes?

Ejemplo de mi 'auth.log' con números ocultos:

cat /var/log/auth.log | grep "Failed password for" | sed 's/[0-9]/1/g' | sort -u | tail

Resultado:

Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user ucpss from 111.11.111.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user vijay from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user webalizer from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user xapolicymgr from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user yarn from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user zookeeper from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for invalid user zt from 111.11.111.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for mysql from 111.111.11.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for root from 111.11.111.111 port 11111 ssh1
Mar 11 11:11:11 vm11111 sshd[111]: Failed password for root from 111.111.111.1 port 11111 ssh1

Le sugiero que cree claves ssh, las instale en su servidor y desactive las contraseñas por completo en el archivo de configuración sshd de su servidor /etc/ssh/sshd_config... configuraciones de búsqueda PasswordAuthentication noy PermitRootLogin without-password ... luego, todos los intentos de contraseña se frustrarán antes de ingresar al auth.log ...
Scott Stensland

Respuestas:


19

Podrías usar algo como esto:

grep "Failed password for" /var/log/auth.log | grep -Po "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" \
| sort | uniq -c

Busca la cadena Failed password fory extrae ( -o) la dirección IP. Se ordena y uniqcuenta el número de ocurrencias.

La salida se vería así (con su ejemplo como archivo de entrada):

  1 111.111.111.1
  3 111.11.111.111
  6 111.111.11.111

El último en la salida ha intentado 6 veces.


esta es la mejor respuesta @chaos - agregada a mi caja de líneas útiles - ¡gracias!
Jake

Gran solución No sabía que grep puede extraer coincidencias de expresiones regulares, y no sólo las líneas de filtro. Acabo de agregar | sort -na la cadena.
kravemir

1
Buena respuesta: múltiples greps suelen ser una señal para usar sed. sed -nr '/Failed/{s/.*([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*/\1/;p}'reemplaza a ambos greps.
orion

1
@orion true pero imagine que el primer grep también puede ser zgrep "Failed" /var/log/auth.log*buscar a través de los archivos de registro comprimidos, lo sedque no puede.
caos

1
¿Qué pasa con IPv6?
Ortomala Lokni

6

Puede ser una solución hinchada, pero le sugiero que busque instalar algo como Fail2Ban

Está hecho para este tipo de inicio de sesión + agrega la ventaja de poder agregar reglas (temporales) en su firewall para bloquear a los infractores reincidentes. Asegúrese de lista blanca, aunque su propio de IP, logré encerrarme a cabo temporalmente en algunas ocasiones


Bueno, buen comentario, pero no una respuesta a la pregunta. Es más como sugerencia de que podría eliminar la necesidad de la pregunta, pero no necesito un demonio para controlar mis archivos. Tengo mis razones ¿Por qué necesito para hacer esa lista como archivo de texto con sólo secuencias de comandos. :)
kravemir

Estoy de acuerdo con @Miro, si no lo hubieras mencionado aquí, lo habría agregado en un comentario.
SailorCire

@Miro, tienes razón, no es una respuesta a la pregunta misma, que acaba de venir a la mente como una herramienta conveniente para este tipo de registro.
Jake

0

Esto funcionó muy bien para mí. (Las IP se han cambiado para proteger al culpable)

$ awk '/Failed/ {x[$(NF-3)]++} END {for (i in x){printf "%3d %s\n", x[i], i}}' /var/log/auth.log | sort -nr
 65 10.0.0.1
 14 10.0.0.2
  4 10.0.0.3
  1 10.0.0.4

0
grep "Failed password for" /var/log/auth.log |
    awk -F"from" {'print $2'} |
    awk {'print $1'} |
    sort -u

El resultado es que passwordno funciona. Que ni siquiera cubre diferentes tipos de entrada, awkimprimir columna es alternativa a la cut, no la solución.
Kravemir

A mí me funciona bien con el ejemplo anterior ou /var/log/auth.log reales
Archemar

Bueno, no funcionó antes de la edición, cuando se hizo el comentario. Ahora funciona correctamente. Sin embargo, se pierde uniq -ccomo en la mejor respuesta.
Kravemir
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.