Via JNDI-Realm kann Apache Tomcat angewiesen werden, Benutzer, Gruppen und Rollen aus einer LDAP-Quelle, zB. Active Directory zu laden. Die größte Herausforderung liegt darin, die AD-Gruppen zu Tomcat-Rollen zu “mappen”.
Problem
Sofern die Rolle der Tomcat Applikation dem Namen der AD-Gruppe entspricht ist das Mapping trivial. Wenn nicht – z.B. weil es eine Konvention für AD-Gruppennamen gibt und die Legacy Tomcat-Applikation fix codierte Rollennamen erwartet: siehe Workaround unten.
Lösung (Workaround)
Im Beispiel werden wir die Tomcat-Rolle “reporting” mit der AD-Gruppe “Tomcat_Reporting” verknüpfen.
- Dazu legen wir im ersten Schritt eine AD-Gruppe mit dem Namen “Tomcat_Reporting” an und weisen die gewünschten AD-Benutzer zu.
- Im Feld “Notizen” (aka “Info”) der Gruppe tragen wir den Namen der Tomcat-Rolle “reporting” ein.
- Als nächstes müssen wir in der “server.xml” Konfigurationsdatei die JNDI-Realm konfigurieren. (Beispiel siehe unten.)
- Die Einträge beginnend mit “connection…” verweisen auf die AD-Infrastruktur und den Login-Account für die LDAP-Abfrage,
- die “user…” Konfiguration setzt die Suchfilter für die Abfrage und
- Einträge beginnend mit “role…” geben an, (a) welche AD-Gruppen berücksichtigt werden und (b) in welchem Feld der Rollen-Name gesucht wird. (Im Beispiel passiert das Mapping über roleName=“info”.)
Beispiel Konfiguration (server.xml)
<Realm className="org.apache.catalina.realm.JNDIRealm"
referrals="follow"
connectionURL="ldap://ad.domain.com:3268"
connectionName="CN=Tomcat Serviceuser,OU=ServiceUser,DC=ad,DC=domain,DC=com"
connectionPassword="komplexes Passwort des Tomcat Service-Users"
userBase="DC=ad,DC=domain,DC=com"
userSearch="(sAMAccountName={0})"
userSubtree="true"
userRoleName="memberOf"
roleBase="OU=Tomcat Application,OU=Security Groups,DC=ad,DC=domain,DC=com"
roleSearch="(member={0})"
roleName="info"
roleSubtree="false"
/>
PS.: Bitte um Info, wenn es einen eleganteren Weg gibt das Problem zu lösen.