E-Mail Benachrichtigung bei SSH Login

3df

Registered User
Hallo zusammen,

ich habe ein Skript auf dem Server erstellt, damit ich per E-Mail benachrichtigt werde, wenn ein SSH Login stattgefunden hat. Dies funktioniert auch ohne Probleme.

Datei "/opt/shell-login.sh" mit dem Inhalt:

Code:
#!/bin/bash
  
echo "Login auf $(hostname) am $(date +%Y-%m-%d) um $(date +%H:%M)"
echo "Benutzer: $USER"
In die Datei "/etc/profile" folgenden Inhalt eingefügt:

Code:
/opt/shell-login.sh | mailx -s "SSH Login auf Server" name@domain.de
Wie gesagt, es klappt ohne Probleme. Wenn ich mich per SSH einlogge, dann bekomme ich eine E-Mail mit folgenden Inhalt:

Code:
Login auf XX.XXX.XX.XX am 2015-03-12 um 23:30
Benutzer: root
Jetzt habe ich aber das Problem, dass ich jeden morgen von 06:26 bis 06:27 insgesamt 36 E-Mails mit dem gleichen Inhalt bekomme:

Code:
Login auf XX.XXX.XX.XX am 2015-03-12 um 06:26
Benutzer: popuser
Kann mir jemand sagen was das zu bedeuten hat?

Danke
 

GwenDragon

Registered User
Wenn du noch $SSH_CONNECTION mit aufnimmst, bekommst du raus, von wo sich eingeloggt wird.

popuser ist wohl ein lokaler Prozess.
wenn du mit grep popuser /var/log/auth.log suchst, siehst du sowas wie:
Code:
Mar 11 06:26:34 s123324 su[30754]: pam_unix(su:session): session opened for user popuser by (uid=0)
Mar 11 06:26:35 s123324 su[30754]: pam_unix(su:session): session closed for user popuser
Mar 11 06:26:35 s123324 su[30762]: Successful su for popuser by root
Mar 11 06:26:35 s123324 su[30762]: + ??? root:popuser
Da räumt halt morgens irgendein Job von Plesk den Mailserver auf.
 

elias5000

Site Reliability Engineer
Wenn du das ganze noch in eine einzelne Datei packst und unter /etc/profile.d ablegst ohne dafür /etc/profile erweitern zu müssen, dann ist es sogar noch schön.
 

3df

Registered User
Wenn du noch $SSH_CONNECTION mit aufnimmst, bekommst du raus, von wo sich eingeloggt wird.

popuser ist wohl ein lokaler Prozess.
wenn du mit grep popuser /var/log/auth.log suchst, siehst du sowas wie:
Code:
Mar 11 06:26:34 s123324 su[30754]: pam_unix(su:session): session opened for user popuser by (uid=0)
Mar 11 06:26:35 s123324 su[30754]: pam_unix(su:session): session closed for user popuser
Mar 11 06:26:35 s123324 su[30762]: Successful su for popuser by root
Mar 11 06:26:35 s123324 su[30762]: + ??? root:popuser
Da räumt halt morgens irgendein Job von Plesk den Mailserver auf.
"$SSH_CONNECTION" habe ich jetzt mal mit aufgenommen. Wenn ich mich selbst vom Lokalen Rechner aus auf SSH einlogge, dann steht in der mail noch folgendes:

Code:
Externe IP von mir + 55266 + IP vom Server + Port vom Server
Sollte also soweit erst mal ok sein, oder?

Bei der eingabe von "grep popuser /var/log/auth.log" bekomme ich auch diese ausgabe:

Code:
Mar 10 06:25:36 server su[2769]: pam_unix(su:session): session opened for user popuser by (uid=0)
Mar 10 06:25:37 server su[2769]: pam_unix(su:session): session closed for user popuser
Mar 10 06:25:37 server su[2792]: Successful su for popuser by root
Mar 10 06:25:37 server su[2792]: + ??? root:popuser
Was kann ich da jetzt machen? weil es nervt schon sehr das ich jeden morgen 36 E-Mails bekomme.

------------------

Wenn du das ganze noch in eine einzelne Datei packst und unter /etc/profile.d ablegst ohne dafür /etc/profile erweitern zu müssen, dann ist es sogar noch schön.
Meinst Du

Code:
#!/bin/bash
  
echo "Login auf $(hostname) am $(date +%Y-%m-%d) um $(date +%H:%M)"
echo "Benutzer: $USER"
und

Code:
mailx -s "SSH Login auf Server" name@domain.de
In eine Datei und dann als "shell-login.sh" unter "/etc/profile.d" abspeichern?

Danke euch
 

rolapp

Fan vom SSF
Ich habe da bei mir folgendermaßen gelöst.
Im Verzeichnis /etc/ssh/ die datei sshrc erstellt.

Code:
#!/bin/bash
#sshrc
ip=$(echo $SSH_CONNECTION | awk '{ print $1 }')
host=$(host $ip | awk '{ print $5 }')
echo -e "USER: $USER\nSSH_CONNECTION: $SSH_CONNECTION\nIP: $ip\nHostname: $host" | mail -s "SSH Login" email@domain.de
Die Email sieht dann so aus
Code:
Betreff: SSH Login

