sshLogger.py

Continuando con los servidores OpenSSH, ya dijimos en el post anterior que, al ponerlos en funcionamiento de forma rápida, podemos sufrir multitud de ataques (o intentos de ataque al menos). Para poder monitorizar lo que ocurre, en lo que respecta a los accesos, en nuestro servidor existen los ficheros de log. Por defecto, los eventos relativos a nuestro servidor SSH están almacenados en /var/log/auth.log.

Uno de los inconvenientes que puede tener es que la información que se encuentra en ese fichero corresponde a muchos otros servicios del sistema por lo que en algunos casos hay que recurrir a herramientas externas para poder buscar lo que nos interesa dentro del fichero. Una forma sencilla de visualizar de forma cómoda y organizada los datos relativos a nuestro servidor SSH en el fichero log antes mencionado o cualquier otro distinto, es usar el script python que podéis encontrar AQUÍ.

Está concebido para OpenSSH-Server bajo sistemas Linux y no requiere la instalación de ningún paquete externo al lenguaje. Organiza y permite ver la información interesante con facilidad y está optimizado para servidores cuyo nivel de log (‘LogLevel’) tiene el valor ‘INFO’.

sshLogger01

  • Monitoriza los siguientes tipos de entradas:

    – [Mes] [Día] [Hora] [Host] sshd: Server listening on [IP] [PORT].
    – [Mes] [Día] [Hora] [Host] sshd: Accepted password for [USER] [IP] [PORT] ssh2
    – [Mes] [Día] [Hora] [Host] sshd: Received disconnect from [IP] x: disconnected by [USER]
    – [Mes] [Día] [Hora] [Host] sshd: pam_unix(sshd:auth): authentication failure; [LOGNAME] [UID] [EUID] [TTY] [RUSER] [RHOST] [USER]
    – [Mes] [Día] [Hora] [Host] sshd: Did not receive identification string from [IP]
    – [Mes] [Día] [Hora] [Host] sshd: Accepted publickey for [USER] from [IP] [PORT] ssh2: [KEY]
    – [Mes] [Día] [Hora] [Host] sshd: message repeated [X] times: [ Failed password for [USER] from [IP] [PORT] ssh2]
    – [Mes] [Día] [Hora] [Host] sshd: reverse mapping checking getaddrinfo for [ADDR. INFO] [IP] failed – POSSIBLE BREAK-IN ATTEMPT!

sshLogger02

Permite visualizar solo las que se elijan previamente con los argumentos del script además de visualizarlas completas, una a una, no mostrarlas y/o almacenar la salida seleccionada en un fichero de nuestra elección (dicho fichero puede existir previamente y ser sobreescrito/encadenado o ser creado si es necesario).

sshLogger03

Las opciones disponibles son las siguientes:

Usage: sshLogger.py [-hspcfnkrb] [-o|-d] [-l <file>]

–version                Muestra la versión del programa
-h, –help               Muestra la ayuda

Opciones SSH:
-s, –server-up        Muestra las veces que un servidor se puso en funcionamiento
-p, –acc-passwords    Muestra las sesiones abiertas
-c, –closed-sessions  Muestra las sesiones cerradaas
-f, –failed-auth      Muestra las autentificaciones fallidas
-n, –no-idents        Muestra las identificaciones no recibidas
-k, –public-keys      Muestra las claves públicas aceptadas
-r, –repeat           Muestra los mensajes repetidos
-b, –break-in         Muestra los intentos de ataque

Display Options:
-o, –one-by-one       Muestra las entradas una por una
-d, –no-display       No muestra las entradas por la salida estándar

File Options:
-l <FILE>, –log=<FILE>   Guarda las entradas seleccionadas en <file>

Las opciones [-spcfnkrb] son compatibles entre si y es necesario que se elija, al menos, una de ellas. Ĺas opciones [od] son opcionales e incompatibles entre sí. La opción [l] es optativa y compatible con cualquiera de las anteriores opciones.

Es un script que se realizó en Python por motivos ajenos a la eficiencia. Con un script en Bash podría realizarse la misma tarea en muchas menos líneas de código pero el objetivo era desempolvar un poco Python y el tema elegido se lo debemos al post anterior. Espero que os ayude en algo.

