web-dev-qa-db-fra.com

Comment configurer une alerte email quand une connexion ssh est réussie?

Est-ce que quelqu'un a un script bash qui va envoyer un email ou informer quelqu'un dans le cas d'une connexion réussie à un serveur ssh? Je souhaite être averti si quelqu'un se connecte à ma boîte personnelle.

J'utilise Ubuntu 12.04 sous xfce

55
Rick T

Attention: Selon les commentaires, cela ne fonctionnera 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 par courrier électronique chaque fois que quelqu'un se connectera via SSH, et le login sera enregistré 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 la redirection de port, mais pas avec l'option -N.

46
SirCharlo

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

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

Vous devez d’abord pouvoir envoyer du courrier à 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 script exécutable login-notify.sh (je le mets dans /etc/ssh/ par exemple) 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, afin que vous puissiez toujours vous connecter si l'exécution échoue. Après vous être assuré que cela fonctionne, vous pouvez modifier optional en required. Dans ce cas, la connexion ne sera possible que si l'exécution de votre script de raccordement est réussie (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, en voici un très bon .

67
Fritz

Nous avons utilisé monit pour surveiller les processus sur nos boîtes Linux. monit peut également alerter par email sur les connexions réussies via ssh. Notre monit config 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 courrier électronique, le format de courrier électronique, etc. doivent être définis dans le fichier monitrc.

Mise à jour: Écrit un --- plus détaillé article de blog à ce sujet

9
Litmus

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 $1}')" 
    echo $TEXT|mail -s "ssh login" [email protected] 
fi

Comment fonctionne le script

/etc/profile est exécuté à chaque connexion (pour les utilisateurs de bash shell). L'instruction if ne renvoie 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 le texte du message:

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

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

Résumé Linux enregistrera par défaut chaque connexion système, que ce soit par ssh ou non, dans les fichiers journaux du système, mais parfois - en particulier pour un système rarement utilisé via ssh - une notification rapide et incorrecte peut être utile.

7
user476225

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

2
adosaiguas

J'ai tiré quelques-unes des excellentes réponses de ce fil de discussion pour en faire quelque chose de plus ou moins copier-coller. Il utilise Mailgun pour envoyer les courriels, ce qui vous évite les problèmes de 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
2
pacharanero

J'utilise swatchdog à partir du package swatch pour contrôler les lignes contenant la phrase " fail "(insensible à la casse) dans /var/log/auth.log . Je l'ai configuré pour l'exécuter comme un simple service systemd.

apt install swatch

Créez un fichier de configuration /etc/swatch/swatch-auth-log.conf avec la racine du propriétaire, autorisation 644 -

watchfor /fail/i
  pipe /usr/local/sbin/sendmail -t [email protected]

Le "/ fail/i" est une expression rationnelle, le "i" indiquant qu'il est insensible à la casse. (Mon sendmail est un script qui envoie tout à une adresse fixe via mailgun , l'adresse n'a donc pas d'importance).

Créez un fichier de service systemd /etc/systemd/system/swatch-auth-log.service avec la racine du propriétaire, autorisation 644 - -

[Unit]
Description=monitor /var/log/auth.log, send fail notices by mail

[Service]
ExecStart=/usr/bin/swatchdog -c /etc/swatch/swatch-auth-log.conf -t /var/log/auth.log

[Install]
#WantedBy=multi-user.target
WantedBy=pre-network.target

Puis activez, démarrez et affichez l’état du service -

Sudo systemctl enable swatch-auth-log.service
Sudo systemctl start swatch-auth-log.service
Sudo systemctl status swatch-auth-log.service

Un exemple de rapport de statut réussi -

● swatch-auth-log.service - monitor /var/log/auth.log, send fail notices by mail
   Loaded: loaded (/etc/systemd/system/swatch-auth-log.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-01-31 21:41:52 PST; 17min ago
 Main PID: 27945 (swatchdog)
    Tasks: 3 (limit: 4915)
   CGroup: /system.slice/swatch-auth-log.service
           ├─27945 /usr/bin/Perl /usr/bin/swatchdog -c /etc/swatch/swatch-auth-log.conf -t /var/log/auth.log
           ├─27947 /usr/bin/Perl /.swatchdog_script.27945
           └─27949 /usr/bin/tail -n 0 -F /var/log/auth.log

Jan 31 21:41:52 ub18 systemd[1]: Started monitor /var/log/auth.log, send fail notices by mail.
Jan 31 21:41:52 ub18 swatchdog[27945]: *** swatchdog version 3.2.4 (pid:27945) started at Thu Jan 31 21:41:52 PST 2019

Le service sera automatiquement lancé au démarrage et surveillé par systemd .


Discussion

A l’origine, j’utilisais une solution pam semblable à celle ci-dessus, mais dans /etc/pam.d/common-auth not sshd . C'était pour attraper ssh, Sudo et les logins. Mais après une mise à jour, tous mes mots de passe ont cessé de fonctionner, même après modification des mots de passe en mode de secours. Finalement, j'ai changé le /etc/pam.d/common-auth à l'original et les mots de passe ont à nouveau fonctionné. Voici une description sur le carte Stack Exchange UNIX & Linux

J'ai décidé qu'il serait plus sûr de ne pas toucher aux paramètres de sécurité difficiles à comprendre. Et tout est dans les fichiers journaux de toute façon.

1
Craig Hicks

Mailgun adaptation de @Fritz answer

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

Si vous êtes sur un VM qui n'a pas SMTP, vous devrez peut-être utiliser quelque chose comme mailgun, sendgrid ou similaire. Cela a fonctionné pour moi sur Google Cloud.

L’un des risques de cette approche est qu’un attaquant pourrait obtenir vos identifiants d’envoi de courrier sortant s’il peut Sudo su et trouver le script ou si vous le laissez lisible. mailgun a une liste blanche d'ip que vous devriez configurer, mais c'est imparfait pour ce cas d'utilisation particulier, évidemment.

Ce script devrait fonctionner avec mailgun après avoir changé mydomain.com dans votre domaine actuel. Vous pouvez enregistrer le script dans /root/login-alert.sh ou dans un emplacement 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 @Fritz answer pour changer /etc/pam.d/sshd afin d’inclure:

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

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

1
Paul

Ce script dans /etc/ssh/sshrc envoie un courrier électronique et ajoute un journal à l'enregistreur système. 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
1
Philippe Gachoud

Je viens de modifier la réponse de @SirCharlo

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 presque certain que vous devez vous assurer que mta est configuré, mais une fois que cela est fait, cela fonctionne. Prochaine étape twilio alerts

0
MrMesees