Receiving a mail when someone connect through SSH

,

:fr: Version française

Bonjour,

Voici un petit script bash qui vise à envoyer un mail à chaque fois que quelqu’un se connecte en SSH. Dans mon cas, je suis le seul utilisateur autorisé à se connecter au serveur de cette manière, ce script me sert donc d’alerte en cas de compromission du serveur.
Il y a une partie géolocalisation qui est optionnelle.

Le script se trouve ici :

Pensez à ajouter la ligne suivante dans /etc/pam.d/sshd : session optional pam_exec.so seteuid /path/authentication_alert.bash

  • Le mail par défaut est celui de root, si vous ne redirigez pas vos mail vous pouvez entrer une autre adresse sur laquelle vous voulez revoir les mails envoyés par ce script.

  • Vous avez besoin d’un package pour envoyer les mails. Personnellement j’utilise mailx, mais il y en a d’autres. Utilisez celui qui vous plait et modifiez le script en conséquence.

:uk: English version

Hello,

Here is a little bash script which is ran everytime a user connect through SSH. Il will display the geolocation of the connecting user.

In my case, I am the only user allowed to connect through SSH, so the script intends to alert me if the server is compromised.

Here is the script :

  • You will need to add this ligne in /etc/pam.d/sshd : session optional pam_exec.so seteuid /path/authentication_alert.bash

  • Much comments are in french, use a translator like deepl if needed and don’t forget to translate the subject (“sujet”) and mail body (“Envoi mail” bloc) into your own language :smiley:

  • Nota : If you don’t redirect the root mail to another mail, change the “email” variable with the one where you want to receive those mails.

  • You will need a package to send the mail. I use mailx, but you can use another one.

#!/bin/bash

# Ajouter la ligne suivante dans /etc/pam.d/sshd, avec path le chemin du script : session optional pam_exec.so seteuid /path/authentication_alert.bash

# Packages requis : mailx

# Variables
hostname=$(hostname)
email=root@$HOSTNAME
sujet="[Supervision] Authentification sur ${hostname}"
LOG_FILE="/var/log/authentication_alert.log"
SCRIPT_NAME="authentication_alert.sh"
LOG_AUTH_FILE="/var/log/auth.log"
# Exemple de message recherche
# May 11 18:23:27 rpi-lle sshd[23395]: Accepted publickey for randomuser from 1.2.3.4 port 63238 ssh2
#####################################
# Programme
#####################################

# Bloc pour déterminer le type d'authentification (clef ou password)
if [ "grep "PubkeyAuthentication" /etc/ssh/sshd_config | grep "yes"" != "" ]; then
	type_authent="Accepted publickey"
else
	type_authent="Accepted password" 
fi

if [ "$PAM_TYPE" != "close_session" ]; then
	time=$(date)
	user=$PAM_USER
	fqdn=$PAM_RHOST

	#PAM_USER will be the name of the authenticated user, PAM_RHOST will be the name of the remote (connecting) host.
	#The value of PAM_RHOST depends on several factors:
	#if UseDNS is set to no in sshd_config, the value will be the IP address of the remote host;
	#otherwise, if the remote IP passes the FCrDNS check, the value will match that of the PTR record of the remote host (and you can get the IP with the help of gethostbyname() or a similar function);
	#otherwise, the value will be the IP address of the remote host.

	# On recupere la derniere connexion dans les logs SSH
	auth_message=$(grep $type_authent $LOG_AUTH_FILE | tail -l)
        
	# On extrait les infos
	user=$(echo $auth_message | sed -re "s/.*$type_authent for (\S+).*/\1/g")
	ip=$(echo $auth_message | sed -re 's/.*from (\S+).*/\1/g')
        
	# geoloc de l'IP
	geoloc_message=$(curl -s http://ip-api.com/json/$ip)
	pays=$(echo $geoloc_message | sed -re 's/.*"country":"([^"]+)".*/\1/g')
	ville=$(echo $geoloc_message | sed -re 's/.*"city":"([^"]+)".*/\1/g')
		
	# Envoi email
	if [ "$fqdn" != "$ip" ]; then
		echo -e "Bonjour,\n\nLe login $user s'est connecté sur ${hostname}.\nDate : $time\nIP : $ip\nFQDN : $fqdn\nPays : $pays\nVille : $ville" | mailx -s "$(echo $sujet)" $(echo $email)
	else
		echo -e "Bonjour,\n\nLe login $user s'est connecté sur ${hostname}.\nDate : $time\nIP : $ip\nPays : $pays\nVille : $ville" | mailx -s "$(echo $sujet)" $(echo $email)
	fi
        
	# Logging
	echo "$(date +"%Y/%m/%d %H:%M:%S" ) ${SCRIPT_NAME} hostname=\"${hostname}\" user=\"${user}\" ip=\"${ip}\" time=\"${time}\" fqdn=\"${fqdn}\" pays=\"${pays}\" ville=\"${ville}\"" >> ${LOG_FILE}
fi
exit 0

You will receive a mail like this one :

Subject : [Supervision] Authentification sur chaton.noho.st

Bonjour,

Le login randomuser s’est connecté sur chaton.noho.st.
Date : Sun 15 May 2022 08:56:22 PM CEST
IP : 1.2.3.4
FQDN : 1.2.3.4
Pays : France
Ville : Paris

5 Likes