Apache Tomcat und Active Directory Authentifizierung


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.