Zum Inhalt springen

Ein Login für alles – SSO mit PHP

Unternehmen haben zumeist Infrastrukturen, in denen für die Benutzer viele verschiedene Dienste angeboten werden. Inzwischen sind viele dieser Dienste als Webapplikationen verfügbar und somit ist der Browser ein sehr wichtiges Werkzeug bei der täglichen Arbeit. Baut man diese Infrastruktur auf Produkten von Microsoft auf, so kann man mit Domänen arbeiten und das Login zu einem MS-Dienst wird durch den Internet Explorer verschleiert. So etwas ähnliches kann man sich auch mit anderen Technologien bauen und damit auf MS verzichten.

Das Zauberwort heißt Single Sign On (kurz: SSO) und ist jedem Google Mail Benutzer wohlbekannt. Loggt man sich bei Google für Google Mail ein, so wird man zu einem SSO-Login umgeleitet und ist dadurch automatisch auch bei seinem Kalendar, den Texten, Picasa etc. angemeldet.

Um ein SSO-Dienst aufzubauen, benötigt man 2 Dinge. Erstmal einen Identity Provider, der die Identität des Benutzers prüft und auch ein Login bereitstellt. Daneben benötigt man auch Service Provider, die dem Benutzer Dienste bereitstellen: ein Wiki, eine Zeiterfassung, Groupware u.ä. Ein Protokoll das hierfür standardisiert ist, nennt sich SAML (Security Assertion Markup Language) und wird von verschiedenen Bibliotheken implementiert. Eine PHP Bibliothek, die beide Komponenten abdeckt, heißt simpleSAMLphp.

Die Implementierung des Identity Providers unterstützt hierbei verschiedene Konnektoren, sodass man den Provider sehr einfach in eine bestehende Infrastruktur integrieren kann. LDAP gehört genauso wie Anbindung an eine SQL Datenbank zu dem Standard, den man als Entwickler erwartet. simpleSAMLphp kann aber auch den yubikey oder Google nutzen. Auch ist es möglich openID „anzuzapfen“ oder das Login durch eine andere SSO Instanz überprüfen zu lassen.

Um einen Service Provider zu erstellen, muss die Anwendung für diese Art der Authentifizierung und Authorisierung vorbereitet sein. Bei Neuentwicklungen lässt sich darauf achten, bei bestehenden System sind Anpassungen notwendig.

Die Installation beider Komponenten verläuft relativ unproblematisch, da es eine gute Dokumentation gibt. Desweiteren kann man einen Debug-Modus aktivieren und den Identity Provider in einem Testmodus nutzen. Hierbei kann man entweder ein automatisches Login einstellen oder Beispielnutzer konfigurieren.

Zu beachten ist bei einem Test, dass Service Provider und Identity Provider unter verschiedenen Domänen laufen sollten, um Nebeneffekte der sich überlagernden Cookies zu vermeiden. Wie üblich kann man die hosts-Datei anpassen, oder virtuelle System aufsetzen; abhängig davon wie umfangreich die Tests ausfallen und wofür das System eingesetzt werden wird. Die simpleSAMLphp-Bibliothek kommt mit Beispiel Service Providern, die man zum Testen der Technologie nutzen kann.

Die Funktionsweise eines SSO Systems ist aus der Vogelperspektive betrachtet recht überschaubar. Als Benutzer versuche ich eine Webapplikation aufzurufen. Hierbei wird meine Identität überprüft. Das ist bei jeder Seite mit Login so. Habe ich mich nicht eingeloggt, wird aber keine Loginseite der Webapplikation angezeigt, sondern ein Redirect zum Service Provider durchgeführt. Dieser ist auch nicht schlauer, bietet mir aber ein Loginformular an. Wenn ich mich erfolgreich eingeloggt habe, werde ich wieder zur Webapplikation zurückgeschickt. Anhand des SSO-Tokens kann diese feststellen, dass die Authentifizierung erfolgreich war. Im Detail kann sich die Art und Weise unterscheiden, da SAML2 verschiedene Varianten der Weiterleitung und Integration anbietet. Sehr informativ ist die Spezifikation.

Update (01.10.2010):
Wie gewünscht gibt es nun noch ein kleines Beispiel, wie man das SSO System einrichtet. Ich habe als Test-System 2 VMS mit Debian Squeeze genutzt, auf denen ich jeweils php5 und einen Apache installiert habe. Die zip-Datei von simpleSAMLphp entpackt man dann wo es beliebt und muss dafür sorgen, dass der Webserver im simplesaml Pfad das www-Verzeichnis der entpackten Zip-Datei findet. Da dies das Basisverhalten ist, muss man nichts umkonfigurieren, was die Pfade angeht. Dies macht man auf beiden System, also sowohl Identity Provider als auch Service Provider.

Der Identity Provider benötigt nun Zugang zu einem Authorisierungssystem. Also eine Stelle, an der Name und Passwörter abgelegt sind. Zum testen kann man eine sehr einfache Variante nutzen. Im config-Verzeichnis findet man die authsources.php-Datei und dort kommentiert man folgenden Code ein. Alle Verbindungsvarianten sind beispielhaft in dieser Datei aufgeführt.

'example-userpass' => array(
                'exampleauth:UserPass',
                'student:studentpass' => array(
                        'uid' => array('test'),
                        'eduPersonAffiliation' => array('member', 'student'),
                ),
                'employee:employeepass' => array(
                        'uid' => array('employee'),
                        'eduPersonAffiliation' => array('member', 'employee'),
                ),
        ),

Nun wechselt man in den metadata-Ordner und passt dort die remote und hosted-Dateien an. Abhängig davon, auf welchem System man sich befindet. Also auf dem Service Provider muss saml2-idp-remote angefasst werden, um den SSO-Server bekannt zu geben. Auf dem SSO-Server passt man saml20-sp-remote an. Damit auch der Identity Provider weiß, wo sich der Service Provider befindet. Nur valide Service Provider sind erlaubt.

Im www Ordner haben sich unter example-simple auch noch Beispiele versteckt, die man als Test vom Service Provider her aufrufen kann. Ich finde das verysimple Beispiel gut, da hier ein HTTP-Post über den SSO-Server zur eigentlichen Applikation gezeigt wird.

Die wichtigsten Befehle zusammengefasst sind:

// auth Objekt für default-sp erzeugen 
$as = new SimpleSAML_Auth_Simple('default-sp');
// Login anzeigen falls notwendig, ansonsten user einloggen, GET und POST werden weitergereicht
$as->requireAuth();
// prüft ob der Benutzer eingeloggt wurde (bspw um Logout Link anzuzeigen)
$as->isAuthenticated();

// Benutzer ausloggen und redirect-Schleife verhindern
$as->logout(SimpleSAML_Utilities::selfURLNoQuery());

Weitergehende Beispiel findet man im Code von simpleSAMLphp und in der guten Dokumentation.

Published inAllgemein

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close