USER: 'Benutzername'
SSH_CONNECTION: 'Client-ip' 'outgoing client port 'Server-ip' Serverport'
IP: 'Client-ip'
Hostname: 'Client-Hostname'
 

MadMakz

Member
So hab ichs mal gelöst

Code:
#!/bin/bash
#
if [[ -z "$USER" ]]
then
        exit 0
fi

HN=$(hostname -f)
TIME=$(date "+%d.%m.%Y %H:%M")

TEXT="Date: $TIME
Server: $HN
User: $USER
IP: $SSH_CLIENT"

echo -e "Subject: Login: $USER auf $HN\n\n$TEXT" | sendmail mail@example.com

unset HN TIME TEXT
in /etc/profile.d/whatever.sh
chmod +x /etc/profile.d/whatever.sh

if [[ -z "$USER" ]] weil z.B. cronjobs es ebenfalls triggern könnten, in denen st aber normalerweise USER leer und nur LOGUSER gesetzt, somit bekommt man keinen "cron-login spam".
$SSH_CLIENT ist ein kürzere Fassung von $SSH_CONNECTION die die Server IP weg lässt.

Edit: Beachten, das kann man via --noprofile (profile, profile.d) --norc (bashrc) und sftp außer Kraft setzen, weshalb die Lösung das in /etc/ssh/sshrc zu Packen besser wäre, wie es mein Vorredner getan hat.
 
Last edited by a moderator:

3df

Registered User
Hat geklappt. im E-Mail Client steht bei An: "Undisclosed recipients: ;" ist das normal oder kann man das irgendwie ändern?
 

MadMakz

Member
"Undisclosed recipients" ist ein platzhalter deines emailprograms weil du in dem Script keinen zielnamen/adresse schickst. Das gleiche würde passieren wenn du emails nur via Blincopie (bcc) schickst bzw. eine BCC-Only E-Mail erhältst.

In meinem Beispiel müsstets du also im Script

Code:
sendmail mail@example.com
erweitern mit
Code:
-f address -F "name"
ggf. reicht auch nur -F "name".

Kommt auf den Empfänger an und wie er die Felder handelt.

Edit: OP falsch vertanden; Es geht um "To:" nicht "From:"
 
Last edited by a moderator:

3df

Registered User
Ich dussel :D. Danke

Ich habe jetzt deinen Inhalt, in die Datei "sshrc" unter "/etc/ssh/" gepackt, und der Mail Inhalt sieht so aus:

Code:
-e Subject: Login: root auf server.domain.de

Date: 13.03.2015 16:25
Server: server.domain.de
User: root
IP: "client-ip" "client-port" "server port"
Ist es normal das oben noch "-e Subject:" in der Mail steht?
 

Attachments

Last edited by a moderator:

3df

Registered User
Mit dem Name scheint noch nicht ganz geklappt zu haben, es steht jetzt zwar bei Von: "Server" da, aber bei An: steht immer noch "Undisclosed recipients: ;" siehe Bild. Die E-Mail wird auch jetzt ohne Betreff gesendet, vorher war ein Betreff vorhanden.

sshrc:

Code:
#!/bin/bash
#
if [[ -z "$USER" ]]
then
        exit 0
fi

HN=$(hostname -f)
TIME=$(date "+%d.%m.%Y %H:%M")

TEXT="Date: $TIME
Server: $HN
User: $USER
IP: $SSH_CLIENT"

echo -e "Subject: Login: $USER auf $HN\n\n$TEXT" | sendmail -F "Server" mail@domain.de

unset HN TIME TEXT
 

Attachments

MadMakz

Member
Hm, warum -e "Subject: Login: auftaucht kann ich mir gerade nicht erklären.

Was das "An" angeht kannst du mal
Code:
#!/bin/bash
#
if [[ -z "$USER" ]]
then
        exit 0
fi

DEST_MAIL="mail@domain.de"

HN=$(hostname -f)
TIME=$(date "+%d.%m.%Y %H:%M")

TEXT="Date: $TIME
Server: $HN
User: $USER
IP: $SSH_CLIENT"

echo -e "To:$DEST_MAIL\nSubject:Login: $USER auf $HN\n\n$TEXT" | sendmail -F "Server" $DEST_MAIL

unset DEST_MAIL HN TIME TEXT
Probieren

Edit: Das Leerzeichen nach Subject: weg.
 
Last edited by a moderator:

3df

Registered User
Das klappt leider auch nicht. Dafür sieht der E-Mail Inhalt aber jetzt etwas anders aus:

Code:
-e To:meinemail@domain.de
Subject: Login: root auf server.domain.de

Date: 13.03.2015 16:47
Server: server.domain.de
User: root
IP: "client-ip" "client-port" "server-port"
 

MadMakz

Member
Kann ich nicht reproduzieren. Aber allein das das -e mit drinn steht zeigt das schon an dem Kommando echo an sich irgend etwas anders ist bzw. die komplette Zeile falsch interpretiert wird.
 

3df

Registered User
Mit dem Inhalt von rolapp funktioniert alles mit "An:" "Von:" und "Betreff" nur das dort auch wieder "-e USER: root" steht
 

MadMakz

Member
Das -e einfach mal weg lassen. Vielleicht folgt deine Distro nicht dem Standard von "echo". Kann ich mir aber kaum Vorstellen.
 
Top