Mailinglisten-Archive |
Hallo, ich habe eine kurze Frage und einen länglichen eigenen Lösungsvorschlag. Frage: Wie realisiert man ein Single Sign On auf mehreren Web-Servern? Ziel: Es gibt mehrere Web-Server B1 ... Bn, auf denen jeweils LAMP installiert ist. Ein zusätzlicher Server (Name A) soll die Authentifizierung von Usern übernehmen. Auf A läuft zz. ein IIS (also _kein_ LAMP) mit PHP - aber möglicherweise kommt hier auch eine andere Server-Sprache zum Einsatz. Ruft ein User eine Seite auf einem der anderen Server (nennen wir ihn mal B) auf, dann soll zuerst eine Authentifizierung über A stattfinden und anschließend die Seiten von B gezeigt werden. Ausserdem soll B bestimmte Infos von A erhalten (z.B. Name des users, eindeutige Id, Berechtigungen). Wir wollen noch annehmen, dass man auf A die Server Bi eintragen kann, die den Authentifizierungsdienst nutzen dürfen. Problem: Wie macht man so was sicher? Sprich: Wie verhindert man, dass ein Hacker-User den Mechanismus nutzt, um B vorzugaukeln, die Authentifizierung über A hätte geklappt? Wie verhindert man ausserdem, dass die Zusatzinfos (z.B. die Berechtigungen) gefälscht werden können? Die Datenbank auf A, in der die User, Ihre Berechtigungen etc. gespeichert sind, ist von B aus nicht direkt ansprechbar. Damit soll das Entdeckungsrisiko des Passworts für die zentrale User-DB minimiert werden. Lösungsvorschlag: User ruft PHP-Seite S auf B auf. S stellt fest, dass keine Authentifizierung stattfand und leitet um auf eine Anmeldeseite auf A (SSL-verschlüsselt). Dort gibt User Benutzername und Kennwort an. A prüft, ob Benutzername und Kennwort gültig. Wenn nein: Fehlerseite. Wenn ja: A generiert eine zufällige Zeichenkette Z. A schreibt die von B benötigten Daten in eine Datei mit dem Namen Z in einem speziellen Verzeichnis auf A. A verschlüsselt den Namen von Z symmetrisch. Das Ergebnis sei ZS. A sendet an den Browser des Benutzers eine Header-Location zur Seite S auf B mit Parameter "Dateiname=ZS" Auf B wird im PHP-Skript S der Dateiname ZS zu Z entschlüsselt und dann die Datei über ein fopen(http://A/spezielles Verzeichnis/Z) gelesen. Damit hat B die gewünschten Infos von A. Fertig! Wenn die Datei auf A nicht vorhanden ist, dann konnte sich der Benutzer nicht authentifizieren und die Seite S auf B liefert "zugang nicht möglich". Ggf können die Angaben in der Datei Z ebenfalls verschlüsselt werden. Ähnlich wie bei den Sessions in der PHPlib müssen die Dateien im speziellen Verzeichnis auf A regelmäßig wieder gelöscht werden, am besten alle paar 10 Sekunden oder alle paar Minuten. Was ich noch nicht probieren konnte ist, ob man auf A (ein IIS) den Zugriff auf das "Spezielle Verzeichnis" so einschränken kann, dass ein fopen nur von B aus möglich ist (aber das ist ein Randproblem). Hm - kann mir jemand sagen, ob das vernünftig und sicher ist? Oder gibt es dafür viel einfachere Lösungen? Vielen Dank für jeden Hinweis! Peter Kursawe
php::bar PHP Wiki - Listenarchive