Freitag, 18. Juni 2010

Bei Login Mail

In der aktuellen Ausgabe des Linux Magazins gibt es in der Rubrik "Aus dem Alltag eines Sysadmins" mal wieder einen sehr interessanten Artikel von Charly Kühnast.

Unter dem Titel "Türspion: Bei Login Mail" beschreibt er dort, wie man seine Systeme so "konfiguriert", dass bei einer sich öffnenden Shell sofort eine Mail an eine festgelegte Mailadresse geschickt wird. Aus der Mail geht dann hervor, wer sich von welchem System aus eingeloggt hat.

Da er so leider nicht dazugeschrieben hat, welche Distribution(en) er einsetzt und ich zeitgleich festgestellt habe, dass dies so unter Produkten von Novell, openSUSE oder auch Debian nicht direkt zu laufen scheint, hier die Kurzanleitung. Immer natürlich abhängig davon, welche Shells den Benutzer zugewiesen sind! Charly spricht im Artikel davon, dass er den im Artikel erwähnten Einzeiler
echo 'Login on' `hostname` `date` `who` | \
mail -s "Login on `hostname` from `who | \
awk '{print $5}'`" user@example.com
in die systemweite "bashrc" einträgt. Unter dem SUSE Linux Enterprise Server, openSUSE und Debian funktioniert dies so allerdings nicht unbedingt. Entweder gibt es beim Einloggen bereits eine Fehlermeldung, die auch einen ungebetenen Gast hellhörig werden lassen würde oder aber die versendete Mail enthält nicht ganz die gewünschten Informationen in der Betreffzeile. Daher gehen wir das hier mal entsprechend für die einzelnen Distributionen durch :-)

Um im SUSE Linux Enterprise Server einen wie im Artikel erwähnten Effekt für den Benutzer root zu erwirken muss die Datei
/etc/bash.bashrc.local
angelegt und mit folgendem Inhalt
WHO_AKTUELL=`who -m | /usr/bin/awk '{print $6}'`
echo 'Login on' `hostname` `date` `who -m` | \
mail -s "Login on `hostname` from $WHO_AKTUELL" \ user@example.com
gefüllt werden. Wird die Variable "WHO_AKTUELL" vorher nicht gesetzt, sondern der entsprechende Befehl mit in die echo-Zeile gepostet, erscheint der Rechnername von dem aus der Login erfolgte nicht in der Betreffzeile der Mail. Dies würde jetzt für alle Logins funktionieren, bei denen der Benutzer die bash als Standard-Shell hat.

Die normalen Benutzer erhalten bei mir zum Beispiel die tcsh als Standard-Shell. Um auch diesen Fall mit abzudecken legen wir erst einmal die Datei
/etc/csh.login.local
an und füllen Sie mit dem folgenden Inhalt
setenv HOSTNAME `hostname`
setenv DATE `date`
setenv WHO `who -m`
setenv WHO_AKTUELL `who -m | /usr/bin/awk '{print $6}'`
echo 'Login on' $HOSTNAME $DATE $WHO | \
mail -s "Login on $HOSTNAME from $WHO_AKTUELL" \ user@example.com
Nachdem dies dann gespeichert ist, bekommen wir auch von diesen Benutzern beim Login eine entsprechende Mail-Benachrichtigung. "user@example.com" steht hier natürlich jeweils für die Mail-Adresse, an die die Information gesendet werden soll.

"Normale" Benutzer berücksichtige auch auch deshalb, weil es ja vielleicht durchaus Systeme gibt (geben könnte), auf denen zum Beispiel ein Login des Benutzers "root" komplett untersagt ist um vielleicht besser nachzuvollziehen, welcher Benutzer via "su" zum Administrator geworden ist.

