Eigentlich wäre pam_script dazu gedacht nach erfolgreicher Anmeldung ein Script auszuführen welches irgendwelche Änderungen oder Anpassungen vornimmt. Zumindest lese ich das so aus der Man-Page… 🙂
Nachdem Nginx in Sachen Authentifizierung dem Apache doch an einigen Stellen hinterher hinkt, habe ich mich nach einer Lösung umgesehen um für eine Web-Applikation ein einfaches Anmeldesystem zu bauen welches in weiterer Folge dann auch die Möglichkeit bieten soll dass der User das Kennwort selbst verwaltet. Die Kennwörter sollen in einer MySQL Datenbank gespeichert werden bzw. nur deren Hashes.
Nach längerer erfolgloser Suche habe ich mir folgende Lösung selbst zusammen gezimmert, zuerst wird in der nginx-Config des betroffenen Webhost folgendes eingefügt:
location ^~ /test/ {
auth_pam „Please specify login and password“;
auth_pam_service_name „nginx-test“;
auth_pam_set_pam_env on;
}
Der „auth_pam_service_name“ muss mit dem Namen der Datei in /etc/pam.d/ überein stimmen – also nginx-test, dieses sieht wie folgt aus:
auth required pam_script.so expose_authtok dir=/usr/share/libpam-script/pam-script.d/test/
account required pam_permit.so
Im entsprechenden Verzeichnis „/usr/share/libpam-script/pam-script.d/test/
“ findet sich dann das eigentliche Script welches sich um die Authentifizierung kümmert – pam_script_auth und dieses sieht wie folgt aus:
#!/bin/bash
SID=$(echo $PAM_SERVICE|awk -F ’nginx-‚ ‚{print $2}‘)
PASSWORD=$(cat)
MD5USER=$(echo „$PAM_USER“|md5sum|awk ‚{print $1}‘)
MD5PASS=$(echo „$PAM_AUTHTOK“|md5sum|awk ‚{print $1}‘)
AUTHOK=$(mysql -s -u root -pmysqlkennwort testdb01 -e „SELECT count(*) FROM test_users WHERE sid=\“$SID\“ AND md5uname=\“$MD5USER\“ AND md5p
asswd=\“$MD5PASS\““)
if [ „X$AUTHOK“ == „X1“ ]; then
exit 0
else
exit 1
fi
Vom Aufbau recht einfach gehalten, „SID“ ist quasi die Service ID – und diese hole ich mir vom „nginx-test“ indem ich „nginx-“ einfach wegschneide (dient der Erkennung von welchem Webhost die Anmeldung kam – es wird für jeden Webhost eine eigene verwendet!). User und Kennwort verarbeite ich als MD5SUM (man könnte hier auch sha256sum oder sha512sum verwenden), dadurch vermeide ich Probleme die es beim Select geben könnte!
Der Select wird dann auf eine Tabelle los gelassen deren Inhalt im einfachsten Fall einfach nur aus drei Feldern besteht – der „SID“, dem Benutzer-Namen als MD5 Hash und dem Kennwort als MD5 Hash. In den entsprechenden Feldern „sid“, „md5uname“ und „md5passwd“.
Wird ein User gefunden und somit 1 zurück gegeben, dann beendet sich das Script mit dem Rückgabewert „0“ welches ein Login zu lässt. In allen anderen Fällen gibt es ein „1“ zurück und somit ist der Login fehlgeschlagen.
Die Lösung habe ich in gut 30 Minuten zusammengezimmert und sie funktioniert soweit mal, mich würde jetzt interessieren ob ihr hier irgendwelche Sicherheitsbedenken habt!?
Man macht es nicht jeden Tag, darum schadet es nicht sich's kurz zu notieren... Hier…
Meine Suche bei Google hatte mal wieder keinen vernünftigen Treffer gelandet, das Problem - ich…
Ich muss mal eben etwas Druck ablassen, ein Kunde von mir setzt einen Drucker von…
Wer beim Server bestellen vergessen hat die erweiterte IRMC Lizenz zu ordern, der steht vor…
Ich nutze seit langer Zeit ein System für meine Backups welches in der Nacht von…
Es scheint wohl eine noch nicht so häufig genutzte Kombination zu sein - Apache Guacamole…