Saludos y que no os maten los gurús.

 

Configuración básica de OpenSSH

Siempre he utilizado SSH para conectarme a mi equipo personal con Linux Mint desde cualquier otra parte por su facilidad de instalación,

sudo apt-get install openssh-server

configuración y uso. Debido a esto y tras revisar algunos archivos de log me di cuenta de que, tan rápido como pones en marcha un servidor SSH en tu equipo

sudo start ssh

empiezan los ataques por fuerza bruta sin tapujos.

Al principio supuse que con un simple cambio de puerto, del 22 utilizado por defecto para conexiones SSH a cualquier otro de mi elección, conseguiría darle esquinazo a esos ataques, aparentemente «genéricos». Para ello basta con modificar una línea en el archivo /etc/ssh/sshd_config (no confundir con /etc/ssh/ssh_config que corresponde a la configuración del cliente). Abrimos el archivo:

sudo nano /etc/ssh/sshd_config 

y buscamos la línea «Port 22» y la sustituimos por ejemplo por «Port 5582». Guardamos el archivo y reiniciamos nuestro servidor:

sudo restart ssh 

Los ataques disminuyeron drásticamente tanto en frecuencia como en intensidad pero, aún continuaban a pesar de ser menos agresivos y constantes. Para solventar este problema SSH ofrece múltiples opciones. Yo voy a mostrar una que me parece bastante sencilla, efectiva y funcional: Desactivar el login a través de contraseña y hacerlo a través de claves públicas RSA. Para ello abriremos de nuevo nuestro archivo de configuración /etc/ssh/sshd_config y nos aseguramos de que los atributos mostrados a continuación tengan los siguientes valores:

RSAAuthentication yes
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no 

Modificamos las entradas pertinentes y guardamos los cambios en el archivo. Ahora vamos a crear nuestras claves pública y privada RSA. Lo hacemos con el siguiente comando (Este paso habrá que realizarlo de la misma forma en la máquina cliente):

ssh-keygen -t rsa -C "nombreDelArchivo"
chmod 0700 ~/.ssh/* 

Tu clave pública quedará en ~/.ssh/nombreDelArchivo.pub y tu clave privada en ~/.ssh/nombreDelArchivo

Ahora continuaremos configurando el cliente. Una vez generadas las claves (por ejemplo cliente y cliente.pub). Para ello crearemos un archivo ~/.ssh/config con el siguiente contenido:

Host SERVERNAME
Hostname ip-or-domain-of-server
User USERNAME
PubKeyAuthentication yes
IdentityFile ~/.ssh/client 

Guardamos los el nuevo archivo con los datos correspondientes y enviamos nuestra clave pública al servidor al que nos queremos conectar con el siguiente comando:

ssh-copy-id -i ~/.ssh/client.pub SERVERNAME 

Volviendo al servidor podemos reiniciarlo para asegurarnos de aplicar todos los cambios y proceder a probar la conexión desde el cliente. Recordad utilizar la opción -p para indicar el nuevo puerto en caso de que se haya modificado en el primer paso del post. Al intentar conectarnos lo hará automáticamente sin necesidad de introducir contraseña. Con esta pequeña configuración, evitaremos prácticamente todos los ataques típicos que solemos ver cuando montamos un pequeño servidor SSH en nuestra máquina:

  • Jan 1 11:22:33 HostName sshd[num]: reverse mapping checking getaddrinfo for [ADDR. INFO] [IP] failed – POSSIBLE BREAK-IN ATTEMPT!
  • Feb  1 20:25:29 HostName sshd[num]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=999.999.999.999  user=root

Como colofón final podemos añadir un banner para dar la bienvenida a los clientes que accedan a nuestro servidor descomentando en el archivo /etc/ssh/sshd_config la línea Banner /etc/issue y añadiendo el mensaje que nos apetezca en /etc/issue (Deberemos reiniciar el servidor para que se apliquen los cambios. Algo curioso para dar vida al banner: http://patorjk.com/software/taag/). Ahora solo queda conectarnos a nuestro servidor:

ssh -p 5582 usuario@ipDelServidor 

sshNoPass