Envoi d’un mail lors d’une connexion SSH

I. Présentation

Dans ce tutoriel, nous allons apprendre à paramétrer un envoi de mail lors d'une connexion SSH à un serveur Linux. Cela peut être une solution simple et rapide pour savoir quand quelqu'un se connecte à votre serveur et cela en temps quasi réel (le temps d'envoi d'un mail). Nous allons voir que cette méthode peut s'appliquer à tous les utilisateurs se connectant en SSH,le plus intéressant à faire étant pour root car cela permet de superviser les connexions en SSH pour root et ainsi de détecter si il y a des connexions anormales.

II. Le fichier .bashrc

Chaque utilisateur possède un fichier ".bashrc" dans son "home" qui peut contenir, entre autre, des commandes exécutées lors de l'initialisation de son shell (ce qui se passe lors d'une connexion SSH). C'est de ce fichier que nous allons nous servir pour effectuer notre envoi de mail. Il suffit donc juste d'y placer les bonnes commandes.

Note: On par ici du principe que votre serveur est capable d'envoyer des mails.

III. Un utilisateur spécifique

Nous voulons par exemple qu'à chaque connexion SSH pour l'utilisateur "root", un mail nous soit envoyé directement. Nous allons donc aller dans le fichier "/root/.bashrc" ("/root" étant le "home" du super-utilisateur) et y ajouter cette commande :

echo 'NOTIFICATION - Acces SSH en '` id | cut -d "(" -f2 | cut -d ")" -f1`' sur '`hostname`' le: ' `date` `who` | mail -s "NOTIFICATION - Connexion en "`id | cut -d '(' -f2 | cut -d ')' -f1`" via SSH depuis: `who | cut -d"(" -f2 | cut -d")" -f1`" < adresse mail >

Nous allons maintenant détailler un peu cette commande :

On distingue d'abord deux grandes parties, "echo" et "mail" séparées par un pipe ("|"). La première commande servant à écrire le contenu du mail et la deuxième à l'envoyer en précisant son objet et son destinataire.

  • '` id | cut -d "(" -f2 | cut -d ")" -f1`' ( attention aux accents et apostrophes qui permettent d'isoler la commande du texte ! ): Cette commande permet de récupérer les informations de l'utilisateur (UID, GID et nom) avec "id" puis de couper la chaine en sortie pour ne récupérer que le nom de l'utilisateur et l'afficher dans le mail avec "cut".
  • `who | cut -d"(" -f2 | cut -d")" -f1` ( attention aux accents et apostrophes qui permettent d'isoler la commande du texte ! ): Cette commande permet de récupérer les informations sur les sessions en cours avec "who" utilisé un peu plus tôt également et de couper la sortie pour ne récupérer que l'IP source de la connexion avec "cut".
  • "date" qui permet d'affiche la date et l'heure de la connexion ce qui peut toujours être utile
  • "hostname" qui permet de récupérer le nom de l'hôte .

On ajoute bien sur à l'adresse mail de destination pour finir la commande. Nous aurons donc un résultat comme celui-ci :

Exemple d'alerte SSH
Exemple d'alerte SSH

IV. Tous les utilisateurs

Le fichier "/etc/bash.bashrc" permet d'effectuer les modifications que l'on y met sur tous les fichiers ".bashrc" des utilisateurs. C'est une manière d'éviter de modifier chaque fichier ".bashrc" à la main. Les envois de notifications se feront donc pour toutes les connexions SSH de tous les utilisateurs. Il faut donc y mettre la même commande que précédemment .

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

Mickael Dorigny

Fondateur d'IT-Connect.fr et d'Information-security.fr. Auditeur sécurité chez Amossys.

    mickael a publié 475 articles sur IT-Connect.See all posts by mickael

    5 réactions sur “Envoi d’un mail lors d’une connexion SSH

    • 11/04/2015 à 11:30
      Permalink

      Bonjour Mickaël

      J’ai avancé sur mon projet Raspberry et ce tuto m’intéresse. Mais j’aimerais éclaircir ce que tu écris:
      Dans ta commande tu mets :
      … Connexion en « `id | cut -d ‘(‘ -f2 | cut -d ‘)’ -f1` » via SSH depuis: …
      Dans l’explication:
      id | cut -d « ( » -f2 | cut -d « ) » -f1
      en précisant l’importance des accents et apostrophes, donc laquelle est la bonne?

      Autre chose, toujours sur Rasp, j’ai bien reçu le lien OMV pour Rasp par Florian (je l’en remercie), mais j’ai créé un utilisateur distant chrooté, puis un dossier_upload sur une seconde partition (sur DD-Usb petite capacité pour tests), pour qu’il puisse déposer ses fichiers/répertoires via Filezilla, et paramétré sshd_config en conséquence. Ce qui me va pour l’instant.
      Je souhaite déporter directement ce dossiers_upload de sauvegarde sur un Nas (plus grande capacité) présent sur mon réseau, ce qui transformerait ma Rasp en « passerelle d’accès ». Je n’ai trouvé un tuto que sur § 9-2, qui semblerait correspondre à mon besoin mais assez peu explicatif. Est-ce que mettre le chemin vers le Nas directement à la ligne ChrootDirectory dans sshd_config ne pourrait suffire? Et de toute façon, quelle syntaxe utiliser?

      Quelques conseils ou liens me seraient grandement utiles.
      Merci d’avance,
      fahdyezz

      Répondre
    • 29/11/2015 à 09:31
      Permalink

      Bonjour,

      Attention à la distinction entre bash et SSH. Il est fréquent qu’une connexion ssh ouvre un interpréteur bash, mais ce n’est pas systématique ! On peut penser à l’interpréteur git, à SFTP, voire à une configuration qui lance un interpréteur zsh au lieu de bash.
      Sans compter qu’on recevra un mail à chaue nouvelle session bash (su, connexion locale, ouverture d’un terminal virtuel, …).
      Pour être informé des connexions SSH, voir plutôt le fichier sshrc.

      Répondre

    Laisser un commentaire

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