Aviso por Telegram de los acceso a través de SSH

Para recibir un aviso cada vez que se hace  un acceso a través de ssh, necesitamos crear un pequeño script que nos diga la ip de la persona que acede y otros datos.

Lo primero que necesitamos es la librería de JSON processor

sudo apt-get install jq

y luego creamos el archivo ssh-telegram.sh y lo editamos en la carpeta de /etc/profile.d, que contiene los script que se ejecutaran a todos los usuarios al iniciar sesión.

sudo nano /etc/profiles.d/ssh-telegram.sh

He introducimos el siguiente código :

#!/bin/bash

USERID="USERID" #UserId de telegram de la persona a la que le llegan los mensajes
KEY="API KEY" #API key de el Bot de Telegram.
TIMEOUT="10"
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=$(curl -s http://whatismijnip.nl |cut -d " " -f 5)
	curl http://ipinfo.io/$IP -s -o $TMPFILE
	BOGON=$(cat $TMPFILE | jq '.bogon' | sed 's/"//g')
	if $BOGON ;then
		TEXT="$DATE_EXEC: ${USER} logged in to $HOSTNAME ($IPADDR) from Local Network $IP on port $PORT"
	else
		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"
	fi
	curl -s --max-time $TIMEOUT -d "chat_id=$USERID&disable_web_page_preview=1&text=$TEXT" $URL > /dev/null 2>&1
	rm $TMPFILE
fi

Para obtener el User Id y el Api key de Telegram os recomiendo revisar esta entrada

Al hacer login a través de SSH, nos manda un mensaje parecido a este:

Edición : he cambiado el script para que avise de las conexiones cuando es local o exterior

4 comentarios en «Aviso por Telegram de los acceso a través de SSH»

  1. Hola mi nombre es Pedro , primero de todo agradecer el post , me ha sido muy útil , soy nuevo en esto ( aun que se podría decir que me pilla mayor XD ) y voy aprendiendo a medida que me encuentro con proyectos a realizar , la interacción de Telegram y mi Paspberry pi era de mi interés .
    Solo he modificado el tramo final del script porque me daba error .
    URL=”https://api.telegram.org/bot$KEY/sendMessage”
    curl -s -X POST $URL -d chat_id=$USERID -d text=”$TEXT” &>/dev/null
    No se si me abre dejado algo útil, pues aunque estuve analizando el código y buscando e interpretando algunos comando que desconocía , esta parte no se si es un error pero me lo daba y no acabe de interpretar:
    $URL > /dev/null 2>&1
    Por otra parte , lo guarde en la ubicación correcta /etc/profiles.d/ssh-telegram.sh , pero e aquí una duda si podrías echarme un cable , he instalado zsh con shell por curiosidad y pruebas y en este caso el script deja de funcionar , podrías orientarme del porqué?
    Un saludo y gracias de antemano .

  2. Hola Pedro. gracias por pasarte por aquí.
    He actualizado el script, por que los símbolos si que estaban mal.
    También he añadido al principio del script “#!/bin/bash” para que no de problemas desde zsh

    Revísalo y si tienes cualquier duda no dudes en preguntar

  3. Hola otra vez , la verdad no lo he conseguido , he agregado #!/bin/bash, pero no me ha funcionado , buscando por ahí he por lo que he leído que zsh no trabaja con /etc/profile.d.
    https://askubuntu.com/questions/476246/when-i-use-zsh-how-do-i-set-path-in-etc-profile-d.
    Siguiendo los comentarios de un usuario he añadido la modificación que describen en /etc/zsh/zshenv .

    if [ -d /etc/profile.d ]; then
    for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
    . $i
    fi
    done
    unset i
    fi

    Cuando he cambiado de Shell y he vuelto a entrar por ssh me envía 3 notificaciones seguidas XDD.
    Seguiré investigando, merci por tu interés también .

  4. Hola
    Te comento no me acordaba que lo resolví de otra forma en mi servidor .. lo acabo de ver
    usando el pam.d.
    Prueba a abrir el archivo /etc/pam.d/common-session y en el puedes añadir al final algo como esto :

    #Notify through Telegram
    session optional pam_exec.so type=open_session /opt/scripts/telegram_login.sh

Deja un comentario