Um verschiedene Anwendungen in einem einheitlichen Bild erscheinen zu lassen, gilt es, Mehrfachanmeldung zu vermeiden. Aus Gründen der Benutzerfreundlichkeit wird hier also ein Single-Sign-on-(SSO-)Mechanismus angestrebt (also ein Mechanismus zur Einmalanmeldung), der es dem Benutzer erlaubt, sich mit einer einzigen Authentifizierung an einem gesamten Anwendungsverbund anzumelden. Der Benutzer muss sich somit nur noch eine Kennung und ein Passwort merken. Das hierdurch entstehende Sicherheitsrisiko - einem Angreifer genügt das Ausspähen einer einzigen Benutzeridentität, um Zugriff auf den gesamten Verbund zu bekommen - wird in den meisten Fällen in Kauf genommen, denn der Vorteil von SSO wiegt dies meist auf. Nach der Einmalanmeldung werden alle weiteren Aufrufe automatisch und zeitsparend mit den notwendigen Authentifizierungsdaten - den Credentials - versorgt.
Vor- und Nachteile
Welche Vorteile bietet SSO denn nun und was sind die Nachteile? Zu den wichtigsten Vorteilen, sowohl für Endanwender als auch für Unternehmen, die eine SSO-basierte Infrastruktur einsetzen, zählen hierbei:- einheitlicher Zugriff über einen einheitlichen Authentifizierungsmechanismus.
- Benutzer müssen sich nur genau eine Kennung und ein Passwort merken.
- Benutzer können ein komplexeres Passwort wählen, was die Sicherheit erhöht.
- im Idealfall nur eine manuelle Anmeldung pro Sitzung.
- Kostenreduktion durch bessere Wartbarkeit von Zugangs- und Benutzerdaten.
- Angreifer können durch Ausspähen der Zugangsdaten auf alle Systeme zugreifen.
- Ein zentraler Anmeldevorgang kann Single Point of Failure sein, sowohl in Bezug auf Sicherheitsprobleme als auch hinsichtlich des Lastverhaltens.
Lösungsansätze
Es gibt verschiedene Methoden, einen SSO zu realisieren (mal ganz abgesehen von einer clientbasierten Lösung wie etwa einem Passwort-Manager). Im Rahmen dieses Artikels werden jedoch nur zwei der wichtigsten Lösungsansätze beschrieben: Zum einen die Verwendung einer zentralen Instanz, welche die Anmeldung vornimmt, zum anderen die Realisierung eines Circle of Trust, bei der die Anmeldung am Gesamtsystem durch Anmeldung an einem beliebigen System innerhalb des Verbunds erfolgt. Ein grundsätzlicher Ansatz bei SSO, der vorab kurz erläutert werden muss, ist der Einsatz von Tickets. Diese Tickets werden bei einer erfolgreichen Anmeldung erzeugt und dienen ab diesem Zeitpunkt dazu, den Anwender zu authentifizieren. Das Ticket, das ein Benutzer erhält, wird idealerweise automatisch verifiziert (anstelle einer interaktiven Anmeldung durch Eingabe von Benutzerkennung und Passwort). Klar ist jedoch, dass ein solches Ticket - wird es denn von einem Angreifer abgefangen - ein potenzielles Risiko darstellt. (Dieses ist jedoch keinesfalls so schlimm, wie ein erspähtes Passwort!) Tickets sollten deshalb mit einer Gültigkeit versehen werden. Falls ein Ticket entwendet und unrechtmäßig eingesetzt wird, ist es wahrscheinlich schon abgelaufen. Es wird dann wieder eine interaktive Anmeldung nötig, und der Angreifer hat seine Chance vertan. Um Veränderungen an einem Ticket zu verhindern (z.B. um besagte Gültigkeit zu manipulieren), sollte dieses zudem möglichst verschlüsselt oder wenigstens signiert werden. Benutzerkennung und Passwort sind natürlich auf keinen Fall in ein solches Ticket zu speichern. Nein, auch nicht verschlüsselt.Circle of Trust
Ein möglicher Lösungsansatz für SSO ist der so genannte Circle of Trust. Hierbei wird ein Netz aus vertrauenswürdigen Anwendungen aufgebaut. Meldet sich ein Benutzer bei einer der Anwendungen an, so ist er danach für alle anderen Anwendungen gleichermaßen angemeldet. Die ideale Lösung sieht dabei so aus, dass der Benutzer bei der Anmeldung am ersten System ein Ticket bekommt, mit dem er sich bei allen anderen Anwendungen authentifizieren kann. Das Ticket muss hierzu bei jeder Anwendung aus dem Circle of Trust verifiziert werden können.
Zentraler Sign-on-Server
Ein anderer Lösungsansatz ist, für die Anmeldeprozedur eine zentrale Instanz zu etablieren. Bei dieser Lösung - mit einem dezidierten Sign-on- bzw. Ticket-Server - wird eine eigene Anwendung implementiert, die zu Beginn jeder Sitzung angesprochen werden muss. Der Client erhält über diesen Server das Ticket, mit dem er sich gegenüber allen Anwendungen im Verbund authentifizieren kann.
- Jeder Aufruf eines Benutzer-Clients wird zuerst an den Sign-on-Server gerichtet (oder dahin umgelenkt).
- Nach der interaktiven Anmeldung erhält der Client vom Sign-on-Server ein persönliches Ticket. Die Anfrage des Clients wird vom Sign-on-Server an die eigentliche Anwendung weitergeleitet (mittels einer mitgegebenen Rücksprunginformation z.B. in Form eines Rücksprungs-URL).
- Der Client überträgt das Ticket an die Anwendung.
- Die Anwendung verifiziert das Ticket mithilfe eines Aufrufs an den zentralen Sign-on-Server.
- Bei gültigem Ticket wird dem Benutzer Zugriff auf die eigentliche Anwendung gewährt.
Ursprünglich von der Yale University entwickelt, ist Central Authentication Service (CAS) heute ein Open-Source-Projekt der Java Architectures Special Interest Group (JA-SIG). Es ist die Implementierung einer zentralen Instanz zur Behandlung von Authentifizierungen.
CAS ist als eigenständige Webapplikation entworfen und als Java Servlet implementiert. Der Zugriff erfolgt im Wesentlichen über zwei URLs: den Login-URL und den Validierungs-URL. Die Architektur entspricht prinzipiell der oben beschriebenen Vorgehensweise für einen zentralen Sign-on-Server bzw. Ticket-Server. CAS basiert dabei auf diversen Open-Source-Technologien, unter anderem auch auf dem Spring Framework.
Sicherheit durch HTTPS
Der CAS-Server benötigt für die Authentifizierung aus Sicherheitsgründen SSL, damit die Kommunikation vollständig über HTTPS ablaufen kann. Die Anmeldeinformationen werden damit nicht mehr unverschlüsselt über das Netzwerk übertragen, was das Risiko potenzieller Angriffe drastisch reduziert.
Für das vorgestellte Beispiel muss daher im Server eine SSL-Unterstützung konfiguriert werden. Damit die CAS-Clients den Server via HTTPS kontaktieren können, müssen diese ebenfalls SSL-fähig gemacht werden. Die Java Secure Socket Extension (JSEE) ist seit JDK 1.4 bereits Bestandteil von Java, sodass kein zusätzlicher Installationsaufwand entsteht. Zur Verifikation des Server-Zertifikats durch den Client muss dieses jedoch in den lokalen Keystore für vertrauenswürdige Zertifikate aufgenommen werden. Für das Beispiel wurde der Einfachheit halber ein „self-signed Certificate“ erstellt. Dieses muss in den Keystore der Java-Laufzeitumgebung importiert werden, der sich im Pfad $JAVA_HOME/jre/lib/security befindet.
Da das Thema Zertifikate und deren Verwaltung auch für erfahrene Java-Entwickler nicht immer einfach zu handhaben sind, gibt es hierzu auch detaillierte Beschreibungen auf der CAS-Webseite oder in der Tomcat-Dokumentation.
Benötigte Ressourcen
Um den Central Authentication Service zu betreiben und die Beispielanwendung damit auszuführen, werden folgende Ressourcen benötigt:
- Java2SE 5.0: java.sun.com/j2se/1.5.0/
- Tomcat 5.5.17: apache.speedbone.de/tomcat/tomcat-5/
- CAS Server 3.0.4: www.ja-sig.org/downloads/cas/
- CAS Client 2.0.11: www.ja-sig.org/downloads/cas-clients/
Der Server
Der CAS-Server lässt sich im Auslieferungszustand einfach in den Tomcat-Server deployen, indem die Datei target/cas.war in das Verzeichnis $CATALINA_HOME/webapps kopiert wird. Er ist dann zwar sofort lauffähig und kann getestet werden, in den meisten Fällen wird man jedoch Anpassungen der Konfiguration vornehmen wollen, um beispielsweise seinen eigenen Authentifizierungsmechanismus zu realisieren. CAS bietet eine flexible Plug-in-Architektur für so genannte AuthenticationHandler. In dem hier vorgestellten Beispiel wurde eine entsprechende Klasse geschrieben, welche das Interface AuthenticationHandler implementiert. Diese Klasse prüft die Eingabedaten gegen eine statische HashMap (Listing 1).Listing 1public class HashmapAuthHandler implements AuthenticationHandler {private static final HashMap<String, String> DUMMY_STORE = new HashMap();static {// Map laden, damit wir etwas haben, gegen das wir Eingaben prüfen// können: Form <Benutzer, Passwort>DUMMY_STORE.put("Harry", "hirsch");DUMMY_STORE.put("foo", "bar");DUMMY_STORE.put("Oli", "Rummeyer");DUMMY_STORE.put("Joe", "dust");}public boolean authenticate(Credentials credentials)throws AuthenticationException {UsernamePasswordCredentials upCredentials =(UsernamePasswordCredentials) credentials;String user = upCredentials.getUsername();String pw = upCredentials.getPassword();if (!DUMMY_STORE.containsKey(user))return false;String compareMe=DUMMY_STORE.get(user);return compareMe.equals(pw);}public boolean supports(Credentials credentials) {return credentials instanceof UsernamePasswordCredentials;}}
<property name="authenticationHandlers"><list>...<bean class="com.syngenio.cas.authentication.handlers.support.HashmapAuthHandler"/></list></property>
Client-Integration
CAS bietet Bibliotheken für die schnelle Implementierung eines Java-basierten Clients. Dieser wird als Servlet-Applikation realisiert. Die Bibliotheken enthalten Java-Klassen, welche den clientseitigen Teil des CAS-Protokolls implementieren - also Klassen für die Überprüfung von Tickets, Servlet-Basisklassen sowie Klassen für die Umleitung von HTTP-Aufrufen zum CAS-Server (Filter). Die jar-Datei mit den benötigten Klassen muss nach $CATALINA_HOME/common/lib kopiert werden. Dadurch können alle Webanwendungen auf die CAS-Client-Klassen zugreifen. Damit die Anwendung SSO-fähig wird, muss sie bei jeder Anfrage (httpRequest) die Gültigkeit des übergebenen Tickets beim CAS-Server prüfen lassen. Die Aufgabe, diese Anfrage an den CAS-Server zu richten, übernimmt der Servlet-Filter mit dem Namen CASFilter aus der CAS-Client-Bibliothek. Diese Klasse spielt eine zentrale Rolle für den Ablauf der Anmeldung. Der CAS-Filter wird in der web.xml-Datei der Client-Anwendung konfiguriert (Listing 2).Listing 2<filter><filter-name>CAS Filter</filter-name><filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class><init-param><param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name><param-value>https://localhost:8443/cas/login</param-value></init-param><init-param><param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name><param-value>https://localhost:8443/cas/proxyValidate</param-value></init-param><init-param><param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name><param-value>localhost:8080</param-value></init-param></filter><!-- Filter für alle URL's aktivieren --><filter-mapping><filter-name>CAS Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
Hallo, CAS User!
Der Benutzer soll in der Beispielanwendung mit seinem Namen begrüßt werden, falls er sich erfolgreich anmelden konnte. Hierzu wurde ein Servlet entwickelt, das diese Aufgabe übernimmt (Listing 3).Listing 3protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {...// der cas-filter erzeugt eine session, explizit keine neue erstellenHttpSession s = req.getSession(false);// name des angemeldeten benutzers auslesenString authenticatedUser =(String) s.getAttribute("edu.yale.its.tp.cas.client.filter.user");// die http-antwort zusammenbauen...out.println("<p>Hello "+authenticatedUser+", you have successfully\signed on using the Central Authentication Service</p>");...}
Fazit
Mit CAS bekommt man eine ausgereifte Software frei zur Verfügung gestellt. Es lassen sich damit die üblichen Anforderungen eines zentralen Single-Sign-on-Service abdecken. CAS bietet eine flexibel erweiterbare Architektur und zudem umfangreiche Integrationsmöglichkeiten in heterogenen Umgebungen. Für nahezu jede gängige Programmiersprache existieren Client-Bibliotheken (z.B. C#/.NET oder PHP). Auch bestehende Portale können einfach an CAS angebunden werden (Unterstützung von JSR 168: Portlet Specification) und sogar eine Integration mit Acegi (Security System for Spring) wird unterstützt. Beim Einsatz von CAS ist man also auch für die Zukunft gut gewappnet.Oliver Rummeyer und Jörg Düsterhaus sind als Berater bei der syngenio AG tätig. Sie beschäftigen sich mit komplexen Java EE-basierten Anwendungen in heterogenen IT-Landschaften von Banken und Finanzdienstleistern.






