phpbar.de logo

Mailinglisten-Archive

[php] single sign on: Wie realisiere ich so was?

[php] single sign on: Wie realisiere ich so was?

Peter Kursawe php_(at)_phpcenter.de
Sat, 26 Jan 2002 13:37:45 +0100


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