Recibir un aviso en Telegram cuando alguien se conecta a nuestro servidor por SSH

En este artículo vamos a ver como crear un bot de Telegram que nos avise cada vez que se inicie sesión por SSH en alguno de nuestros servidores. Una cosa tan sencilla pero que nos dota de una seguridad extra ya que seremos conscientes de quién inicia sesión en nuestro servidor, cuándo y desde dónde, ya sea un usuario legítimo o ilegítimo y sin tener que andar rebuscando en los logs.

El script aquí utilizado es obra de @matriphe y lo podéis ver en sus Gists, todos los créditos son suyos y yo no he tenido nada que ver en la creación de ese script, simplemente vengo a explicar como utilizarlo en nuestros servidores.

Requisitos

Para poder utilizar este script tenemos que cumplir unos requisitos:

En el servidor necesitamos:

  • Un sistema operativo GNU/Linux, cualquiera de ellos serviría siempre y cuándo tenga capacidad para ejecutar scripts BASH. Yo he realizado el proceso sobre un “Debian 8” Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64
  • JQ instalado, veremos como hacerlo aunque es lo más simple del mundo
  • Conexión a internet y acceso por SSH activado.
  • Permisos de administrador

A mayores:

  • Telegram instalado en el teléfono móvil, ordenador, etc ya que será dónde recibiremos los avisos

Proceso

Lo primero será crear el bot de Telegram, directamente desde la propia aplicación de Telegram es lo más fácil y rápido, para ello accedemos al siguiente enlace https://telegram.me/BotFather desde el dispositivo en el que tengamos instalado Telegram.

Una vez abierto lo primero que haremos será iniciar el bot con el comando:

/start

El bot nos mostrará la lista de comandos que tiene disponibles para interactuar con él, nos interesa el comando para crear un bot nuevo:

/newbot

Nos solicitará el nombre para nuestro bot, aquí ya cada uno pondrá el que desee y más se ajuste a sus necesidades así que lo escribimos y lo enviamos. Tras el nombre del bot nos pedirá el nombre de usuario que utilizará ese bot así que igual que antes le ponemos el que más nos apetezca.

Una vez asignados los nombres nos devolverá un token que tendremos que guardar ya que lo necesitaremos más adelante, así que lo apuntamos, un token de ejemplo sería:

3029871:AuGsE5WcZXHeTlnz8pRtHkKlEgm0qxOA1

Con el token de nuestro bot para identificarlo frente a la API de Telegram copiamos el script de @matriphe y lo abrimos con un procesador de textos cualquiera:

 

USERID=""
KEY=""
TIMEOUT="10"
URL="https://api.telegram.org/bot$KEY/sendMessage"
DATE_EXEC="$(date "+%d %b %Y %H:%M")"
TMPFILE='/tmp/ipinfo-$DATE_EXEC.txt'
if [ -n "$SSH_CLIENT" ]; then
	IP=$(echo $SSH_CLIENT | awk '{print $1}')
	PORT=$(echo $SSH_CLIENT | awk '{print $3}')
	HOSTNAME=$(hostname -f)
	IPADDR=$(hostname -I | awk '{print $1}')
	curl http://ipinfo.io/$IP -s -o $TMPFILE
	CITY=$(cat $TMPFILE | jq '.city' | sed 's/"//g')
	REGION=$(cat $TMPFILE | jq '.region' | sed 's/"//g')
	COUNTRY=$(cat $TMPFILE | jq '.country' | sed 's/"//g')
	ORG=$(cat $TMPFILE | jq '.org' | sed 's/"//g')
	TEXT="$DATE_EXEC: ${USER} logged in to $HOSTNAME ($IPADDR) from $IP - $ORG - $CITY, $REGION, $COUNTRY on port $PORT"
	curl -s --max-time $TIMEOUT -d "chat_id=$USERID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null
	rm $TMPFILE
fi

Y en él añadimos dos valores (entre las comillas):

  • KEY: Es el token que nos ha proporcionado @BotFather al crear nuestro bot
  • USERID: Para obtener este campo hay que enviar un mensaje cualquiera a nuestro bot a través de Telegram y acceder a la ruta https://api.telegram.org/bot<KEY>/getUpdates (sustituimos la parte de <KEY> por el token de antes), nos saldrá un texto con formato JSON como el que vemos a continuación:
{"ok":true,"result":[{"update_id":219XXXX,"message":{"message_id":13,"from":{"id":451XXXX,"first_name":"Nombre","username":"Usuario"},"chat":{"id":4515XXXX,"first_name":"Nombre","username":"Usuario","type":"private"},"date":14853XXXXX,"text":"Un texto cualquiera"}}]}

De ahí tenemos que coger el ID del chat o del campo from, en el ejemplo anterior sería el “451XXXX”. Una vez hemos sustituido ambos datos estamos listos para comunicarnos con nuestro bot.

Así que guardamos el script con el nombre ssh-telegram.sh dentro de /etc/profiles.d y le damos permisos de ejecución:

chmod +x /etc/profiles.d/ssh-telegram.sh

Necesitarás permisos de administrador para poder escribir en la ruta indicada.

Ahora, El problema es que a pesar de podernos comunicar con nuestro bot, el script no funcionará porque requiere la librería JQ para poder interpretar los datos recibidos de la página IPInfo que es de dónde recogemos la IP desde la que se ha conectado el usuario al servidor.

Así que instalamos JQ, como Debian lo tiene en los repositorios simplemente usamos apt-get (como super usuario):

apt-get install jq

Si no usas Debian, puedes “instalarlo” accediendo a su página web y descargándolo (este link lleva a la descarga de la versión 1.5 para Linux de 64 bit, si el tuyo es diferente descárgalo desde su página). Una vez descargado lo guardas donde quieras, le das permisos de ejecución y creas un enlace simbólico a la ruta donde tú sistema almacena los ejecutables.

Con esto ya tenemos todo listo, A partir de ahora cada vez que iniciemos sesión por SSH a nuestro servidor nos llegará un aviso al Telegram diciéndonos qué usuario se ha conectado, desde dónde, la IP y el puerto que ha utilizado lo que nos servirá, como decíamos al principio, para tener controlado quién inicia sesión (al menos por SSH) en nuestro servidor.

No olvidemos que esto es una medida extra y no es infalible, pero ayuda a controlar y proteger un poco más nuestra infraestructura.

Espero que sea de utilidad, cualquier duda o sugerencia puedes dejarla en los comentarios.