Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
+49 (0) 351/850 33-0

Anbindung des OpenBenno Mailarchivs an ein Active Directory

OpenBenno ist eine unter GPL lizenzierte E-Mail Archivierungslösung. Damit ist es möglich, die gesetzlichen Anforderungen zur Archivierung elektronischer Kommunikation umzusetzen. Soll diese Software im Unternehmen eingesetzt werden, ist zumeist eine Anbindung an ein vorhandenes Nutzerrepository via LDAP notwendig. Dieser Artikel beschreibt die notwendige Konfiguration der Anbindung an CAS und das Active Directory. Die zusätzlich notwendige Library, deren Sourcen und eine Beispielkonfiguration können am Ende des Artikels heruntergeladen werden.

Beschreibung der Konfiguration

Zur Authentifikation und Autorisation benutzt OpenBenno das Spring Security (ehemals Acegi) Framework. Dieses ermöglicht die Einbindung der Anwendung in eine Vielzahl von Wirkumgebungen. Die Authentifikation sollte im konkreten Fall über die Single-Sign-On-Lösung CAS erfolgen. Die Auflösung der Nutzerberechtigungen wird über die LDAP-Schnittstellt des Active Directorys erfolgen.

Die initiale Einbindung des CAS-Workflows wird von einem EntryPoint ermöglicht, der eine Weiterleitung zur CAS-Login-Seite vornimmt:

<http entry-point-ref="casProcessingFilterEntryPoint">
   <intercept-url pattern="/login.html*" filters="none"/>
   <intercept-url pattern="/images/**" filters="none"/>

   <!-- adjust this role for your needs. "User" is a group, in that (in this case) -->
   <!-- everybody is a member, who should have access to the mail archive. -->
   <intercept-url pattern="/**" access="ROLE_USER"/>

   <form-login login-page='/login.html'/>
   <logout invalidate-session="true" logout-success-url="/login.html" />
</http>

<beans:bean id="casProcessingFilterEntryPoint" class="org.springframework.security.ui.cas.CasProcessingFilterEntryPoint">
   <beans:property name="loginUrl" value="https://www.mycompany.de/cas/login"/>
   <beans:property name="serviceProperties" ref="serviceProperties"/>
</beans:bean>

<beans:bean id="serviceProperties" class="org.springframework.security.ui.cas.ServiceProperties">
   <beans:property name="service" value="http://www.mycompany.de/bennosearch/j_spring_cas_security_check"/>
   <beans:property name="sendRenew" value="false"/>
</beans:bean>

Die Rollendefinition ROLE_USER muss dabei so angepasst werden, dass dort eine Gruppe referenziert wird, der alle Nutzer angehören, die Zugriff auf das Mailarchiv erhalten sollen. An der Bean casProcessingFilterEntryPoint muss dabei die Login-URL des CAS definiert werden. In den serviceProperties muss die URL definiert werden, auf die das CAS bei erfolgreichem Login weiterleitet. Wichtig ist dabei die Angabe der speziellen URL (/j_spring_cas_security_check), auf welche ein spezieller CAS-Filter angesetzt wird:

<authentication-manager alias="authenticationManagerAlias"/>

<beans:bean id="casProcessingFilter" class="org.springframework.security.ui.cas.CasProcessingFilter">
   <custom-filter after="CAS_PROCESSING_FILTER"/>
   <beans:property name="authenticationManager" ref="authenticationManagerAlias"/>
   <beans:property name="defaultTargetUrl" value="/"/>
   <beans:property name="filterProcessesUrl" value="/j_spring_cas_security_check"/>
</beans:bean>

Die Validierung des CAS-Tickets wird später von einem custom-authentication-provider durchgeführt. Dieser benötigt die Basis-URL des CAS:

<beans:bean id="casAuthenticationProvider" class="org.springframework.security.providers.cas.CasAuthenticationProvider">
   <custom-authentication-provider/>
   <beans:property name="userDetailsService" ref="userDetailsService"/>
   <beans:property name="serviceProperties" ref="serviceProperties"/>
   <beans:property name="ticketValidator">
      <beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
         <beans:constructor-arg index="0" value="https://www.mycompany.de/cas/"/>
      </beans:bean>
   </beans:property>
   <beans:property name="key" value="ticket"/>
</beans:bean>

Bei erfolgreicher Authentifizierung werden über den referenzierten userDetailsService die Rollen des Nutzers nachgeladen, welche später entscheiden, ob das Mailarchiv überhaupt zugänglich ist, und welche E-Mail-Adressen durchsucht werden können. Dabei wird auf das Active Directory zugegriffen.

