Linux : recevoir un e-mail lors d’une connexion SSH
Sommaire
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 :
Libre à vous d'adapter ce script afin de le personnaliser ! Mais, vous pouvez constater que cela fonctionne bien ! 🙂
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.
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 ?
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
Merci pour ce tutoriel
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^
Bonjour !
Super tutoriel, petite question est-ce normal que le mail s’envoie deux fois ?
Merci d’avance 🙂