raspi schrieb:
> Kannst du das näher erläutern wie genau du das machst?
Ich bin grad nicht zuhause, darum kann ich gerade nicht nachsehen.
Das Senden der Mails mach ich mit einem Eintrag ganz am Ende der Datei
/etc/pam.d/common-session:
1 | session optional pam_exec.so seteuid /pfad/zu/script
|
Das script wird dann bei session_open (anmelden), session_close
(abmelden) etc. aufgerufen. Dort kann man dann was in die Richtung
schreiben (ungetestet):
1 | if [ "$PAM_TYPE" != session_open ] || [ "$PAM_SERVICE" != sshd ]
|
2 | then exit 0
|
3 | fi
|
4 |
|
5 | sendmail ...
|
Die fehlgeschlagenen Loginversuche zu loggen ist etwas trickier. Hier
darf man keine fehler machen. Das mache ich in der
/etc/pam.d/common-auth. Dort gibt es die Zeilen:
1 | auth [success=1 default=ignore] pam_unix.so nullok_secure
|
2 | auth requisite pam_deny.so
|
3 | auth required pam_permit.so
|
Die anpassen nach:
1 | auth [success=2 default=ignore] pam_unix.so nullok_secure
|
2 | auth optional pam_exec.so expose_authtok /pfad/zu/script argumente
|
3 | auth requisite pam_deny.so
|
4 | auth required pam_permit.so
|
Aber aufpassen, bei success=N gibt N an, wie viele Einträge bei einem
erfolgreichen login übersprungen werden. Das muss auf pam_permit.so
springen, sonst sperrst du dich eventuell aus. Und auf keinen fall die
pam_deny.so entfernen, sonst ist jeder login versuch erfolgreich!!!
Meine logging Anwendung und ein SSH patch kann man hier finden:
https://github.com/Daniel-Abrecht/honeypot
Der SSH patch braucht man, damit das Skript das eingegebene Passwort
bekommt. Normalerweise ersetzt SSH bei ungültigen oder deaktivierten
Usern vor dem Login das Passwort mit einem placeholdertext, damit der
Login auch garantiert fehlschlägt, aber das Timeing gleich bleibt. Mein
patch fügt statdessen einfach ein 0x01 byte vor dem Passwort ein.
Die Webseite hab ich aber noch nicht hochgeladen. Eigentlich ist alles
nur HTML und JS und kann man einfach so von meinem Server downloaden.
Es gibt aber noch ein posix/cgi shell script, das die Daten der Seite
übergibt mittels server-sent events. Im grunde ist es nur ein "echo
headers" und ein 'tail -f -n 100 logfile | while IFS= read -r line; do
echo "data: $line"; echo; done' oder so ähnlich.