<beans:bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
   <beans:constructor-arg value="ldap://ldap.mycompany.de:3268/dc=mycompany,dc=de"/>
   <beans:property name="userDn" value="cn=publicLogin,cn=Users"/>
   <beans:property name="password" value="publicLoginPassword"/>
</beans:bean>

<beans:bean id="userDetailsService" class="org.springframework.security.userdetails.ldap.LdapUserDetailsService">
   <beans:constructor-arg index="0" ref="userSearch"/>
   <beans:constructor-arg index="1" ref="authoritiesPopulator"/>
</beans:bean>

<beans:bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
   <beans:constructor-arg index="0" value="CN=Users"/>
   <beans:constructor-arg index="1" value="(&amp;(sAMAccountName={0})(objectClass=user))"/>
   <beans:constructor-arg index="2" ref="contextSource"/>
</beans:bean>

Die Bean contextSource definiert die URL des LDAPs und den zu verwendenden Basispfad. Weiterhin müssen ein öffentlicher Nutzer und Passwort für einen erfolgreichen Bind angegeben werden. Die Bean userSearch definiert einen Filter zum Auffinden des eingeloggten Nutzers, wobei {0} ein Platzhalter für das eingegebene Login ist. Für den referenzierten authoritiesPopulator muss jedoch eine spezielle Komponente für OpenBenno verwendet werden:

<beans:bean id="authoritiesPopulator" class="de.communardo.openbenno.OpenBennoLdapAuthoritiesPopulator">
   <beans:constructor-arg ref="contextSource"/>
   <beans:constructor-arg value=""/>
   <beans:property name="groupRoleAttribute" value="cn"/>
   <beans:property name="groupSearchFilter" value="(&amp;(member={0})(objectClass=group))"/>
   <beans:property name="rolePrefix" value="ROLE_"/>
   <beans:property name="searchSubtree" value="true"/>
   <beans:property name="convertToUpperCase" value="false"/>
   <beans:property name="mailRoleAttribute" value="mail"/>
</beans:bean>

Dieser authoritiesPopulator ist eine Ableitung vom standardmäßigen DefaultLdapAuthoritiesPopulator, der damit um eine Funktion erweitert wurde. Es wird nicht nur die Menge an zugewiesenen Nutzergruppen (aus dem Active Directory) in Rollenbezeichnungen für Spring Security überführt, sondern zusätzlich die E-Mail-Adresse des Nutzers als spezielle Rolle mit dem Präfix ROLE_MAIL_ bereitgestellt.

Im konkreten Fall bezeichnet das Attribut mail des authentifizierten Nutzers die jeweilige E-Mail-Adresse. Über die Property mailRoleAttribute kann dieser Wert angepasst werden. Optional kann über die Property roleMailPrefix der Präfix (standardmäßig ROLE_MAIL_) angepasst werden. Für die aktuelle Version von OpenBenno ist dies jedoch nicht notwendig.

Der OpenBennoLdapAuthoritiesPopulator überschreibt die getAdditionalRoles-Methode und entnimmt lediglich das Mail-Attribut aus dem LDAP-Nutzer und stellt diese, zusammen mit dem Präfix, als neue Authority bereit:

protected Set getAdditionalRoles(DirContextOperations user, String username) {

   String mailAddress = user.getStringAttribute(mailRoleAttribute);
   String role = roleMailPrefix + mailAddress.toLowerCase();
   Set result = new HashSet();
   result.add(new GrantedAuthorityImpl(role));
   return result;
}

Die gesamte Klasse kann im Quellcode und als gepaktes JAR heruntergeladen werden.

Bereits im ersten Codeabschnitt wurde das Logout-Verhalten definiert:

<logout invalidate-session="true" logout-success-url="/login.html" />

Damit wird erreicht, dass nach einem Klick auf den Logout-Button zur Login-Seite gesprungen und die Session invalidiert wird. Um sich auf der dann gezeigten Login-Seite erneut einloggen zu können, muss LDAP noch für den direkten Login konfiguriert werden. Dies ist durch die Registrierung eines custom-authentication-providers möglich:

<beans:bean id="ldapProvider" class="org.springframework.security.providers.ldap.LdapAuthenticationProvider">
   <custom-authentication-provider/>
   <beans:constructor-arg ref="ldapBindAuthenticator" />
   <beans:constructor-arg ref="authoritiesPopulator"/>
</beans:bean>

<beans:bean id="ldapBindAuthenticator" class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator">
   <beans:constructor-arg ref="contextSource"/>
   <beans:property name="userSearch" ref="userSearch" />
</beans:bean>

