Linux : recevoir un e-mail lors d’une connexion SSH

I. Présentation

Dans ce tutoriel, nous allons voir comment configurer un serveur Linux afin de recevoir une notification par e-mail lorsqu'une connexion SSH est ouverte. Pour ma part, je vais utiliser une machine sous Debian 11, mais cela peut s'appliquer à d'autres distributions.

Cette notification par e-mail me semble pertinente pour surveiller l'activité de son serveur Linux et être avertie lorsqu'une personne se connecte sur le serveur via SSH. Lorsqu'il y a de très nombreuses connexions sur une machine, on peut douter de la nécessité et de la pertinence de ces notifications, mais lorsque l'accès est limité à une personne ou un groupe de quelques personnes, je trouve que c'est pertinent.

Si le sujet vous intéresse et que vous souhaitez le mettre en place sur votre serveur Linux, alors suivez le guide !

II. Comment allons-nous procéder ?

Au moment de s'authentifier sur un hôte Linux, le système d'authentification PAM entre en jeu afin de permettre à l'application (ici SSH) d'authentifier l'utilisateur sur le système. À partir du moment où SSH est installé sur le serveur, il crée le fichier "/etc/pam.d/sshd" : c'est dans ce fichier que nous allons ajouter un appel "pam_exec", ce dernier étant un module PAM qui permet d'exécuter une commande externe, ici notre script Bash.

Dans un premier temps, nous allons créer le script, puis ensuite nous allons le déclarer dans ce fichier. Une fois que ce sera fait, il ne restera plus qu'à tester.

Votre serveur doit être capable d'envoyer des e-mails, donc vous devez configurer un relais SMTP local si nécessaire (postfix, msmtp, etc.).

Remarque : vérifiez bien votre configuration, et assurez-vous d'avoir un autre moyen de connexion au serveur, car si le script n'est pas correct, ou que le fichier "pam.d/sshd" n'est pas correctement modifié, vous pouvez faire planter l'authentification via SSH.

III. Script bash - Alerte e-mail SSH

Enregistrez ce script où vous le souhaitez sur votre machine Linux. Vous pouvez créer un dossier spécifique pour les scripts liés à PAM, au moins ce sera organisé :

sudo mkdir /etc/pam.scripts

Créez le script dans votre dossier et modifiez-le avec votre éditeur préféré.

nano /etc/pam.scripts/ssh-alert.sh

Ce script commence bien sûr par le shebang, en l'occurrence ici celui de Bash. Ensuite, nous allons déclarer plusieurs variables :

  • expediteur : l'adresse e-mail de l'expéditeur, ici au format "<nom du serveur>[email protected]"
expediteur="`hostname`[email protected]"
  • destinataire : l'adresse e-mail du destinataire
destinataire="[email protected]"
  • objet : l'objet de l'e-mail, ici au format "<nom du serveur> - Connexion SSH"
objet="`hostname` - Connexion SSH"
  • body : le corps de l'e-mail, avec diverses informations dont l'adresse IP de l'hôte distant (via $PAM_RHOST), ainsi que le nom de l'utilisateur qui s'est connecté (via $PAM_USER)
body="<h2><b>Serveur `hostname` - Nouvelle connexion SSH</b></h2><br><b>- Hôte distant : </b>$PAM_RHOST<br><b>- Utilisateur : </b>$PAM_USER<br><b>- Date : </b>`date`"

Bien sûr, vous pouvez adapter le contenu de ces variables comme bon vous semble. L'e-mail sera envoyé au format HTML, ce qui permet d'utiliser les balises HTML pour mettre en forme l'e-mail, ajouter de la couleur, etc... Ensuite, ce script va contenir une condition if pour envoyer l'e-mail dans le cas où la session est ouverte, ce qui correspond à "open_session".

Voici le script "ssh-alert.sh" :

#!/bin/bash

expediteur="`hostname`[email protected]"
destinataire="[email protected]"
objet="`hostname` - Connexion SSH"
body="<h2><b>Serveur `hostname` - Nouvelle connexion SSH</b></h2><br><b>- Hôte distant : </b>$PAM_RHOST<br><b>- Utilisateur : </b>$PAM_USER<br><b>- Date : </b>`date`"

if [ ${PAM_TYPE} = "open_session" ]; then
    echo "${body}" | /usr/bin/mail -r "${expediteur}" -s "${objet}" "${destinataire}" -a "Content-Type: text/html"
fi
exit 0

Enregistrez le script, et attribuez-lui les droits qui vont bien :

chmod 700 /etc/pam.scripts/ssh-alert.sh
chmod +x /etc/pam.scripts/ssh-alert.sh

IV. Ajouter du script à pam.d/sshd

Le script est prêt, nous devons le déclarer dans le fichier "/etc/pam.d/sshd" :

nano /etc/pam.d/sshd

Tout à la fin, ajoutez le contenu suivant, basé sur pam_exec comme je l'évoquais précédemment (adaptez le chemin vers le script si besoin).

# Notification en cas de connexion SSH
session  required  pam_exec.so  /etc/pam.scripts/ssh-alert.sh

Enregistrez et fermez le fichier. Il ne reste plus qu'à tester.

V. Tester la notification par e-mail

C'est l'étape la plus simple : connectez-vous à votre serveur via SSH et vous devriez recevoir une notification par e-mail ! Le contenu du message sera semblable à celui-ci :

Notification e-mail SSH

Libre à vous d'adapter ce script afin de le personnaliser ! Mais, vous pouvez constater que cela fonctionne bien ! 🙂

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5501.Voir tous les posts

5 thoughts on “Linux : recevoir un e-mail lors d’une connexion SSH

  • Bonjour
    Je viens de tester. J’aurais deux questions :
    1/ comment on peut debugger et/ou loguer le script
    2/ quand cela ne fonctionne pas, faut il redémarrer Pam/la machine?

    Merci.

    Répondre
    • Bonjour,
      Pour tester sans risque avant de passer en production, je pense que l’on peut utiliser l’attribut « optional » au lieu de « required » dans le fichier « sshd » sous « pam.d ». Pour les logs, je n’ai pas la réponse, est-ce que tu as regardé comment pam.d gérait ses logs ?

      Répondre
      • Bonjour;
        Désolé du retard de la réponse.
        Je retrouve les logs dans syslog. mais je suis pris d’un doute subit:
        N’y a t il pas d’interférence(s) avec systemd?
        Mes logs remonte avec un entête systemd !
        Cordialement

        Répondre
  • Super tuto…
    Je ne m’étais jamais posé la question comment LOGuer par mail une connexion SSH : c’est chose faite… et ça donne d’autres idées 😉

    Par contre, dans le script, je mettrais
    if [ « ${PAM_TYPE} » = « open_session » ]; then
    plutôt que
    if [ ${PAM_TYPE} = « open_session » ]; then

    Petites notes aussi :
    – ne pas oublier de configurer Postfix
    – Ouvrir un nouveau terminal et se connecter sur le serveur pour tester… J’ai planté mon serveur en allant trop vite ^o^

    Répondre

Répondre à rsuinux Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.