Recibir un aviso de un bot de Telegram cuando se realice una conexión ssh a nuestros servidores | Algo de Linux

jueves, 26 de enero de 2017

Recibir un aviso de un bot de Telegram cuando se realice una conexión ssh a nuestros servidores

Por seguridad, sería conveniente controlar qué conexiones ssh se realizan a nuestros servidores, de manera que recibamos un aviso cuando alguien realice la conexión. Este aviso podríamos realizarlo vía email, simplemente teniendo configurado un servicio postfix, ssmtp, etc..., o mediante Telegram.

Los que me conocéis ya sabéis lo mucho que me gusta Telegram por la potencia y las posibilidades que nos ofrece frente a otras opciones de mensajería como Whatsapp... 

Una muy importante es que puedo tener el cliente de Telegram instalado en varios dispositivos (smartphone, tablet, ordenador) o incluso usar la versión web que me va a permitir usar Telegram en equipos donde no lo tenga instalado;  y recibir avisos en todos los dispositivos. 

Otra característica importantísima es la posibilidad de usar bots, con lo que podemos ampliar la funcionalidad de Telegram. 

Una tercera, pero no por ello menos importante, es que podemos utilizar la API de Telegram para implementar scripts o aplicaciones que nos permitan recibir notificaciones en nuestros servidores o incluso controlarlos mediante un bot.

En este post vamos a utilizar un script llamado ssh-telegram.sh publicado por matriphe en GitHub, para vigilar las conexiones ssh que se realizan a nuestros servidores.

Si echáis un vistazo al script, veréis que lo he modificado ligeramente:
/etc/profile.d/ssh-telegram.sh
# save it as /etc/profile.d/ssh-telegram.sh
# use jq to parse JSON from ipinfo.io
# install jq from repositories on Ubuntu or Debian
# or get jq from here http://stedolan.github.io/jq/

USERID="<user_id>"
KEY="<bot_token>"

TIMEOUT="10"
URL="https://api.telegram.org/bot$KEY/sendMessage"
DATE_EXEC="$(date "+%d %b %Y %H:%M")"
TMPFILE=/tmp/ipinfo-"$(date +"%Y%m%d-%H%M")".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=$(jq -r '.city' < $TMPFILE)
        REGION=$(jq -r '.region' < $TMPFILE)
        COUNTRY=$(jq -r '.country' < $TMPFILE)
        ORG=$(jq -r '.org' < $TMPFILE)

        if [ "$CITY" != null ] && [ "$REGION" != null ] && [ "$COUNTRY" != null ] && [ "$ORG" != null ]; then
           TEXT="$DATE_EXEC: ${USER} logged in to $HOSTNAME ($IPADDR) from $IP - $ORG - $CITY, $REGION, $COUNTRY on port $
        else
           TEXT="$DATE_EXEC: ${USER} logged in to $HOSTNAME ($IPADDR) from $IP on port $PORT"
        fi
        curl -s --max-time $TIMEOUT -d "chat_id=$USERID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null
        rm $TMPFILE
fi
Este script hace uso del comando jq para parsear el fichero JSON obtenido de ipinfo.io que nos proporciona información acerca de la IP desde la que se realiza la conexión, si es pública. Así que, lo primero que debemos hacer es instalar jq. En Debian o Ubuntu, es muy fácil porque el paquete se encuentra en los repositorios:

# apt-get install jq
El siguiente paso será copiar el script ssh-telegram.sh en el directorio /etc/profile.d:
# cp ssh-telegram.sh /etc/profile.d/
Una vez copiado, modificaremos los valores USERID y KEY en el script de manera que:
Y eso es todo. A partir de ese momento, recibiremos un mensaje de Telegram cada vez que un usuario realice una conexión ssh a nuestros servidores.
Publicado por primera vez en http://enavas.blogspot.com.es

2 comentarios:

Raul Tierno dijo...

Por aquí otro fan de Telegram.

Muy chula la funcionalidad

¿Usas alguna notificación más de este estilo? Estaría guay tener un registro de lo que pasa en el instituto a través del chat de Telegram

Esteban M. Navas Martín dijo...

La verdad es que Telegram está genial.

No tengo configuradas más notificaciones vía telegram. El resto de notificaciones las recibo vía email. Pero viendo la API de Telegram, con un poco de imaginación, se puede hacer cualquier cosa.