Kommen wir nun zu den openSUSE-Produkten. Hier ist es eigentlich ähnlich, lediglich der awk-Befehl unterscheidet sich im zweiten Fall ein wenig. Für bash als die Standard-Shell muss die Datei
/etc/bash.bashrc.local
angelegt und mit dem Inhalt
WHO_AKTUELL=`who -m | /usr/bin/awk '{print $6}'`
echo 'Login on' `hostname` `date` `who -m` | \
mail -s "Login on `hostname` from $WHO_AKTUELL" \ user@example.com
gefüllt werden. Ist also nichts anderes als oben auch. Für die tcsh als Standard-Shell muss auch hier erst einmal die Datei
/etc/csh.login.local
angelegt werden. Hier kommt als Füllung folgendes zum Einsatz
setenv HOSTNAME `hostname`
setenv DATE `date`
setenv WHO `who -m`
setenv WHO_AKTUELL `who -m | /usr/bin/awk '{print $5}'`
echo 'Login on' $HOSTNAME $DATE $WHO | \
mail -s "Login on $HOSTNAME from $WHO_AKTUELL" \ user@example.com
Der/Die aufmerksame Leser/in wird hier das "/usr/bin/awk '{print $5}'" bemerkt haben. Dies sorgt bei openSUSE mit der tcsh als Shell für die Ausgabe des Rechnernamens, von dem aus der Login erfolgte. Würden wir hier $6 verwenden, wäre die Ausgabe leer.

Was Debian als Distribution angeht: Für Benutzer mit der bash als Standard-Shell funktioniert es wie im Artikel selbst beschrieben. Für meine Benutzer, die die tcsh als Standard-Shell benutzen musste ich die Datei
/etc/csh/login.d/csh.login.local
anlegen und mit folgendem Inhalt füllen:
setenv HOSTNAME `hostname`
setenv DATE `date`
setenv WHO `who -m`
setenv WHO_AKTUELL `who -m | awk '{print $5}'`
echo 'Login on' $HOSTNAME $DATE $WHO | \
mail -s "Login on $HOSTNAME from $WHO_AKTUELL" \ user@example.com
Naja, und wenn ich schon einmal dabei bin, kann ich mich ja auch noch "kurz" Sun Solaris annehmen :-) Hier habe ich für die bash als Standard-Shell einfach mal kurz die Zeile
echo 'Login on' `hostname` `date` `who` | \
mailx -s "Login on `hostname` from `who | \
awk '{print $6}'`" user@example.com
an die Datei
/etc/profile
angehängt. Wichtig ist hier anstatt dem Befehl "mail" den Befehl "mailx" zu verwenden, da die Betreffzeile ansonsten leer bleibt. Für Benutzer mit der tcsh als Standard-Shell wird eine Datei
/etc/.csh
angelegt und mit dem Inhalt
setenv HOSTNAME `hostname`
setenv DATE `date`
setenv WHO `who -m`
setenv WHO_AKTUELL `who -m | awk '{print $6}'`
echo 'Login on' $HOSTNAME $DATE $WHO | \
mailx -s "Login on $HOSTNAME from $WHO_AKTUELL" \ user@example.com
gefüllt. Et voilà: It works ;-) Auch hier natürlich wieder mit "mailx" anstelle von "mail".

Ein kleines "Problem" tritt aber dennoch auf. Nutzt man zum Beispiel Skripte oder ähnliches, die per SSH mit SSH-Keys Befehle auf Zielrechnern ausgeführen, ist die Zeitspanne wohl so gering, dass es nicht reicht um zu schauen, von welchem Rechner der Login kommt. Also ein einfaches "ssh who Rechnername" führt dazu, dass man zwar eine Meldung bekommt, dass dort was war, aber es geht aus der Mail nicht hervor, wer oder was es war. Hierfür habe ich auf die Schnelle so auch keine Lösung parat. Wird aber weiter untersucht.

1 Kommentar:

Chris hat gesagt…

Interessanter Artikel ...

Was funktionieren könnte, wäre die Auswertung und die Mail nicht direkt in der aktuellen Shell des vermeintlichen Users zu starten, sondern das ganze in einem Screen auszuführen. So würde die Auswertung beim Beenden der Sitzung trotzdem weiterlaufen und nicht durch den Disconnect gekillt werden.