Wie richte ich eine E-Mail-Benachrichtigung ein, wenn eine SSH-Anmeldung erfolgreich war?

56

Hat jemand ein Bash-Skript, das jemanden per E-Mail benachrichtigt, wenn er sich erfolgreich bei einem SSH-Server angemeldet hat? Ich möchte benachrichtigt werden, wenn sich jemand in meiner persönlichen Box anmeldet.

Ich benutze Ubuntu 12.04 mit xfce

Rick T
quelle

Antworten:

46

Warnung: Laut den Kommentaren funktioniert dies nicht, wenn der Benutzer eine Datei mit dem Namen erstellt ~/.ssh/rc. *

Ändern oder erstellen Sie /etc/ssh/sshrcmit den folgenden Inhalten:

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 &

Dies benachrichtigt Sie effektiv per E-Mail, wenn sich jemand über SSH anmeldet, und die Anmeldung wird im Syslog protokolliert.

Hinweis: Sie benötigen das sendemailPaket ( sudo apt-get install sendemail), damit die E-Mail-Benachrichtigung funktioniert.

Hinweis: Funktioniert mit der Portweiterleitung, nicht jedoch mit der Option -N.

SirCharlo
quelle
Funktioniert dies auch, wenn der Client kein TTY anfordert? ZB ssh -Nnur mit Portweiterleitung.
Gertvdijk
Funktioniert dies auch, wenn wir Google Mail als SMTP-Server verwenden?
user155073
Dies erfordert eine Warnung : Dies funktioniert nicht, wenn der Benutzer eine Datei mit dem Namen erstellt, ~/.ssh/rcsodass sie aus Sicherheitsgründen völlig unbrauchbar ist. Die Antwort von @adosaiguas bezüglich pam_execist die richtige.
Fritz
2
@mchid: Wenn Sie die Frage "Ich möchte benachrichtigt werden, wenn sich jemand in meiner persönlichen Box anmeldet." , dann könnte dies akzeptabel sein. Wenn Sie nur ein Benutzerkonto haben. Andernfalls müssen Sie dies für alle Konten tun , einschließlich jedes neu hinzugefügten Kontos. Und im Idealfall müssen Sie sicherstellen, dass Benutzer ihre ~/.ssh/rcDatei nicht ändern oder löschen können . Die Verwendung einer systemweiten Methode, die auf basiert, pamist nur zuverlässiger und sicherer, da sie nur rootmit ihr zu tun haben kann. Die Antwort lautet also: Die sshrdMethode funktioniert in Ordnung für Einzelplatzsysteme, aber pamzuverlässig für alle Systeme.
Fritz
70

Warnung: Wie immer, wenn Sie die Anmeldekonfiguration ändern, lassen Sie eine Backup-SSH-Sitzung im Hintergrund geöffnet und testen Sie die Anmeldung von einem neuen Terminal aus.

Da die sshrcMethode nicht funktioniert, wenn der Benutzer eine eigene ~/.ssh/rcDatei hat, erkläre ich, wie dies mit pam_exec@adosaiguas vorgeschlagen wird. Das Gute daran ist, dass dies auch leicht an andere sshAnmeldetypen als (wie lokale Anmeldungen oder sogar alle Anmeldungen) angepasst werden kann, indem Sie sich in eine andere Datei einhängen /etc/pam.d/.

Zunächst müssen Sie in der Lage sein, E-Mails über die Befehlszeile zu senden. Es gibt noch andere Fragen dazu. Auf einem Mailserver ist es wahrscheinlich am einfachsten zu installieren mailx(was wahrscheinlich sowieso schon installiert ist).

Dann benötigen Sie eine ausführbare Skriptdatei login-notify.sh( /etc/ssh/zum Beispiel) mit folgendem Inhalt. Sie können die Variablen ändern, um den Betreff und den Inhalt der E-Mail-Benachrichtigung zu ändern. Vergiss nicht, es auszuführen chmod +x login-notify.sh, um es ausführbar zu machen.

#!/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

Sobald Sie das haben, können Sie die folgende Zeile hinzufügen /etc/pam.d/sshd:

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

Zu Testzwecken ist das Modul als enthalten optional, sodass Sie sich auch dann anmelden können, wenn die Ausführung fehlschlägt. Nachdem Sie sich vergewissert , dass es funktioniert, können Sie ändern optionalzu required. Dann ist die Anmeldung erst möglich, wenn die Ausführung Ihres Hook-Skripts erfolgreich war (wenn Sie dies wünschen).

