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