76 votes

Comment configurer une alerte e-mail lorsque une connexion ssh réussit ?

Est-ce que quelqu'un a un script bash qui enverra un e-mail ou notifiera quelqu'un en cas de connexion réussie à un serveur ssh ? Je veux être notifié si quelqu'un se connecte à ma boîte personnelle.

Je suis sous Ubuntu 12.04 avec xfce.

92voto

Fritz Points 1023

Avertissement : Comme toujours lorsque vous modifiez la configuration de connexion, laissez une session ssh de sauvegarde ouverte en arrière-plan et testez la connexion depuis un nouveau terminal.

Comme la méthode sshrc ne fonctionne pas si l'utilisateur a son propre fichier ~/.ssh/rc, je vais expliquer comment faire cela avec pam_exec comme l'a suggéré @adosaiguas. La bonne chose est que cela peut également être facilement adapté à d'autres types de connexions que ssh (comme les connexions locales ou même toutes les connexions) en se connectant à un fichier différent dans /etc/pam.d/.

Tout d'abord, vous devez être capable d'envoyer des mails depuis la ligne de commande. Il y a d'autres questions à ce sujet. Sur un serveur de messagerie, il est probablement le plus facile d'installer mailx (qui est probablement déjà installé de toute façon). Vous devez configurer mailx afin que l'utilisateur root puisse envoyer des mails.

Ensuite, vous avez besoin d'un fichier de script exécutable login-notify.sh avec le contenu suivant. Vous pouvez modifier les variables pour changer le sujet et le contenu de la notification par e-mail. Vous pouvez mettre le fichier dans /usr/local/bin ou dans /etc/ssh/ par exemple. N'oubliez pas d'exécuter chmod +x login-notify.sh pour le rendre exécutable. Et donnez la propriété à root avec sudo chown root:root login-notify.sh, afin que personne ne puisse altérer le script.

#!/bin/sh

# Change these two lines:
sender="adresse-expediteur@exemple.com"
recepient="adresse-destinataire@exemple.org"

if [ "$PAM_TYPE" != "close_session" ]; then
    host="`hostname`"
    subject="Connexion SSH : $PAM_USER depuis $PAM_RHOST sur $host"
    # Message à envoyer, par exemple les variables d'environnement actuelles.
    message="`env`"
    echo "$message" | mailx -r "$sender" -s "$subject" "$recepient"
fi

Une fois que vous avez cela, vous pouvez ajouter la ligne suivante à /etc/pam.d/sshd (avec le bon /chemin/vers/login-notify.sh bien sûr) :

session optional pam_exec.so seteuid /chemin/vers/login-notify.sh

À des fins de test, le module est inclus en tant que optionnel, afin que vous puissiez quand même vous connecter si l'exécution échoue. Vous pourriez changer optionnel en requis. Cependant, cela empêchera toute connexion SSH à moins que le script ne soit exécuté avec succès. Je ne suis pas sûr que ce soit une bonne idée...

Pour ceux d'entre vous ayant besoin d'une explication sur ce qu'est PAM et comment il fonctionne, voici une très bonne explication.

56voto

SirCharlo Points 37508

Attention : selon les commentaires, cela ne fonctionne pas si l'utilisateur crée un fichier appelé ~/.ssh/rc.*

Modifiez ou créez /etc/ssh/sshrc avec le contenu suivant:

ip=`echo $SSH_CONNECTION | cut -d " " -f 1`

logger -t ssh-wrapper $USER login from $ip
echo "User $USER just logged in from $ip" | sendemail -q -u "SSH Login" -f "Originator " -t "Your Name " -s smtp.server.com &

Cela vous avertira efficacement par e-mail à chaque fois que quelqu'un se connecte via SSH, et la connexion sera enregistrée dans le syslog.

Remarque : Vous aurez besoin du paquet sendemail (sudo apt-get install sendemail) pour que la notification par e-mail fonctionne.

Remarque : fonctionne avec le transfert de port, mais pas avec l'option -N.

13voto

user476225 Points 131

Placez ce qui suit dans /etc/profile:

if [ -n "$SSH_CLIENT" ]; then 
    TEXT="$(date): connexion ssh de ${USER}@$(hostname -f)" 
    TEXT="$TEXT depuis $(echo $SSH_CLIENT|awk '{print $1}')" 
    echo $TEXT|mail -s "connexion ssh" you@your.domain 
fi

Comment fonctionne le script

/etc/profile est exécuté à chaque connexion (pour les utilisateurs de bash shell). L'instruction if ne renverra vraie que si l'utilisateur s'est connecté via ssh, ce qui entraînera l'exécution du bloc de code indenté.

Ensuite, nous construisons le texte du message:

  • $(date) sera remplacé par la sortie de la commande date
  • ${USER} sera remplacé par le nom d'utilisateur de l'utilisateur
  • $(hostname -f) sera remplacé par le nom complet de l'hôte du système auquel l'utilisateur se connecte

La deuxième ligne TEXT s'ajoute à la première, en donnant l'adresse IP du système à partir duquel cet utilisateur se connecte. Enfin, le texte généré est envoyé par e-mail à votre adresse.

En résumé, Linux enregistrera par défaut chaque connexion système, que ce soit via ssh ou non, dans les fichiers journaux système, mais parfois - notamment pour un système rarement accédé via ssh - une notification rapide et simple peut être utile.

11voto

Litmus Points 251

Nous utilisons monit pour surveiller les processus sur nos serveurs linux. Monit peut également alerter par e-mails en cas de connexions réussies via ssh. Notre configuration Monit ressemble à ceci

 check file ssh_logins with path /var/log/auth.log  
     # Ignorer les connexions à partir des adresses IP de la liste blanche
     ignore match "100.100.100.1"    
     # Sinon, alerter
     if match "Accepted publickey" then alert

Remarque : La configuration du serveur de messagerie, le format des e-mails, etc. doivent être définis dans le fichier monitrc

Mise à jour: J'ai écrit un article de blog plus détaillé sur ce sujet ici

5voto

Mac Points 111

Adaptation Mailgun de la réponse @Fritz

Après avoir posté, j'ai remarqué que @pacharanero parle aussi de mailgun, mais je ne comprends pas ce qu'ils font avec dig, donc je vais poster ma solution également.

Si vous êtes sur une VM qui n'a pas de SMTP, vous pourriez avoir besoin d'utiliser quelque chose comme mailgun, sendgrid, ou similaire. Cela a fonctionné pour moi sur Google Cloud.

Un risque de cette approche est qu'un attaquant puisse obtenir vos informations d'envoi d'e-mails sortants s'ils peuvent faire sudo su et trouver le script ou si vous laissez le script pour l'envoi d'e-mails en lecture. mailgun a une liste blanche d'adresses IP que vous devriez configurer, mais cela est imparfait pour ce cas d'utilisation particulier, évidemment.

Ce script devrait fonctionner avec mailgun après avoir changé mydomain.com par votre domaine réel. Vous pourriez enregistrer le script dans /root/login-alert.sh ou dans un emplacement plus obscur.

#!/bin/bash
if [ "$PAM_TYPE" != "close_session" ]; then
    APK='api:votre-clé-api-mailgun-ici'
    FROM='Alerte de connexion '
    TO='moi@mydomain.com'
    SUBJECT="Connexion : $PAM_USER @ mydomain.com depuis $PAM_RHOST"
    DATE=$(date)
    TEXT="À $DATE, une connexion a eu lieu pour $PAM_USER sur mydomain.com depuis $PAM_RHOST"
    curl -s --user $APK \
     https://api.mailgun.net/v3/mg.mydomain.com/messages \
     -F from="$FROM" \
     -F to="$TO" \
     -F subject="$SUBJECT" \
     -F text="$TEXT"
fi

Ensuite, vous pouvez suivre la réponse de @Fritz pour modifier /etc/pam.d/sshd pour inclure :

session optional pam_exec.so seteuid /root/login-alert.sh

Je note que cela fonctionne sans permissions de lecture pour les utilisateurs arrivants (chmod 700 /root/login-alert.sh) donc les utilisateurs arrivants n'ont pas besoin d'avoir accès en lecture au script.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X