LDAP/SSO Einrichtung

Die folgende Dokumentation gilt für Tomcats, die nicht über Keycloak abgesichert werden.

Architektur

Die B2B-Benutzerverwaltung wurde umgestellt vom Tomcat-Standardmechanismus (BASIC-Authentication, tomcat-users.xml) auf eine mehrstufige Lösung basierend auf Central-Authentication Service (CAS, http://www.jasig.org/cas).

 

Bestehende User-Management Architektur:

 

 

Benutzername und Passwort wurden in der “tomcat-users.xml” gespeichert. Die Pflege erfolgte manuell direkt in der XML-Datei. Die Passworte sind im Klartext abgelegt. Die Anmeldung erfolgt per BASIC-Authentication, dabei werden Benutzername und Passwort Base64-encodiert im http-Header übertragen. Die Zuordnung von Benutzern zu B2B-Rollen wird über das B2B-Frontend gepflegt und in der B2B-Datenbank gespeichert.

 

 

Neue User-Management Architektur:

 

 

Für die B2B-J2EE-Anwendung (b2bbp-engine.war) wird für alle Endbenutzer-URLs in der web.xml ein Servlet-Filter (CAS-Client) vorgeschaltet, der eine Authentifizierung über CAS erzwingt. Sofern kein gültiges Anmelde-Token vorliegt, wird der http-Request vom Servlet-Filter an den CAS-Server umgeleitet. Der CAS-Server ist eine separate J2EE-Applikation (cas.war), die auf dem gleichen Tomcat-Server deployt ist (aber auch auf einem separaten/zentralen Tomcat-Server deployt werden könnte, um von mehreren B2B-Servern verwendet zu werden).

 

Der CAS-Server stellt das Anmelde-Formular zur Eingabe von Benutzername und Passwort dar. Die vom Endbenutzer eingegebenen Anmeldedaten werden zuerst gegen das Active Directory und anschließend gegen eine B2B-Datenbank-Tabelle mit Benutzerdaten geprüft. Nach erfolgreicher Anmeldung stellt der CAS-Server ein Token aus und leitet den http-Request wieder an die ursprünglich gewählte Anwendung (B2B) um.

 

Die Anmeldung an der B2B für URLs, die nicht von Endbenutzern, sondern von anderen Servern aufgerufen werden (z.B. AS2 Kommunikation) erfolgt weiterhin per BASIC Authentication. Die Anmeldedaten werden dabei gegen die B2B-Datenbank geprüft (früher tomcat-users.xml).

Konfigurationsschritte

Voraussetzungen

Die Datenbank-Tabelle B2BBP_ADM_ACCOUNT muss angelegt sein. In dieser Datenbank-Tabelle werden die Benutzerdaten für Datenbank-Benutzer abgelegt: Benutzer-Id, Passwort, Vorname, Nachname, E-Mail. An Stelle des Passworts wird nur ein MD5-Hash gespeichert.

 

Central Authentication Service (CAS)

 

Deployment cas.war

Das Archiv “cas.war” wird im Tomcat-Verzeichnis /webapps abgelegt. Beim nächsten Restart wird das Archiv automatisch unter /webapps/cas entpackt.

 

Setzen des Servernamens cas.properties

In der Datei /webapps/cas/WEB-INF/cas.properties sind Servername und Port  zu pflegen (Full-qualified Domain Name, wie der Endbenutzer den CAS-Server aufruft):

cas.securityContext.serviceProperties.service=http://<b2b-tomcat-domain>:<port>/cas/services/j\_acegi\_cas\_security\_check

cas.securityContext.casProcessingFilterEntryPoint.loginUrl=http://<b2b-tomcat-domain>:<port>/cas/login

cas.securityContext.ticketValidator.casServerUrlPrefix=http://<b2b-tomcat-domain>:<port>/cas

Konfiguration der LDAP- und Datenbank-Anbindung in deployerConfigContext.xml

  • In der Datei /webapps/cas/WEB-INF/deployerConfigContext.xml wird die Art und Weise der Authentifzierung konfiguriert.

  • Verschiedene Konfigurationsformen (Kerberos, LDAP, Datenbank) sind bereits vorbereitet, aber per Kommentar () deaktiviert

  • Unmittelbar nach dem Deployment des “cas.war” ist für Testzwecke ein Authentication-Handler aktiv der lediglich Benutzername und Passwort auf Gleichheit prüft (SimpleTestUsernamePasswordAuthenticationHandler). Dieser Authentication-Handler darf im produktiven Einsatz nicht aktiv sein!

 

Folgender Block ist zu entfernen oder auszukommentieren:

<!-- B2B: simple authentication test (user == password), NOT FOR PRODUCTIVE USE -->

<bean

       class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" >

 

Folgende Authentication-Handler sind für das Szenario LDAP + Datenbank zu verwenden:

(einzufügen im „authenticationHandlers“ Handler)

<!-- B2B: LDAP (Active Directory) -->

<bean class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler">

  <property name="filter" value="sAMAccountName=%u" >

  <property name="searchBase" value="OU=B2B-Users, O=b2b, DC=org" >

  <property name="contextSource" ref="contextSource" >

  <property name="ignorePartialResultException" value="yes" >

</bean>

      

<!-- B2B: Database table B2BBP\_ADM\_ACCOUNT -->

<bean class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler">

  <property name="tableUsers"><value>B2BBP\_ADM\_ACCOUNT</value></property>

  <property name="fieldUser"><value>USERID</value></property>

  <property name="fieldPassword"><value>PASSWORD</value></property>

  <property name="passwordEncoder">

    <bean class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">

      <constructor-arg value="MD5">

    </bean>

  </property>

  <property name="dataSource" ref="dataSource">

</bean>

 

Für den LDAP-Zugriff wird ein technischer Benutzer genutzt: (hinzuzufügen in den äußeren „beans“ Block)

<!-- B2B: LDAP -->

<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">

 <property name="urls">

  <list>

   <value>ldap://<ldap-server-host>:389</value>

  </list>

 </property>

 <property name="userDn" value="CN=b2b\_ldap\_service\_user,OU=ADAM-Users,o=b2b,dc=org">

 <property name="password" value="\*Passwort eintragen\*">

 <property name="baseEnvironmentProperties">

  <map>

   <entry>

     <key>

      <value>java.naming.security.authentication</value>

     </key>

     <value>simple</value>

   </entry>

  </map>

 </property>

</bean>

 

Die Datenbank-Verbindung ist wie folgt zu konfigurieren: (hinzuzufügen in den äußeren „beans“ Block)

 

<!-- B2B: Database -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">

  <property name="driverClassName">

    <value>org.apache.derby.jdbc.ClientDriver</value>

  </property>

  <property name="url">

    <value>jdbc:oracle:oci:@<db-host>:<db-port>:<db\_sid> </value>

  </property>

  <property name="username"><value>dbuser</value></property>

  <property name="password"><value>\*Passwort eintragen\*</value></property>

</bean>

 

 

Anpassung der Login-Maske (Einbindung Kunden-Logo):

  • Die Login-Maske ist in der Datei /webapps/cas/WEB-INF/view/jsp/default/ui/casLoginView.jsp implementiert und verwendet zusätzlich aus dem Unterverzeichnis /includes die “top.jsp” und “bottom.jsp”

  • Kunden-Logo ablegen als /webapps/cas/images/b2b/customer_logo.gif (106x38)

  • Einfügen der roten Zeile in top.jsp (gegebenenfalls width und height anpassen, wenn eine andere Logo-Größe verwendet wird):

<div class="title">

       <h1>B2B by Practice</h1>

</div>

<div style="position:fixed; top:35px; left:400px; width:106px; height:38px; z-index:5; background: url(images/b2b/customer\_logo.gif) no-repeat;"></div>

Konfigurationsänderungen / Logging

Konfigurationsänderungen bzgl. CAS werden jeweils nach dem Restart des Tomcat-Servers aktiv.

Im Standard-Tomcat-Logverzeichnis (/logs) wird ein Logfile “cas.log” erzeugt.

 

Konfiguration Tomcat-Realm

Für die Server-to-Server Kommunikation wird weiterhin der Standard-Tomcat-Security-Mechanismus auf Basis sog. Realms genutzt. Da die Prüfung der Anmeldedaten nicht mehr gegen die tomcat-users.xml erfolgen soll, sondern gegen die B2B-Datenbank, ist in der Datei server.xml folgende Konfigurationsänderung vorzunehmen:

 

Folgender Block ist aus /conf/server.xml zu entfernen (oder auszukommentieren):

<!-- B2B: standard authentication (tomcat-users.xml) -->

<Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase">

Folgender Block ist in /conf/server.xml hinzuzufügen:

<!-- B2B: authentication against database table B2BBP\_ADM\_ACCOUNT -->

<Realm className="org.apache.catalina.realm.DataSourceRealm" debug="99" digest="MD5"

 dataSourceName="jdbc/b2bbp"

 localDataSource="true"

 userTable="B2BBP\_ADM\_ACCOUNT" userNameCol="userid" userCredCol="password"

 userRoleTable="B2BBP\_ADM\_USER" roleNameCol="roleid">          

Anmerkung:

Jede J2EE-Anwendung, die diesen Mechanismus nutzt, muss in Ihrem Context die Datasource “jdbc/b2bbp” definieren.

 

Test-Anwendung /sectest

Zum Test des Authentifizierungsszenarios unabhängig von der B2B wurde die Anwendung /sectest mitgeliefert. Sie ermöglicht die Prüfung, ob die Anmeldung per CAS und BASIC Authentication funktioniert.

 

Folgende Schritte sind für die Einrichtung durchzuführen:

  • Deployment des Archivs “sectest.war”

  • Anpassung Servername und Datenbank-Verbindung in /conf/Catalina/localhost/sectest.xml

  • Auruf: /sectest

 

Nach erfolgreicher Authentifizierung wird der ermittelte Benutzername angezeigt.

 

Anmerkung:

Bei der Anmeldung per BASIC Authentication erfolgt implizit eine Berechtigungsprüfung, ob dem Benutzer die Rolle “b2bbp” zugeordnet ist. Wenn diese Zuordnung in der Datenbank-Tabelle B2BBP_ADM_USER fehlt, so erscheint nach erfolgreicher Prüfung von Benutzername und Passwort die Meldung “403 Not Authorized”. Die Authentifizierung war erfolgreich, die Autorisierung (Berechtigungsprüfung) ist jedoch fehlgeschlagen.

 

B2B

Global Properties

Property

Wert

Beschreibung

B3P_UM_DATABASE_ACTIVE

true

Aktiviert die Verwendung der Datenbank-Tabelle B2BBP_ADM_ACCOUNT als Storage für Benutzerdaten

B3P_UM_LDAP_ACTIVE

true

Aktiviert die Abfrage von Benutzerdaten und Gruppen aus einem LDAP-Verzeichnis

B3P_UM_LDAP_SERVER

ldap.company.org

 

B3P_UM_LDAP_PORT

389

 

B3P_UM_LDAP_BASE_DN

o=b2b,DC=org

Root-Context für den LDAP-Bind

B3P_UM_LDAP_USERS_ROOT_DN

OU=B2B-Users

Root-Context für die Suche nach Benutzern (relativ zu BASE_DN)

B3P_UM_LDAP_GROUPS_ROOT_DN

OU=B2B-Groups

Root-Context für die Suche nach Gruppen (relativ zu BASE_DN)

B3P_UM_LDAP_CONNECTION_USER

CN=b2b_ldap_service_user,OU=ADAM-Users,o=b2b,dc=org

Distinguished Name (DN) des technischen Benutzers im LDAP, mit dem nach Benutzern und Gruppen gesucht wird

B3P_UM_LDAP_CONNECTION_PASSWORD

*********

Passwort des technischen Benutzers

B3P_UM_LDAP_USE_SSL

false

SSL-Verschlüssung zum LDAP (Verzeichnis muss entsprechend vorbereitet sein)

B3P_UM_LDAP_USER_ATTRIBUTE_MAPPING

<nicht verwendet, da Standard Active Directory>

Komma-separierte Liste von Attribut-Mappings für User-Objekte (z.B. loginId=cn,displayName=name)

Default:

- dn = distinguishedName

- loginId = sAMAccountName

- firstName = givenName

- lastName = sn

- displayName = displayName

- email = mail

B3P_UM_LDAP_GROUP_ATTRIBUTE_MAPPING

<nicht verwendet, da Standard Active Directory>

Komma-separierte Liste von Attribut-Mappings für Gruppen-Objekte

Default:

- dn=distinguishedName

- id=cn

- displayName=name

- description=description

B3P_UM_LDAP_GROUP_FILTER

(&(objectClass=group)(cn=B2B*))

LDAP Filter für die Anzeige von LDAP-Gruppen in der B2B-Benutzeradministration

 

Datenbank-Benutzer anlegen

In der B2B-Benutzeradministration (Toolbar “Benutzer und Rollen”) können im Tab “Persönliche Daten” Datenbank-Benutzer angelegt, geändert und gelöscht werden:

 

 

Hier ist speziell der Benutzer “admin” anzulegen.

 

In der Spalte “Benutzer / Gruppen ID” werden alle Datenbank-Benutzer und alle Gruppen aus dem angeschlossenen LDAP angezeigt. LDAP-Gruppen sind durch ein graues Server-Icon gekennzeichnet und können nicht bearbeitet werden.

 

Anpassung CAS-Server-URL in b2bbp-engine.xml

In der Datei /conf/Catalina/localhost/b2bbp-engine.xml muss die URL zur CAS-Anwendung eingetragen werden. Drei Zeilen mit <Environment … > sind wie folgt zu ergänzen:

<Context path="/b2bbp-engine" reloadable="true" crossContext="true">

  <Resource name="jdbc/b2bbp" ... >

                                        

  <Environment description="" name="cas/serverName" override="false" type="java.lang.String" value="http://<b2b-tomcat-domain>:<port>">

  <Environment description="" name="cas/AuthenticationFilter/casServerLoginUrl" override="false" type="java.lang.String" value="http://<b2b-tomcat-domain>:<port>/cas/login">

  <Environment description="" name="cas/Cas20ProxyReceivingTicketValidationFilter/casServerUrlPrefix" override="false" type="java.lang.String" value="http://<b2b-tomcat-domain>:<port>/cas">    

</Context>

b2bbp-engine.war deployen (Build mit “useCasAuthentication=true”)

 

Die B2B (b2bbp-engine.war) muss mit der Build-Option “useCasAuthentication=true” erzeugt worden sein. In dem Fall sind eine geänderte “web.xml” und zusätzliche Bibliotheken (JAR Files) für die Authentifizierung mit CAS enthalten.

 

Zuordnung LDAP-Gruppe zu B2B-Rolle

In der B2B-Benutzeradministration (Toolbar “Benutzer und Rollen”) können im Tab “Benutzer” sowohl Datenbank-Benutzer, als auch LDAP-Gruppen einer B2B-Rolle zugeordnet werden:

 

 

Die LDAP-Gruppe kann dabei aus der Dropdown-Liste ausgewählt oder direkt eingegeben werden. Auf dem Screenshot wurde der LDAP-Gruppe “B2B_LXI_poweruser” die B2B-Rolle “admins” zugeordnet. Dadurch erhalten alle LDAP-Benutzer, die Mitglieder der LDAP-Gruppe “B2B_LXI_poweruser” sind, automatisch die Zuordnung zur B2B-Rolle “admins”.

 

Rolle “b2bbp” für technische Benutzer zuordnen

Technische Benutzer, die von anderen Systemen zum Aufruf der B2B verwendet werden (z.B. für AS2-Kommunikation), muss die B2B-Rolle “b2bbp” zugeordnet sein. Die B2B-Rolle “b2bbp” muss keine Attribute haben. Die Zuordnung ist notwendig, damit die Tomcat-Berechtigungsprüfung für URLs mit BASIC Authentication erfolgreich ist. Hintergrund: Die Rolle “b2bbp” ist in der “web.xml” des “b2bbp-engine.war” als Security-Role definiert.

 

Auf dem obigen Screenshot soll der Benutzer “admin” für die Server-to-Server Kommunikation verwendet werden und hat daher eine Zuordnung zur Rolle “b2bbp”.

 

 

View Me   Edit Me