Für diejenigen unter Ihnen, die eine Erklärung darüber benötigen, was PAM ist und wie es funktioniert, ist hier eine sehr gute .

Fritz
quelle
1
Es heißt: /etc/ssh/login-notify.sh failed: exit code 13direkt nach dem Login :(
FelikZ
3
Danke, es funktioniert super. So stellen Sie sicher , Sie haben UsePAMauf yesIhrer sshd_config.
Nicolas BADIA
2
Nur eine Notiz für mich oder andere Leute, die neu bei Selinux sind. Ich habe einen Berechtigungsfehler erhalten, als pam_exec das Skript ausführte. Später fand ich heraus, dass es für Selinux falsch beschriftet war. Ich habe das Skript nach / bin / geklont, das automatisch als gekennzeichnet wird unconfined_u:object_r:bin_t:s0. Dann habe ich chmod +x /bin/login-notify.shund es funktioniert.
RedGiant
3
/etc/pam.d/login <- für tty logins
Fernando André
2
@ 4wk_ Danke für den Hinweis. Ich habe es durch einen Link zum Internetarchiv ersetzt, sodass es jetzt wieder funktionieren sollte.
Fritz
9

Wir haben Monit verwendet , um Prozesse auf unseren Linux-Boxen zu überwachen. Über ssh kann monit auch per E- Mail auf erfolgreiche Logins hinweisen. Unsere Monit- Konfiguration sieht so aus

 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

Hinweis: Die Mailserver-Konfiguration, das E-Mail-Format usw. sollten in der monitrcDatei festgelegt werden

Update: Schrieb einen detaillierteren Blog-Beitrag dazu

Lackmus
quelle
7

Geben Sie Folgendes ein /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" you@your.domain 
fi

Wie das Skript funktioniert

/etc/profilewird bei jedem Login ausgeführt (für bash shell Benutzer). Die if-Anweisung gibt nur dann true zurück, wenn sich der Benutzer über ssh angemeldet hat, wodurch der eingerückte Codeblock ausgeführt wird.

Als nächstes erstellen wir den Text der Nachricht:

  • $(date)wird durch die Ausgabe des dateBefehls ersetzt
  • ${USER} wird durch den Anmeldenamen des Benutzers ersetzt
  • $(hostname -f) wird durch den vollständigen Hostnamen des Systems ersetzt, bei dem Sie angemeldet sind

In der zweiten TEXTZeile wird die IP-Adresse des Systems angegeben, von dem aus sich dieser Benutzer anmeldet. Schließlich wird der generierte Text in einer E-Mail an Ihre Adresse gesendet.

Zusammenfassung Linux zeichnet standardmäßig alle Systemanmeldungen, ob per ssh oder nicht, in den Systemprotokolldateien auf. Manchmal kann jedoch - insbesondere bei einem System, auf das selten per ssh zugegriffen wird - eine schnelle und fehlerhafte Benachrichtigung hilfreich sein.

user476225
quelle
2

Bei dieser anderen Frage haben Sie wahrscheinlich das, wonach Sie suchen. Grundsätzlich können Sie dem Mail-Befehl im Skript einen Aufruf hinzufügen , der ausgeführt wird, wenn sich ein Benutzer über ssh: /etc/pam.d/sshd anmeldet

adosaiguas
quelle
2

Ich habe einige der hervorragenden Antworten aus diesem Thread genommen und etwas gemacht, das mehr oder weniger kopier- und klebbar ist. Es verwendet Mailgun, um die E-Mails zu senden, damit Sie keine Probleme mit der Einrichtung von STMP haben. Sie benötigen lediglich einen Mailgun-API-Schlüssel und eine sendende Domain.

Bei der SSH-Anmeldung sendet das Skript Details zur Anmeldung (Benutzer, Hostname, IP-Adresse und alle aktuellen Umgebungsvariablen) an eine E-Mail-Adresse. Es ist einfach, andere Parameter hinzuzufügen, die Sie senden möchten, indem Sie die messageVariable anpassen .

#!/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
pacharanero
quelle
Dies ist meiner Meinung nach die beste Antwort. Es ist einfach und erfordert nicht das Senden einer E-Mail vom Computer aus, die ohne entsprechende Konfiguration im Spam-Ordner landet.
JayD3e
2

Mailgun-Anpassung von @Fritz beantwortet

Nach dem Posten bemerkte ich, dass @pacharanero auch über Mailgun schreibt, aber ich verstehe nicht, was sie mit dig machen, also werde ich auch meine Lösung posten.

Wenn Sie sich auf einer VM ohne SMTP befinden, müssen Sie möglicherweise Mailgun, Sendgrid oder ähnliches verwenden. Das hat bei mir in Google Cloud funktioniert.

Ein Risiko dieses Ansatzes besteht darin, dass ein Angreifer Ihre ausgehenden E-Mail-Anmeldeinformationen erhalten kann, wenn er sudo sudas Skript findet, oder Sie lassen das Skript zum Senden von E-Mails lesbar. mailgun hat eine IP-Whitelist, die Sie einrichten sollten, aber das ist natürlich für diesen speziellen Anwendungsfall unvollkommen.

Dieses Skript sollte mit Mailgun funktionieren, nachdem Sie mydomain.comzu Ihrer eigentlichen Domain gewechselt haben . Sie können das Skript an /root/login-alert.sheinem anderen Ort speichern .

#!/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

Danach kannst du @Fritz answer folgen, um Folgendes zu ändern /etc/pam.d/sshd:

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

Ich stelle fest, dass dies ohne Leseberechtigungen für ankommende Benutzer ( chmod 700 /root/login-alert.sh) funktioniert, sodass ankommende Benutzer keinen Lesezugriff auf das Skript benötigen.

Paul
quelle
1

Dieses Skript /etc/ssh/sshrcsendet eine E-Mail und fügt dem Systemlogger ein Protokoll hinzu. Es wird ein Unterschied zwischen Ihrem persönlichen Subnetz und dem World Wide Web (erforderlich sudo apt-get install mailutils) gemacht (Sie können es also deaktivieren, wenn Sie möchten ).

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
Philippe Gachoud
quelle
1

Ich verwende Swatchdog aus dem Swatch- Paket, um in /var/log/auth.log nach Zeilen zu suchen , die den Ausdruck " fail " (ohne Berücksichtigung der Groß- und Kleinschreibung) enthalten . Ich habe es so eingerichtet, dass es als einfacher systemd-Dienst ausgeführt wird.

apt install swatch

Erstelle eine Konfigurationsdatei /etc/swatch/swatch-auth-log.conf mit dem Besitzer root, Erlaubnis 644 -

watchfor /fail/i
  pipe /usr/local/sbin/sendmail -t auth.log@xxx.com

Das "/ fail / i" ist ein regulärer Ausdruck, wobei das "i" angibt, dass zwischen Groß- und Kleinschreibung unterschieden wird. (Mein sendmail ist ein Skript, das alles per Mailgun an eine feste Adresse sendet , daher spielt die Adresse keine Rolle).

Erstellen Sie eine systemd- Servicedatei /etc/systemd/system/swatch-auth-log.service mit dem Besitzer root und der Berechtigung 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

Aktivieren, starten und zeigen Sie dann den Status des Dienstes an.

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

Ein Beispiel für einen erfolgreichen Statusbericht -

 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

Der Dienst wird beim Booten automatisch gestartet und von systemd überwacht .


Diskussion

Ursprünglich habe ich eine Pam- Lösung ähnlich der oben genannten verwendet, aber in /etc/pam.d/common-auth nicht sshd . Das war ssh, sudo und logins zu fangen. Aber nach einem Update funktionierten alle meine Passwörter nicht mehr, selbst nachdem ich die Passwörter im Rettungsmodus geändert hatte. Irgendwann habe ich /etc/pam.d/common-auth wieder auf das Original zurückgesetzt und die Passwörter haben wieder funktioniert. Hier finden Sie eine Beschreibung der Stack Exchange UNIX- und Linux-Karte

Ich entschied, dass es sicherer wäre, schwer zu verstehende Sicherheitseinstellungen nicht anzufassen. Und alles ist sowieso in den Protokolldateien.

Craig Hicks
quelle
0

Ich habe gerade die @ SirCharlo-Antwort geändert

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]>" &

Dies funktioniert auf den Servern 14.04, 16.04 und Centos 6.5.x, die ich eingerichtet habe. Ich bin mir ziemlich sicher, dass Sie sicherstellen müssen, dass mta konfiguriert ist. Nächster Schritt twilio alerts

MrMesees
quelle