JNDI und JAAS am Beispiel des Moduls directoryservices Adapter für Authentifizierungs- und Verzeichnisdienste der Fiducia
Ziel dieses Vortrags Kurzbeschreibung der Verzeichnisdienste, die die Fiducia betreibt Zugriff auf Verzeichnisdienste mit Java-JNDI Autorisierung mit JAAS Modul directoryservices als Adapter mit einheitlicher Schnittstelle für alle Anwendungen JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 2
Agenda Kurzbeschreibung der von der Fiducia betriebenen Verzeichnisdienste Zugriff auf Verzeichnisdienste mit Java-JNDI Authentifizierung und Autorisierung mit JAAS Wie finde ich einen Verzeichnisdienst? Umsetzung im Modul directoryservices Feedback, Fragen JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 3
Agenda Kurzbeschreibung der von der Fiducia betriebenen Verzeichnisdienste Zugriff auf Verzeichnisdienste mit Java-JNDI Authentifizierung und Autorisierung mit JAAS Wie finde ich einen Verzeichnisdienst? Umsetzung im Modul directoryservices Feedback, Fragen JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 4
Verzeichnisdienste der Fiducia Zentrales LDAP der Fiducia IT AG Hierarchische Anordnung von Informationen zu Mandanten und deren Bedienern Pro Mandant ein Teilbaum mit Gruppen und Objekten für Benutzer Technische Architektur Mehrere zentrale LDAP-Systeme wegen Ausfallsicherheit Betrieb in DMZ zum Schutz vor unzulässigen Zugriffen à Löst RACF langfristig ab Windows Active Directory Pro Mandant ein System Zur Authentifizierung beim Login an Windows-Betriebssystem Autorisierung von Zugriffen auf LAN-Ressourcen Eigene Hierarchie mit Teilbäumen für Gruppen und Objekten für Bediener JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 5
Agenda Kurzbeschreibung der von der Fiducia betriebenen Verzeichnisdienste Zugriff auf Verzeichnisdienste mit Java-JNDI Authentifizierung und Autorisierung mit JAAS Wie finde ich einen Verzeichnisdienst? Umsetzung im Modul directoryservices Feedback, Fragen JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 6
Zugriff auf Verzeichnisdienste mit Java-JNDI JNDI ist ein Java-API für Zugriffe auf Namens-und Verzeichnisdienste JNDI besitzt eine Service-Provider-Architektur Standard-Zugriff mit LDAP-Simple-Bind Wichtige Übergabeparameter sind: URL des LDAP-Servers mit Basis-Pfad im Verzeichnis Bind-DN: Voll-Qualifizierter Pfad zum Objekt des Benutzers (Distinguished Name) Credential: Passwort des Benutzers zur Authentifizierung Ergebnis: Instanz vom Typ DirContext, als Verbindung zum Verzeichnisdienst DirContext Erlaubt die Verwaltung der Daten im Verzeichnis Bediener anlegen, ändern, löschen, anzeigen Verwaltung der Credentials der Bediener Passwortwechsel, Passwort-Rücksetzung JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 7
Schaubild: Zugriff auf Mitarbeiterdaten durch Administrator LDAP-URL mit Basis-Pfad: <LDAP-Server> : 636 /ou=8844,ou=gruppen,ou=mitarbeiter zentraler LDAP-Server 8844 Gruppen BIND-DN: ou=8844,ou=gruppen,ou=admins,cn=maier Credential: <Passwort von Maier> à DirContext Admins Maier - Passwort = Start123 Mitarbeiter Müller - Vorname=Elmar - Nachname=König - JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 8
Agenda Kurzbeschreibung der von der Fiducia betriebenen Verzeichnisdienste Zugriff auf Verzeichnisdienste mit Java-JNDI Authentifizierung und Autorisierung mit JAAS Wie finde ich einen Verzeichnisdienst? Umsetzung im Modul directoryservices Feedback, Fragen JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 9
Authentifizierung und Autorisierung mit JAAS Verzeichnisdienste können sensible Daten beinhalten, eine Authentifizierung und Autorisierung des Zugriffs ist also nötig Die Autorisierung übernehmen hierbei die Verzeichnisdienste selbst Unter LDAP werden dazu Access-Control-Items (ACI) verwendet Diese können zu Access-Control-Lists (ACL) gebündelt werden Für den Verzeichnisdienst ist also die zweifelsfreie Authentifizierung essentiell Jede Implementierung bietet natürlich eigene Authentifizierungs-Möglichkeiten, diese unterscheiden sich jedoch teilweise erheblich LDAP Simple Bind auf RACF-LDAP hat andere Syntax als im SUN-LDAP Eine einheitliche und sichere Authentifizierung wäre angemessener JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 10
Authentifizierung und Autorisierung mit JAAS Ein ideales System zur Authentifizierung ist Kerberos Entwickelt Ende der 1980er Jahre am MIT (Projekt Athena) Native Kerberos-Authentifizierung ist jedoch sehr kompliziert zu implementieren Hier hilft uns JAAS Java Authentication and Authorization Service JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 11
Authentifizierung und Autorisierung mit JAAS Kernkonzept in JAAS ist das Subject Ein Subject repräsentiert eine authentifizierte Identität und ermöglicht, Aktionen im Kontext dieser Identität auszuführen Dies ist der wichtigste Unterschied zu den klassischen Delegationslösungen JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 12
Authentifizierung und Autorisierung mit JAAS Delegations-Lösung Client Server User-Context: YC8123AB 1 User-Context: tomcat 2 3 Directory Ressource Der Client weist sich mit der gewünschten Benutzerkennung am Server aus und fordert eine Transaktion an Der Server prüft diese Benutzerkennung, z. B. gegen ein Directory Bei Erfolg wird die gewünschte Transaktion durchgeführt JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 13
Authentifizierung und Autorisierung mit JAAS Nachteilig bei diesen Lösungen ist, dass der Ressourcenzugriff physikalisch unter dem Benutzer Account des Servers (in diesem Beispiel: Tomcat) erfolgt Die Ressource muss also immer einer Verbindung vom Server vertrauen Dieses Vertrauen wird üblicherweise durch künstliche Authentifizierungen hergestellt Technische User, Zertifikate des Servers Der eigentliche Auslöser der Transaktion ist für die Ressource nicht sichtbar JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 14
Authentifizierung und Autorisierung mit JAAS JAAS-Lösung mit Subject erst mal einfach Server Client User-Context: YC8123AB 1 Subject User-Context:YC8123AB User-Context: tomcat 2 3 Directory Ressource Der Client weist sich mit der gewünschten Benutzerkennung am Server aus und fordert eine Transaktion an Der Server prüft diese Benutzerkennung, z. B. gegen ein Directory und erzeugt das Subject Das Subject führt die Transaktion unter dem echten Kontext des Benutzers aus! JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 15
Authentifizierung und Autorisierung mit JAAS JAAS-Lösung mit Subject komplett Client Server Subject User-Context:YC8123AB User-Context: anonymous 2 Delegated Subject User-Context:YC8123AB User-Context: tomcat 1 3 Directory Ressource Der Client weist sich mit der gewünschten Benutzerkennung am Directory aus und erzeugt das Subject Das Subject wird auf geeignete Art und Weise an den Server übertragen Das Subject führt die Transaktion unter dem echten Kontext des Benutzers aus! JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 16
Authentifizierung und Autorisierung mit JAAS Beispiel: Krb5-gesicherte LDAP-Verbindung JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 17
Authentifizierung und Autorisierung mit JAAS Beispiel: Krb5-gesicherte LDAP-Verbindung Subject erzeugen JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 18
Authentifizierung und Autorisierung mit JAAS Beispiel: Krb5-gesicherte LDAP-Verbindung Subject verwenden JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 19
Agenda Kurzbeschreibung der von der Fiducia betriebenen Verzeichnisdienste Zugriff auf Verzeichnisdienste mit Java-JNDI Authentifizierung und Autorisierung mit JAAS Wie finde ich einen Verzeichnisdienst? Umsetzung im Modul directoryservices Feedback, Fragen JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 20
Wie finde ich einen Verzeichnisdienst? Navigieren durch die Strukturen eines Verzeichnisdiensts stellt kein Problem mehr dar Authentifizierung ist ebenfalls geklärt Aber: Woher kommt die URL für den Verzeichnisdienst? Property-Files? System-Properties? XML-Monster? Natürlich nicht, sondern wiederum aus einem Verzeichnis! JNDI stellt einen Provider für DNS bereit Und per DNS können Services im Netz abgefragt werden JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 21
Wie finde ich einen Verzeichnisdienst? Hierbei handelt es sich nicht um einfache Namensauflösungen Dazu müssten wir ja den Hostnamen kennen Wir wissen aber nur, dass wir einen LDAP-Server oder einen Kerberos-KDC benötigen Und wir kennen noch unsere eigene Netz-Domäne Wir befragen also DNS, welche Hosts in der Domäne den gewünschten Dienst bereitstellen Die Anfrage sieht dabei folgendermaßen aus _<service>._<transport>.my.domain.de Um also in der Fidudom alle LDAP-Server zu finden, setzen wir folgende Query ab _ldap._tcp.fidudom.fiducia.de Das JRE stellt zur Erzeugung des InitialDirContext eine DNSContextFactory bereit Der relevante Code mutiert dadurch zu einer Handvoll einfacher Anweisungen JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 22
Wie finde ich einen Verzeichnisdienst? Beispiel JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 23
Agenda Kurzbeschreibung der von der Fiducia betriebenen Verzeichnisdienste Zugriff auf Verzeichnisdienste mit Java-JNDI Authentifizierung und Autorisierung mit JAAS Wie finde ich einen Verzeichnisdienst? Umsetzung im Modul directoryservices Feedback, Fragen JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 24
Umsetzung im Modul directoryservices Die wesentlichen Komponenten beim Zugriff auf einen Verzeichnisdienst sind also Ermitteln der Ziel-URL Erzeugen einer Verbindung unter einem Subject Navigation durch den (implementierungsspezifischen) Verzeichnis-Baum Lösungen für all diese Themen wurden aufgezeigt Die Anzahl der vorhandenen Verzeichnisdienste erschwert Fachprojekten jedoch, die geeigneten Lösungsvarianten zu ermitteln Zudem haben die unterschiedlichen Dienste unterschiedliche Strukturen Um dies zu vereinfachen, wurde das Modul directoryservices geschaffen Um die Verwendung auch innerhalb des Frameworks zu ermöglichen, liegt das Modul logisch gesehen unterhalb von JBF Nach bewährter Manier besteht das Modul aus einem Kern und verschiedenen Plug-ins JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 25
Umsetzung im Modul directoryservices Der Kern definiert dabei Interfaces für die verschiedenen Plug-in-Typen und stellt Factories und Kompositoren zur Erzeugung eines für einen konkreten Verzeichnisdienst passenden DirectoryService-Objekts bereit Ein solches DirectoryService-Objekt übernimmt im wesentlichen die Ansteuerung der in ihm aggregierten Plug-ins Folgende Plug-in-Typen existieren ITargetHostProvider IConnectionCreator IDirectoryAdapter JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 26
Umsetzung im Modul directoryservices ITargetHostProvider Ermittelt die Netzadresse (Host und Port) für das gewünschte Backend Als Interface implementiert, da bei diversen Backends unterschiedliche Methoden verwendet werden müssen IConnectionCreator Erzeugt gesicherte und authentifizierte physikalische Verbindungen zum Backend IDirectoryAdapter Übersetzt die generischen Aufrufe aus Directory-Services in LDAP-Calls für den Ziel- Verzeichnisdienst Kapselt die Spezifika hinsichtlich Verzeichnisstruktur und Attribut-Typen Übersetzt Fehlercodes des Verzeichnisdiensts in definierte Exceptions JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 27
Umsetzung im Modul directoryservices Daneben existieren noch 3 Hilfs-Interfaces, die die aufrufende Komponente implementieren und dem DirectoryService bereit stellen muss: ICredentialProvider ILogger IConfigurationManager Diese Interfaces dienen jedoch nur der Integration in das aufrufende System und sind relativ uninteressant JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 28
Umsetzung im Modul directoryservices Das Zusammenspiel dieser Komponenten sieht aus wie folgt JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 29
Umsetzung im Modul directoryservices Vorhandene Implementierungen für ITargetHostProvider FCSITargetHostProvider RACFLdapTargetHostProvider ZLdapTargetHostProvider Vorhandene Implementierungen für IConnectionCreator KerberosBasedConnectionCreator ADLdapSimpleBindConnectionCreator RACFLdapSimpleBindConnectionCreator ZLdapSimpleBindConnectionCreator Vorhandene Implementierungen für IDirectoryAdapter ADDirectoryAdapter RACFDirectoryAdapter ZLDAPDirectoryAdapter JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 30
Agenda Kurzbeschreibung der von der Fiducia betriebenen Verzeichnisdienste Zugriff auf Verzeichnisdienste mit Java-JNDI Authentifizierung und Autorisierung mit JAAS Wie finde ich einen Verzeichnisdienst? Umsetzung im Modul directoryservices Feedback, Fragen JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 31
Fragen? Diskussion? Elmar König Anwendungsentwicklung Technische Architektur JBF-Team elmar.koenig@fiducia.de 0 89 / 99 43 31 17 Andreas Knoll Anwendungsentwicklung Technische Architektur JBF-Team andreas.knoll@fiducia.de 0 89 / 99 43 34 51 JNDI und JAAS am Beispiel des Moduls directoryservices Elmar König, Andreas Knoll JBFOne 2011 Seite 32