Antworten:
Warnung: Laut den Kommentaren funktioniert dies nicht, wenn der Benutzer eine Datei mit dem Namen erstellt
~/.ssh/rc
. *
Ändern oder erstellen Sie /etc/ssh/sshrc
mit 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 <from@address.com>" -t "Your Name <your.email@domain.com>" -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 sendemail
Paket ( sudo apt-get install sendemail
), damit die E-Mail-Benachrichtigung funktioniert.
Hinweis: Funktioniert mit der Portweiterleitung, nicht jedoch mit der Option -N.
~/.ssh/rc
sodass sie aus Sicherheitsgründen völlig unbrauchbar ist. Die Antwort von @adosaiguas bezüglich pam_exec
ist die richtige.
~/.ssh/rc
Datei nicht ändern oder löschen können . Die Verwendung einer systemweiten Methode, die auf basiert, pam
ist nur zuverlässiger und sicherer, da sie nur root
mit ihr zu tun haben kann. Die Antwort lautet also: Die sshrd
Methode funktioniert in Ordnung für Einzelplatzsysteme, aber pam
zuverlässig für alle Systeme.
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 sshrc
Methode nicht funktioniert, wenn der Benutzer eine eigene ~/.ssh/rc
Datei hat, erkläre ich, wie dies mit pam_exec
@adosaiguas vorgeschlagen wird. Das Gute daran ist, dass dies auch leicht an andere ssh
Anmeldetypen 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="sender-address@example.com"
recepient="notify-address@example.org"
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 optional
zu 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 .
/etc/ssh/login-notify.sh failed: exit code 13
direkt nach dem Login :(
UsePAM
auf yes
Ihrer sshd_config.
unconfined_u:object_r:bin_t:s0
. Dann habe ich chmod +x /bin/login-notify.sh
und es funktioniert.
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 monitrc
Datei festgelegt werden
Update: Schrieb einen detaillierteren Blog-Beitrag dazu
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
/etc/profile
wird 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 date
Befehls 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 TEXT
Zeile 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.
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
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 message
Variable 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
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 su
das 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.com
zu Ihrer eigentlichen Domain gewechselt haben . Sie können das Skript an /root/login-alert.sh
einem anderen Ort speichern .
#!/bin/bash
if [ "$PAM_TYPE" != "close_session" ]; then
APK='api:your-mailgun-api-key-goes-here'
FROM='Login Alert <mailgun@mg.mydomain.com>'
TO='me@mydomain.com'
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.
Dieses Skript /etc/ssh/sshrc
sendet 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
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.
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 <who-to@youremail.com>" &
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
ssh -N
nur mit Portweiterleitung.