Comment configurer une alerte par e-mail quand une connexion ssh est réussie?

43

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

J'utilise Ubuntu 12.04 en cours d'exécution xfce

    
posée Rick T 24.08.2012 - 16:10
la source

9 réponses

41
  

Avertissement: 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 <[email protected]>" -t "Your Name <[email protected]>" -s smtp.server.com &

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

Remarque: vous aurez besoin du package sendemail ( sudo apt-get install sendemail ) pour que la notification par courrier électronique fonctionne.

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

    
réponse donnée SirCharlo 24.08.2012 - 17:16
la source
57
  

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

Comme la méthode sshrc ne fonctionne pas si l'utilisateur possède son propre fichier ~/.ssh/rc , j'expliquerai comment procéder avec pam_exec comme suggéré par @adosaiguas. La bonne chose est que cela peut également être facilement adapté aux types de connexion autres que ssh (tels que les connexions locales ou même toutes les connexions) en accrochant un fichier différent dans /etc/pam.d/ .

Vous devez d’abord pouvoir envoyer des messages à partir de la ligne de commande. Il y a d'autres questions à ce sujet. Sur un serveur de messagerie, il est probablement plus facile d'installer mailx (qui est probablement déjà installé de toute façon).

Ensuite, vous avez besoin d’un fichier de script exécutable login-notify.sh (je le mets par exemple dans /etc/ssh/ ) avec le contenu suivant. Vous pouvez modifier les variables pour modifier l'objet et le contenu de la notification par courrier électronique. N'oubliez pas d'exécuter chmod +x login-notify.sh pour le rendre exécutable.

#!/bin/sh

# Change these two lines:
sender="[email protected]"
recepient="[email protected]"

if [ "$PAM_TYPE" != "close_session" ]; then
    host="'hostname'"
    subject="SSH Login: $PAM_USER from $PAM_RHOST on $host"
    # Message to send, e.g. the current environment variables.
    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 :

session optional pam_exec.so seteuid /path/to/login-notify.sh

À des fins de test, le module est inclus en tant que optional , de sorte que vous pouvez toujours vous connecter si l’exécution échoue. Après vous être assuré que cela fonctionne, vous pouvez remplacer optional par required . Ensuite, la connexion ne sera possible que si l'exécution de votre script de hook réussit (si c'est ce que vous voulez).

Pour ceux d’entre vous qui ont besoin d’une explication de ce qu’est PAM et de son fonctionnement, voici un très bon un .

    
réponse donnée Fritz 16.04.2014 - 16:39
la source
8

Nous avons utilisé monit pour surveiller les processus sur nos boîtes Linux. monit peut également alerter par e-mail sur les connexions réussies sur ssh. Notre configuration monit ressemble à ceci:

 check file ssh_logins with path /var/log/auth.log  
     # Ignore login's from whitelist ip addresses
     ignore match "100.100.100.1"    
     # Else, alert
     if match "Accepted publickey" then alert

Remarque: La configuration du serveur de messagerie, le format de courrier électronique, etc. doivent être définis dans le fichier monitrc

Mise à jour: Rédiger un article de blog plus détaillé sur ceci

    
réponse donnée Litmus 02.06.2014 - 13:52
la source
4

Mettez ce qui suit dans /etc/profile :

if [ -n "$SSH_CLIENT" ]; then 
    TEXT="$(date): ssh login to ${USER}@$(hostname -f)" 
    TEXT="$TEXT from $(echo $SSH_CLIENT|awk '{print }')" 
    echo $TEXT|mail -s "ssh login" [email protected] 
fi

Comment fonctionne le script

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

Ensuite, nous construisons ensuite le texte du message:

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

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

Résumé Par défaut, Linux enregistre toutes les connexions système, que ce soit ssh ou non, dans les fichiers journaux du système, mais parfois - en particulier pour un système auquel on accède rarement via ssh - une notification rapide peut être utile.

    
réponse donnée user476225 26.11.2015 - 11:48
la source
1

Dans cette autre question , vous avez probablement ce que vous recherchez. En gros, vous pouvez ajouter un appel à la commande de messagerie dans le script exécuté lorsqu'un utilisateur se connecte via ssh: /etc/pam.d/sshd

    
réponse donnée adosaiguas 24.08.2012 - 17:01
la source
1

Ce script dans /etc/ssh/sshrc envoie un e-mail et ajoute un journal au système de journalisation. Une différence est faite (vous pouvez donc la désactiver si vous le souhaitez) entre votre sous-réseau personnel et le World Wide Web (requiert sudo apt-get install mailutils ).

SUBNET="192.168.0"

