Anleitung – Einrichtung LDAP Authentifizierung

Einführung

iAGENT verfügt über eine integrierte Benutzerverwaltung. Es ist jedoch möglich, die Authentifizierung über ein externes Identitätsmanagementsystem einzurichten. Dies erfordert einige Konfigurationsschritte, die in diesem Tutorial beschrieben werden.

Kurze Beschreibung der Konfiguration in iAGENT

Über Systemparameter (Administration –> System –> Systemeinstellungen –> Registerkarte Systemparameter) müssen die folgenden Parameter hinzugefügt/angepasst und die Werte entsprechend der Umgebung festgelegt werden. Alternativ kann auch die Datei Routing.conf im Dateisystem des iAGENT-Webservers angepasst werden.

external.auth.enabled = true
external.auth.agent.enabled = true
external.auth.routing.enabled = true
external.auth.user.auth.class = com.novomind.ecom.common.auth.ldap.ADLDAPAuthenticator
external.auth.ldap.enabled = true
external.auth.ldap.servers = [{url:„ldaps://xxx.novomind.com“, domains:[novomind.com], pagesize.max: 234, timeout.connect: 1000 , timeout.read: 2000},{url:„ldaps://xxx2.novomind.com“, domains:[novomind.com], pagesize.max: 234, timeout.connect: 1000 , timeout.read: 2000},{url:„ldaps://xxx3.novomind.com“, domains:[novomind.com], pagesize.max: 234, timeout.connect: 1000 , timeout.read: 2000}]
external.auth.ldap.user.properties.read = false

Bei entsprechender Konfiguration dieser Parameter werden der eingegebene Benutzername und das Passwort bei der Anmeldung zur Authentifizierung gegenüber dem externen System verwendet.

Für Zugriffe mit Systembenutzern (z. B. aus Apps oder REST API) muss beim entsprechenden Benutzer (Registerkarte „Individuelle Einstellungen“ in den Benutzereinstellungen“) einer der folgenden Schlüssel auf den Wert DB gesetzt werden:

  • auth.type (für die Anmeldung bei Supervisor und Desk)
  • auth.type.agent (für die Anmeldung bei Desk)
  • auth.type.user (für die Anmeldung bei Supervisor)

Authentifizierung mit einem Active Directory-Server

Funktionsweise

Die Authentifizierung verwendet einen Active Directory-Server, um einen Benutzer bei der Anmeldung zu authentifizieren.

Dazu wird das AD über LDAP/LDAPS angesprochen und ein Connect/Bind mit dem entsprechenden Benutzer versucht. Ist die Verbindung erfolgreich, gilt der Benutzer als authentifiziert. Auf Wunsch kann auch geprüft werden, ob der Benutzer in einer oder mehreren Gruppen im AD gespeichert ist. Wird eine Prüfung durchgeführt und der Benutzer ist in keiner konfigurierten Gruppe vorhanden, gilt der Benutzer als nicht authentifiziert.

Darüber hinaus ist es möglich, Eigenschaften des Benutzers aus dem AD auszulesen und diese mit dem Benutzer zu speichern.

Hierzu ist allerdings ein „search“-Benutzer notwendig, der die entsprechenden Rechte im AD hat.

Es können mehrere AD-Server für die Authentifizierung verwendet werden, so dass z. B. ein Fallback-Szenario konfiguriert werden kann. Auch die Unterstützung der Registrierung in mehreren Domänen ist möglich.

Alle Konfigurationsänderungen werden sofort oder kurz danach zur Laufzeit wirksam.

Installation

Damit die eine Authentifizierungsklasse hinterlegt werden kann, muss ein kundenspezifischer Authentifizierungsfilter für den Kunden hinterlegt werden.

Konfiguration

Die Konfiguration der Authentifizierung wird in der zentralen Konfigurationsdatei „Routing.conf“ gespeichert.

Die folgenden Konfigurationsparameter sind relevant:

Parameter „external.auth.enabled“ -> Aktiviert den AuthFilter, sodass eine externe Authentifizierung verwendet werden kann.

Sollte auf den folgenden Wert gesetzt werden:

external.auth.enabled = true

– „external.auth.agent.enabled“-Parameter -> Aktiviert/deaktiviert (true/false) die Registrierung beim Agenten über externe Authentifizierung.

external.auth.agent.enabled = true

– „external.auth.agent.enabled“-Parameter -> Aktiviert/deaktiviert (true/false) die Anmeldung beim Supervisor über externe Authentifizierung.

external.auth.routing.enabled = true

– „external.auth.user.auth.class“ -> Legt die Klasse fest, die für die Authentifizierung verwendet werden soll. Im Falle einer AD-Authentifizierung:

external.auth.user.auth.class = com.novomind.ecom.common.auth.ldap.ADLDAPAuthenticator

– „external.auth.ldap.enabled“ -> Aktiviert/deaktiviert die AD-LDAP-Authentifizierung.

external.auth.ldap.enabled = true

– „external.auth.ldap.servers“ -> Mit diesem Parameter können die zu verwendenden Server konfiguriert werden. Die Konfiguration erfolgt in JSON-Notation. Die einzelnen Parameter werden im Folgenden näher erläutert. Die Konfiguration für zwei AD-Server sieht beispielsweise so aus:

external.auth.ldap.servers = [{url:'ldap://10.22.102.77', domains:[novomind.de, novomind.com], username: 'administrator', password: 'xxx', pagesize.max: 234, timeout.connect: 234 , timeout. read: 234},{url:\'ldap://10.21.102.77\', domains:[products.novomind.com], username: 'administrator', password: 'xxx', pagesize.max: 234, timeout.connect: 234 , timeout.read: 234}]

– ‚external.auth.ldap.user.properties.read‚ -> Dieser Parameter legt fest, ob nach der Authentifizierung die Benutzereigenschaften vom LDAP-Server gelesen werden sollen.

Der Standardwert ist ‚false‘. Diese Eigenschaften werden z. B. beim Anlegen oder Aktualisieren von Benutzern benötigt (Schlüsselwort UserModifyClone).

external.auth.ldap.user.properties.read = true

– „external.auth.ldap.groups.routing“ -> Es können Gruppennamen (LDAP NameInNameSpace cn=<Gruppenname>…) hinterlegt werden, in denen ein Benutzer sein muss, um sich beim Supervisor anmelden zu dürfen. Ist der Parameter nicht gesetzt oder leer, wird keine Gruppenprüfung durchgeführt.

external.auth.ldap.groups.routing = [Gruppe1, Supervisoren, Gruppe2]

– „external.auth.ldap.groups.agent“ -> Hier können Gruppennamen (LDAP-Name im Namensraum cn=<Gruppenname>…) hinterlegt werden, in denen ein Benutzer sein muss, um sich am Agenten anmelden zu dürfen. Ist der Parameter nicht gesetzt oder leer, wird keine Gruppenprüfung durchgeführt.

external.auth.ldap.groups.agent = [Agentengruppe 1, „Agentengruppe 2“]

– ‚external.auth.ldap.user.domain.preserve‚ -> Mit diesem Parameter kann gesteuert werden, ob die bei einer Anmeldung verwendete Domain (z. B. User@example.com) verworfen werden soll oder ob sie dem Benutzernamen entspricht. Standardmäßig wird die Domain nach einer Anmeldung verworfen und dient nur zur Ermittlung des AD-Servers. Dadurch wird verhindert, dass bei einer Anmeldung alle AD-Server „ausprobiert“ werden. In diesem Fall wäre der Benutzername des angemeldeten Benutzers „User“. Ist der Parameter auf true gesetzt, wird der gesamte bei der Anmeldung verwendete Benutzername verwendet.

external.auth.ldap.user.domain.preserve = false

LDAP-Server-Konfiguration

Die Konfiguration der Anmeldeserver erfolgt über den Parameter „external.auth.ldap.servers“. Dort können mehrere Server in JSON-Notation definiert werden, die

je nach Anmeldung verwendet werden. Folgende Parameter können für jede Serverkonfiguration hinterlegt werden:

– Parameter „url“ (erforderlich) -> Hier wird die URL hinterlegt, über die auf den LDAP-Server zugegriffen wird. Es kann auch ein Port angegeben werden, wenn dieser vom Standardport für das entsprechende Protokoll abweicht. Beispiele:

  • url:„ldaps://ad.example.com“
  • url:„ldap://ad.example.com“
  • url:„ldaps://ad.example.com:965“

– Parameter „domains“ (erforderlich) -> Gibt die vom AD-Server verwalteten Domänen an. Bei Anmeldeversuchen wird die entsprechende Domäne an den Benutzernamen angehängt, wenn die Anmeldung ohne Domäne erfolgt ist.

domains:[rz.example.com, intern.example.com]

– Parameter „username“ (optional) -> Definiert den Benutzernamen des AD-Benutzers, der für eine Suche im LDAP verwendet werden kann (z. B. zum Lesen der Benutzereigenschaften).

username: „search-ad“

– Parameter „password“ (optional) -> Definiert das Passwort für den AD-Benutzer, das für eine Suche im LDAP verwendet werden kann (z. B. zum Lesen der Benutzereigenschaften).

Das Passwort kann verschlüsselt oder unverschlüsselt gespeichert werden.

Passwort: „xxx“

– „pagesize.max“-Parameter: Dieser definiert den maximalen Wert, den eine Suche zurückgeben darf. Bei größeren Werten wird Paging verwendet. Normalerweise kann ein LDAP-Server 1000 Ergebnisse für eine einzelne Anfrage zurückgeben. Dies ist auch der Standardwert.

pagesize.max: 500

– „timeout.connect“-Parameter -> Legt fest, wie lange das System auf eine Verbindung zu einem Server wartet (in Millisekunden). Der Standardwert beträgt 500 ms.

timeout.connect: 500

– „timeout.read“-Parameter -> Legt fest, wie lange auf ein Suchergebnis gewartet wird (z. B. Gruppensuche, Suche nach Benutzereigenschaften). Der Standardwert beträgt 30000 ms.

timeout.read: 30000

Serverkonfiguration für ein Fallback-Szenario für die Domain „example.com“

Die LDAP-Anmeldung kann so konfiguriert werden, dass beispielsweise zwei Server für die Authentifizierung bei einer Domain verwendet werden.

In diesem Fall würde sich der Benutzer zuerst beim ersten Server und dann, im Falle eines Netzwerkfehlers (z. B. ConnectTimeout), beim zweiten Server anmelden.

Wenn der erste Server erreichbar ist und die Benutzerauthentifizierung fehlschlägt, wird der zweite Server nicht aufgerufen.

In diesem Fall würde eine einfache Konfiguration wie folgt aussehen:

external.auth.ldap.servers= [{url:'ldap://ad1.example.com', domains:[example.com]}, {url:'ldap://ad2.example.com', domains:[example.com]}}

Serverkonfiguration für ein Szenario mit mehreren Domänen

Erfolgt die Anmeldung an mehreren Domänen und mehreren AD-Servern, kann die Domäne an den Benutzernamen in der Anmeldemaske angehängt werden, z. B., wenn der Benutzername sie nicht bereits enthält (siehe auch Parameter „external.auth.ldap.user.domain.preserve“). Bei der Auswahl des zu verwendenden Authentifizierungsservers wird die übertragene Domäne berücksichtigt, damit keine unnötigen Anmeldungen bei anderen AD-Servern erfolgen.

Achtung:
Zu beachten ist, dass wenn am Benutzernamen keine Domäne angegeben ist (Benutzername statt Benutzername@Domäne) , die Anmeldung mit diesem Benutzer auf allen Domänen nacheinander ausprobiert wird. Schlägt der Login auf der ersten Domäne fehl, so wird die Anmeldung auf der nächsten Domäne probiert. Hierbei kommt es dann zwangsläufig zu gescheiterten Anmeldeversuchen, die Aufsehen bei der hauseigenen IT Security erregen könnten.

Eine einfache Konfiguration mit zwei Domänen und keinem Fallback-Server würde wie folgt aussehen:

external.auth.ldap.servers= [{url:'ldap://ad1.example.com', domains:[ad1.example.com]}, {url:'ldap://ad2.example.com', domains:[ad2.example.com]}}

Automatische Benutzererstellung in iAGENT

Nach einer erfolgreichen Anmeldung mit einem LDAP-Benutzer, der noch nicht in iAGENT existiert, kann mit der folgenden Einstellung sichergestellt werden, dass der Benutzer dann auch automatisch im iAGENT-System angelegt wird. Dies geschieht ohne Zuweisung von Rollen und Rechten. Der Benutzer kann sich daher noch nicht anmelden, aber der Supervisor sieht den Benutzer und muss nur die entsprechenden Rollen zuweisen.

ldap.autoCreateUser = true

UserModifyClone

Allgemein

Die Klasse UserModifyClone kann verwendet werden, um einen Benutzer zu erstellen/ändern, wenn eine externe Authentifizierung verwendet wird (z. B. LDAP oder SAML). Der zum Klonen zu verwendende Benutzer und die zu speichernden Daten

können konfiguriert werden. Wenn beispielsweise der Name und die E-Mail-Adresse während der Authentifizierung übergeben werden, können diese während der Registrierung aktualisiert werden. Es ist auch möglich, benutzerspezifische Eigenschaften (UserProperties) zu speichern/aktualisieren.

Voraussetzungen

Um die Klasse UserModifyClone nutzen zu können, müssen Sie die externe Authentifizierung und den dazugehörigen kundenspezifischen Authentifizierungsfilter verwenden.

Derzeit stehen folgende Implementierungen der externen Authentifizierung zur Verfügung:

– com.novomind.ecom.common.auth.ldap.ADLDAPAuthenticator (Anmeldung über LDAP an einen ActiveDirectory Server)

– com.novomind.ecom.saml.Authenticator (Anmeldung an einem IdentityProvider über das SAML-Protokoll – SSO)

Funktionsweise

Bei erfolgreicher externer Authentifizierung wird ein Benutzer (Agent/Vorgesetzter) angelegt, sofern konfiguriert.

Es ist möglich, verschiedene Standard-Vorlagenbenutzer für die Erstellung eines Agenten und eines Vorgesetzten zu konfigurieren.

Wenn bei der Registrierung auch ein Mandant übergeben wird, kann dies auch genutzt werden, um für jeden Mandanten einen anderen Vorlagenbenutzer zu verwenden.

Aus der Registrierung erhaltene Eigenschaften (Name, E-Mail, Kostenstelle, Vorname, Nachname) können genutzt werden, um den Benutzer im iMail-System zu aktualisieren. Welche Eigenschaften aktualisiert werden, wird durch die Konfiguration bestimmt.

KonfigurationBenutzer anlegenDie Konfiguration erfolgt in der Konfigurationsdatei „Routing.conf“. Dabei spielen folgende Parameter eine Rolle:- „external.auth.user.modify.class“ -> Dieser Parameter definiert die Klasse, die zum Anlegen/Ändern eines Benutzers verwendet werden soll. Standardmäßig ist dies die folgende Klasse:

 

external.auth.user.modify.class = com.novomind.ecom.auth.modify.UserModifyClone

– „external.auth.user.modify.clone.enabled“ -> Kann zum Aktivieren/Deaktivieren (true/false) des Klonens/Modifizierens eingestellt werden.

Wenn der Parameter nicht eingestellt ist, ist das Klonen/Modifizieren nicht aktiv. Der folgende Wert sollte eingestellt werden:

external.auth.user.modify.clone.enabled = true

– „external.auth.user.modify.clone.routing.enabled“ -> Kann zum Aktivieren/Deaktivieren (true/false) des Klonens/Modifizierens für eine Supervisor-Anmeldung verwendet werden. Wenn der Parameter nicht festgelegt ist, ist das Klonen/Modifizieren nicht aktiv. Der folgende Wert sollte festgelegt werden:

external.auth.user.modify.clone.routing.enabled = true

– „external.auth.user.modify.clone.routing.user“ -> Definiert den Benutzer, der als Vorlage für die Erstellung eines Supervisor-Benutzers verwendet wird.

Der Benutzername eines im iAGENT-System konfigurierten Benutzers wird gespeichert.

external.auth.user.modify.clone.routing.user = svcloneuser

– „external.auth.user.modify.clone.routing.mandator.mapping“ -> Wenn ein Kunde im iMail-System durch die Anmeldung/Authentifizierung bestimmt werden kann

(normalerweise ist nach der Anmeldung kein Kunde verfügbar), kann dies verwendet werden, um den Vorlagenbenutzer für das Klonen zu bestimmen. Es kann entweder der Name des Kunden oder die ID im iAGENT-System verwendet werden. Wenn hier kein Benutzer ermittelt werden kann, wird der durch den Parameter „external.auth.user.modify.clone.routing.user“ definierte Benutzer verwendet.

external.auth.user.modify.clone.routing.mandator.mapping = {Mandator1:svuser1, 21:svuser2}

– „external.auth.user.modify.clone.agent.enabled“ -> Kann zum Aktivieren/Deaktivieren (wahr/falsch) des Klonens/Modifizierens während der Anmeldung eines Agenten festgelegt werden. Wenn der Parameter nicht festgelegt ist, ist das Klonen/Modifizieren nicht aktiv, wenn sich ein Agent anmeldet. Der folgende Wert sollte festgelegt werden:

external.auth.user.modify.clone.agent.enabled = true

– „external.auth.user.modify.clone.agent.user“ -> Definiert den Benutzer, der als Vorlage für die Erstellung eines Agentenbenutzers verwendet wird.

Der Benutzername eines im iAGENT-System konfigurierten Benutzers wird gespeichert.

external.auth.user.modify.clone.agent.user = agentcloneuser

– „external.auth.user.modify.clone.agent.mandator.mapping“ -> Wenn ein Kunde im iAGENT-System durch die Anmeldung/Authentifizierung bestimmt werden konnte (normalerweise ist nach der Anmeldung kein Kunde verfügbar), kann dies verwendet werden, um den Vorlagenbenutzer für das Klonen zu bestimmen. Es kann entweder der Mandantenname oder die ID im iAGENT-System verwendet werden.

Wenn hier kein Benutzer ermittelt werden kann, wird der durch den Parameter „external.auth.user.modify.clone.agent.user“ definierte Benutzer verwendet.

external.auth.user.modify.clone.agent.mandator.mapping = {Mandator1:agentuser1, 21:agentuser2}

– „external.auth.user.modify.email.generate“ -> Wenn die Erstellung eines Benutzers fehlschlägt, weil eine E-Mail-Adresse bereits verwendet wird, wird durch das Festlegen dieses Parameters die Generierung einer zufälligen E-Mail-Adresse ausgelöst.

Hierbei handelt es sich um E-Mail-Adressen aus der nicht vorhandenen Domain „example.com“. Diese Funktion ist standardmäßig nicht aktiviert.

external.auth.user.modify.email.generate = false

Konfiguration: Ändern/Aktualisieren eines Benutzers

– „external.auth.user.modify.properties.enabled“ -> Schaltet das Ändern/Aktualisieren eines Benutzers ein/aus (false/true).

Wenn nicht festgelegt, ist die Funktion deaktiviert. Der folgende Wert sollte festgelegt werden:

external.auth.user.modify.properties.enabled = true

– „external.auth.user.modify.properties.mapping“ -> Dieser Parameter kann verwendet werden, um eine Zuordnung für Parameter zu speichern, die durch Authentifizierung erhalten wurden. Dadurch können Parameter, die durch Authentifizierung erhalten wurden, unter einem anderen Namen gefunden werden. Eine Zuordnung ist für Parameter erforderlich, die später unter einem anderen Namen als Benutzereigenschaft festgelegt werden sollen. Die Zuordnung kann auch verwendet werden, um beispielsweise die E-Mail-Adresse (Schlüssel „E-Mail“) zu ermitteln. Der Wert des Parameters ist in JSON-Notation angegeben.

external.auth.user.modify.properties.mapping = {email: 'mail', displayname: 'displayName', AD_FirstName: 'givenName', AD_LastName: 'sn', AD_Surname: 'sn', AD_Surname: 'sn', AD_UserPrincipalName ' , AD_DisplayName: 'displayName' , AD_CostCenter: 'costCenter"}

– „external.auth.user.modify.properties.names“ -> Definiert die Parameter, die als Eigenschaften für den Benutzer gespeichert werden sollen.

Diese Eigenschaften müssen unter diesem Namen entweder direkt über die Authentifizierung oder durch Zuordnung zu einem anderen Parameter, der über die Authentifizierung erhalten wurde, abgerufen werden.

external.auth.user.modify.properties.names = [AD_First name, AD_Last name, AD_User ID, AD_Display name, AD_Cost centre]

– „external.auth.user.modify.update.email“ -> Legt fest, ob die E-Mail-Adresse des Benutzers aktualisiert werden soll.

Hierfür wird die Eigenschaft „email“ verwendet. Diese muss möglicherweise durch die Zuordnung bereitgestellt werden.

external.auth.user.modify.update.email = true

– „external.auth.user.modify.update.name“ -> Legt fest, ob der Name (nicht der Benutzername) des Benutzers aktualisiert werden soll.

Hierfür wird die Eigenschaft „displayname“ verwendet. Diese muss möglicherweise durch das Mapping bereitgestellt werden.

Wenn die Eigenschaft „displayname“ nicht verfügbar ist, wird versucht, die Eigenschaften „firstname“ und „lastname“ zu verwenden.

external.auth.user.modify.update.name = true