Mithilfe der beschriebenen Konfigurationsschritte ist die Anbindung von OpenBenno an CAS und LDAP (z.B. Active Directory) möglich. Um Ihr OpenBenno entsprechend zu konfigurieren, folgen Sie bitte diesen Schritten:

Installationsanweisungen

  1. Getestet für OpenBenno 1.0.7
  2. JAR und Beispiel-XML-Konfiguration herunterladen
  3. XML-Konfiguration entsprechend Ihrer Wirkumgebung anpassen und umgenennen (applicationContext-security.xml)
  4. Tomcat stoppen
  5. JAR deployen
    • tomcat/webapps/bennosearch/WEB-INF/lib/
    • tomcat/webapps/bennosearch.war#/WEB-INF/lib/ (in das WAR der bennosearch-Anwendung)
  6. applicationContext-security.xml deployen
    • tomcat/webapps/bennosearch/WEB-INF/
    • tomcat/webapps/bennosearch.war#/WEB-INF/ (in das WAR der bennosearch-Anwendung)
  7. Tomcat starten

Download

Tipps

  • Wenn Sie OpenBenno nur an LDAP anbinden wollen, und dabei kein CAS verwendet werden soll, können Sie die beschriebene XML-Konfiguration ebenfalls benutzten. Es müssen nur die Bestandteile, die für CAS benötigt werden, weggelassen werden (casProcessingFilterEntryPoint, serviceProperties, casProcessingFilter, casAuthenticationProvider, entry-point-ref=“casProcessingFilterEntryPoint“ und <authentication-manager alias=“authenticationManagerAlias“/>).
  • Um bestimmten Nutzern gesonderte Leserechte für zusätzliche E-Mail-Adressen zu geben, können bestimmte Gruppen im Active Directory angelegt und zugewiesen werden. So könnte für eine Support-E-Mail-Adresse support@mycompany.com gewollt sein, dass alle Mitarbeiter diese E-Mail-Adresse ebenfalls im Archiv betrachten können sollen. Im Active Directory müsste dafür die Gruppe „MAIL_support@mycompany.com“ angelegt und den entsprechenden Mitarbeitern zugewiesen werden.
19. November 2009
|||

Hi,
ich hätte gerne die Anbindung ausprobiert, leider lassen sich das jar Archive und die XML-Konfig nicht downloaden.

Dank für diese Fehlermeldung! Wir haben das Problem behoben. Die Dateien lassen sich nun wieder herunterladen.

Vielen Dank,
werde dann mal Testen.

Hallo Niels!

Danke für deine Anleitung!
Sind deine Erweiterungen für Benno auch noch passend zur aktuellen Version 1.1.3?
Muss CAS speziell von (http://www.jasig.org/node/579) herunterladen und auf dem selben System installieren?

Habe bisher Probleme die AD-Integration hinzubekommen :-/
Unter /var/log/tomcat6/catalina.out erhalte ich sehr viele Fehler und die Seite http://HOST:8080/bennosearch/start/ lässt sich auch nicht mehr aufrufen. Der Auszug aus dem Log würde hier den Rahmen sprengen.

Gibt es hier evtl. ein Versions-Problem oder sollte ich auf weitere Dinge achten?
Haben die Erweiterung andere User bereits problemlos zum Laufen bekommen?

Danke Ralf

Nachtrag:

Sorry – eine Bitte: Wäre es möglich noch eine Beispiel-XML-Konfiguration OHNE CAS bereit zu stellen?

Danke für die Mühen! Ralf

Hallo Ralf,

wir haben es noch nicht mit dieser Benno-Version getestet. Allerdings steht das Update auf der Agenda. Dann kann ich dazu mehr sagen und ggf. einen Patch bereit stellen.

Die Konfiguration ohne CAS ist oben unter „Tipps“ beschrieben. Leider kann ich das momentan nicht noch einmal testen.

Viele Grüße,
Niels

Hallo Ralf,

wir haben heute das Benno auf die Version 1.1.3 aktualisiert. Dort funktioniert die Anbindung auch. Lediglich tauchten zwischenzeitlich ClassNotFound Exceptions im Log auf, dass die Klasse org.springframework.security.providers.cas.CasAuthenticationProvider nicht gefunden wurde.

Durch den Download der Lib spring-security-cas-client-2.0.4.jar von [1] und Einpacken ins openbenno.war ließ sich das Problem jedoch schnell lösen. Vielleicht ist das bei dir das selbe Problem?

Viele Grüße,
Niels

1: http://www.docjar.com/jar_detail/spring-security-cas-client-2.0.4.jar.html

Hallo,
super beitrag, nur sind alle Download links des Artikels down. 🙁

Kommentar hinterlassen


Pin It on Pinterest