IP='echo $SSH_CONNECTION | cut -d " " -f 1'
CURRENT_SUBNET="$(echo $IP|cut -d'.' -f1-3)"
if [ "$CURRENT_SUBNET" = "$SUBNET" ]; then
        msg="This message comes from same subnet! User $USER just logged in from $IP"
        echo $msg|mail -s "$msg" root
else
        msg="This message comes from different subnet! User $USER just logged in from $IP"
        echo $msg|mail -s "$msg" root
fi

logger -t ssh-wrapper $USER login from $IP
    
réponse donnée Philippe Gachoud 11.05.2018 - 15:11
la source
0

Je viens de modifier @SirCharlo answer

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

logger -t ssh-wrapper $USER login from $ip
echo "User $USER just logged in from $ip" | mail -s "SSH Login" "who to <[email protected]>" &

Cela fonctionne sur les serveurs 14.04, 16.04 et Centos 6.5.x que j'ai configurés, je suis sûr que vous devez vous assurer que mta est configuré, mais une fois cela fait, cela fonctionne à merveille. Prochaines étapes twilio alerts

    
réponse donnée MrMesees 13.12.2016 - 14:24
la source
0

J'ai pris quelques-unes des excellentes réponses de ce sujet et créé quelque chose qui est plus ou moins copiable et collable. Il utilise Mailgun pour envoyer les e-mails, ce qui vous évite tout problème lors de la configuration de STMP. Vous avez juste besoin d'une clé API Mailgun et d'un domaine d'envoi.

Lors de la connexion SSH, le script envoie les détails de la connexion (utilisateur, nom d’hôte, adresse IP et toutes les variables d’environnement actuelles) à une adresse électronique. Il est facile d'ajouter d'autres paramètres que vous souhaitez envoyer en personnalisant la variable message .

#!/bin/sh

# this script is triggered on SSH login and sends an email with details of the login
# such as user, IP, hostname, and environment variables

# script should be placed somewhere on the server, eg /etc/ssh
# to trigger on SSH login, put this line in /etc/pam.d/sshd:
#   session optional pam_exec.so seteuid /etc/ssh/snippet-for-sending-emails-on-SSH-login-using-PAM.sh

# Script settings
MAILGUN_API_KEY=
MAILGUN_DOMAIN=
SENDER_NAME=
SENDER_EMAIL_ADDRESS=
RECIPIENT_EMAIL_ADDRESS=

if [ "$PAM_TYPE" != "close_session" ]; then
    host=$(hostname)
    ip=$(dig +short myip.opendns.com @resolver1.opendns.com) # gets public IP
    # Message to send, e.g. the current environment variables.
    subject="SSH login - user:$USER pam-host:$PAM_RHOST host:$host ip:$ip" \
    message=$(env)
    curl -s --user '$MAILGUN_API_KEY' \
        https://api.mailgun.net/v3/$MAILGUN_DOMAIN/messages \
        -F from='$SENDER_NAME <$SENDER_EMAIL_ADDRESS>' \
        -F to=$RECIPIENT_EMAIL_ADDRESS \
        -F subject="$subject" \
        -F text="${subject} ${message}"
fi
    
réponse donnée pacharanero 16.11.2017 - 19:12
la source
0

Adaptation de mailgun de @Fritz answer

Après avoir posté, j'ai remarqué que @pacharanero écrit aussi sur mailgun, mais je ne le fais pas comprendre ce qu'ils font avec dig, donc je posterai aussi ma solution.

Si vous êtes sur une VM sans SMTP, vous devrez peut-être utiliser quelque chose comme mailgun, sendgrid, etc. Cela a fonctionné pour moi sur Google Cloud.

Un des risques de cette approche est qu’un attaquant peut recevoir vos identifiants d’e-mail sortants s’ils peuvent sudo su et trouver le script ou si vous laissez le script pour envoyer des e-mails lisibles. mailgun a une liste blanche ip que vous devez configurer, mais c'est imparfait pour ce cas particulier, évidemment.

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

#!/bin/bash
if [ "$PAM_TYPE" != "close_session" ]; then
    APK='api:your-mailgun-api-key-goes-here' 
    FROM='Login Alert <[email protected]>'
    TO='[email protected]'  
    SUBJECT="Login: $PAM_USER @ mydomain.com from $PAM_RHOST"
    DATE=$(date)
    TEXT="At $DATE a login occurred for $PAM_USER on mydomain.com from $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

Après cela, vous pouvez suivre la réponse de @Fritz pour modifier /etc/pam.d/sshd afin d'inclure:

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

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

    
réponse donnée Paul 04.07.2018 - 08:29
la source

Lire d'autres questions sur les étiquettes