OTRS: LDAP-Authentifizierung, Autorisierung und Synchronisation (FreeIPA, AD)

Bild

OTRS ist ein in Perl geschriebenes Open-Source-Ticketanforderungssystem.

Es gibt zwei Möglichkeiten:


Ich werde einige der Funktionen auflisten , die dieses System unterstützt:

  • ITSM-Modul (Service Level Management, Änderungsmanagement, Konfigurationsmanagement, CMDB)
  • reaktionsschnelle Weboberfläche
  • API
  • SLA und Dienstleistungen
  • mandantenfähig
  • Eskalationen
  • Authentifizierung: DB, LDAP, HTTPBasicAuth, Radius
  • unterstützen MySQL, MariaDB, PostgreSQL, Oracle

Und wenn Sie nach Fehlern suchen, ist dies eine ungewöhnliche Oberfläche und Komplexität bei der Einrichtung. Unter dem Strich - über die Grundlagen der Autorisierung (Gruppen, RBAC, Unterstützung für mehrere Client-Unternehmen), Authentifizierung und Metadatensynchronisation (Name, Telefon usw.) unter Verwendung verschiedener LDAP-Verzeichnisse

Clients, Warteschlangen, Agenten und Gruppen


Nach der Installation von OTRS haben Sie sofort Zugriff auf:

  • Kunden - können Anwendungen erstellen, indem sie einen Brief senden oder den Webzugriff verwenden
  • Warteschlangen - Jede Anwendung fällt in eine der Anwendungswarteschlangen
  • Agenten - IT-Experten, die an der Ausführung von Anwendungen aus den ihnen zur Verfügung stehenden Warteschlangen arbeiten
  • Gruppen - eine Entität, die Warteschlangen, Clients und Agenten verbindet und auch die Rechte von Agenten festlegt - z. B. schreibgeschützt, Ändern der Priorität einer Anwendung usw.

Bild

Standardgruppen


Nach der Installation des Systems werden drei erstellte Gruppen angezeigt:

  • admin - Gruppenmitglieder können OTRS verwalten (konfigurieren)
  • Statistiken - die Möglichkeit, Berichte anzupassen und auszuführen
  • Benutzer - eine Standardgruppe für Clients, Warteschlangen und Agenten

Gruppenbezogene Rechte


Grundrechte


Die Hauptrechte, die in einer Gruppe konfiguriert werden können, die Agentenaktionen einschränken:

  • Nur-Lese- Lese-Rechte in der Anwendung in dieser Gruppe / Warteschlange
  • move - Rechte zum Verschieben von Anforderungen in diese Gruppe / Warteschlange
  • Erstellungsrechte zum Erstellen von Anwendungen in dieser Gruppe / Warteschlange
  • note - Rechte zum Hinzufügen von Notizen zu Anwendungen in dieser Gruppe / Warteschlange
  • Eigentümer - Rechte zum Ändern des Eigentümers von Anwendungen in dieser Gruppe / Warteschlange
  • Priorität - Rechte zum Ändern der Priorität von Anwendungen in dieser Gruppe / Warteschlange
  • Lese- / Schreibzugriff - Vollständige Lese- und Schreibberechtigungen für Anforderungen in dieser Gruppe / Warteschlange

Zusätzliche Rechte


Es gibt auch zusätzliche Rechte, deren Anzeige in den Einstellungen aktiviert werden kann (System :: Permission):

  • Berichte - Ermöglicht den Zugriff auf die Berichtsseite
  • Weiterleiten - das Recht, die E-Mail-Nachricht umzuleiten / zu bouncen (Link zum Weiterleiten / Bouncen in ticketZoom)
  • create - das Recht, eine Antwort auf die Anwendung zu erstellen
  • Kunde - das Recht, den Kunden für diese Anwendung zu ändern
  • weiterleiten - das Recht, Nachrichten weiterzuleiten (über die Schaltfläche Weiterleiten)
  • ausstehend - das Recht, den Antrag ausstehend zu übertragen
  • Telefon - das Recht, den Inhalt des Kundenanrufs in Form einer Nachricht / Notiz zur Anwendung hinzuzufügen
  • Verantwortlich - Das Recht, die für den Antrag verantwortliche Person zu ändern

Betrachten Sie dies genauer:

  • Jeder Client kann in eine oder mehrere Gruppen aufgenommen werden. Zunächst sind alle Clients Mitglieder der Benutzergruppe
  • Jede Bestellwarteschlange ist einer der Gruppen zugeordnet
  • Über die Weboberfläche kann der Client Anforderungen in den Warteschlangen stellen, auf die Gruppen, in denen er enthalten ist, Zugriff haben
  • Wenn ein Kunde eine Anfrage per E-Mail sendet, ist es möglich, basierend auf einer Analyse der Attribute des Briefes (z. B. der Adresse des Absenders oder des Titels des Briefes) die Eigenschaften der Anwendung zu ändern, einschließlich der Warteschlange, in die die Anwendung fällt
  • Wenn der Client telefonisch anruft, kann der Agent eine Anwendung manuell erstellen, indem er eine der Warteschlangen auswählt, die dem Agenten zur Verfügung stehen
  • Es ist wünschenswert, dass sich die Anwendung des Clients immer in den Warteschlangen befindet, die dem Client zur Verfügung stehen. Andernfalls kann er nicht über die Weboberfläche darauf zugreifen
  • Agenten können Aktionen in Anwendungen gemäß den Rechten an der Warteschlange ausführen, in der sich die Anwendung befindet

Bild

Datenbankauthentifizierung


Die Standardmethode zum Authentifizieren und Autorisieren von Agenten und Clients ist eine Datenbank.

Das Festlegen der Agentenauthentifizierung mithilfe einer Datenbank sieht beispielsweise folgendermaßen aus:

$Self->{'AuthModule'} = 'Kernel::System::Auth::DB'; 

Kunden:

 $Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::DB'; $Self->{'Customer::AuthModule::DB::Table'} = 'customer_user'; $Self->{'Customer::AuthModule::DB::CustomerKey'} = 'login'; $Self->{'Customer::AuthModule::DB::CustomerPassword'} = 'pw'; 

Wir werden diese Authentifizierungsmethode auch verlassen und zusätzlich die Authentifizierung über LDAP hinzufügen.

Rollen und Unternehmen


Wir werden auch die Autorisierungsfunktionen erweitern, indem wir Rollen und Unternehmen hinzufügen:

  • Rollen - Ermöglichen eine flexiblere Zugriffssteuerung durch Verbinden von Gruppen und Agenten
  • Unternehmen - Ermöglichen das Isolieren von Anwendungen verschiedener Kunden (ob es sich um verschiedene Abteilungen oder Unternehmen handelt).

Bild

Erklärung des Problems


Sie sind der Administrator des OTRS-Systems bei my-it-company.com, einem Unternehmen, das Dienstleistungen für andere Unternehmen (oder Einheiten in Ihrem Betrieb) erbringt.

Sie möchten wirklich keine neuen Agenten- und Kundenkonten manuell erstellen und keine zusätzlichen Informationen wie E-Mail-Adresse, Telefonnummer, Position, Adresse und Schranknummer eingeben - schließlich befindet sich dies bereits in den LDAP-Verzeichnissen.

Und Ihr Unternehmen erhält auch offensichtliche Vorteile: Ein einziges Mitarbeiterpasswort in allen Systemen und das Sperren eines Kontos in LDAP blockieren den Zugriff auf alle anderen Dienste.

my-it-company.com läuft unter Linux und verwendet Red Hat FreeIPA als Verzeichnisserver. Die von Ihnen bedienten Abteilungen verwenden verschiedene Microsoft Active Directory-Gesamtstrukturen, mit denen Sie keinen Verbund haben, aber eine Verbindung zu Domänencontrollern herstellen können.

Sie müssen Anwendungsflüsse von verschiedenen Clients trennen und verschiedene Ebenen des Agentenzugriffs auf Warteschlangen implementieren. Manager sollten in der Lage sein, die Priorität von Aufgaben im System zu ändern.

Mitarbeiter Ihres Unternehmens können im System auch Aufgaben für die internen Anforderungen von my-it-company.com festlegen . Manchmal sind sie gleichzeitig Agenten und Kunden (und manchmal auch nicht).

Bild

Vorbereitung


Konten zum Anzeigen von LDAP


Wenn das anonyme Durchsuchen des Verzeichnisbaums verboten ist, erstellen wir Konten in den Domänen my-it-company.com , pear.com und macrohard.com , für die wir über ausreichende Rechte verfügen, um LDAP-Abfragen durchzuführen ( nennen wir sie beispielsweise ldap-bot).

FreeIPA-Gruppen zur Synchronisierung mit OTRS-Rollen


In FreeIPA werden drei Benutzergruppen erstellt, die mit unseren OTRS-Rollen synchronisiert werden. Beispiel:

  • otrs-sa - Mitglieder dieser Gruppe erhalten Zugriff auf die OTRS-Verwaltung, aber wir gewähren keinen Zugriff auf Warteschlangen, sodass wir nicht immer unter dem Administrator arbeiten möchten.
  • otrs-admins - unsere Manager mit dem Recht, die Priorität von Anwendungen zu ändern) und
  • otrs-helpdesk - unsere Fachkonten

Firmenattribut


Wählen Sie das Attribut, anhand dessen wir die Zugehörigkeit zum Unternehmen bestimmen. Sei es das Attribut "Organisation". Zum Beispiel hat sich alles organisatorisch und technisch herausgestellt, und alle Benutzer in allen Domänen haben immer einen Wert im Feld "Organisation":

  • my-it-company - für Mitarbeiter von my-it-company.com
  • birnenfirma - für mitarbeiter von pear.com
  • macrohard-company - für Mitarbeiter von macrohard.com

Definieren Sie die von FreeIPA verwendeten Benutzerattribute


Wir untersuchen das FreeIPA-Schema und ermitteln die Namen der Attribute, die für die Synchronisierung benötigt werden (Name, Login, Telefon usw.).

 kinit laptevs ipa user-show --all --raw laptevs 

Wir kommen zu einem ähnlichen Ergebnis:
dn: uid = laptevs, cn = Benutzer, cn = Konten, dc = my-it-company, dc = com
uid: laptevs
Vorname: Stanislav
sn: Laptev
cn: Laptev Stanislav
Initialen: SL
Heimatverzeichnis: / home / laptevs
Gecos: Laptev Stanislav
Loginshell: / bin / sh
krbcanonicalname: laptevs@MY-IT-COMPANY.COM
krbprincipalname: laptevs@MY-IT-COMPANY.COM
mail: laptevs@MY-IT-COMPANY.COM
UID-Nummer: 1344600003
gidnumber: 1344600003
l: Moskau
Telefonnummer: +7 (863) 999-99-99
Mobil: +7 (999) 999-99-99
ou: my-it-company
Titel: SysAdm
sshpubkeyfp: SHA256: Yi8mKF + j28 / r2cpxLgIbvZ / Oymt57rhliHKhqBuJxqE laptevs-putty (ssh-rsa)
nsaccountlock: FALSE
has_password: TRUE
has_keytab: TRUE
Anzeigename: Laptev Stanislav
ipaSshPubKey: c3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBQkpRQUFBZ0VBNjQ1RTJjSjIvWXVVYm9GNzdZY3hLNzBndm1jWlgrZjBZTVpsaXRQVXNCWFZ0cENtTEtwcjRwK2JEeUdhRzNLTWx1T08ydW9wS0pXRk9mWE83Zzl3OTYzdklQblN3MzVHSmI3VGhhbk1pTXpNUE82T1lQZEY0em14b2k4N 0RGYkdXV2V6aGwzcitsbmFGYTB0dEQ5TkFWRU1Fb3BMdmkzcHZ1UXpyVmNjVlMxamFxY1dNT2ZGUC9TRlVoY1dGeVpZd3Z6eW0wWnZObUZtdjVjVHJGNzJMSXZOdHlsNkZGK2ZaU3ZpS01mcXZ6NStkT2xZZGd5bVVSOG5iaVpkTXZKaTIvbzhjTy84ekpoMFhtSnVRSjJXNEVvYVEvajVTTm8ySjZ6NklXNk I3cFB4Y002a0tJcUp5N08zTkNOcGRrVmVQbEFHbThsOFZDREpVa1RLSjRGOS9mSTZFUkhxVUZwK3p1VENTR1R3ZWlKdXppenFSZWJTTkNiMXh3RldmUitvYzFLdWNZSU5QbTYxRi93YXhOcC9aSG9OK2w1dCtkYWI4cElZSGZzTnNUNWx2RWt4Ukh0bnNyeUxsbWk1ZVdzd3RBbDB3TUpWd1cvUWNJcjhOaVN Ybm96Q3dHWTZCaTQ2L0FGTGVidmFLV0tKRmpKZFgxOFlRVDRpVzZGaE83aW40TGlUamlNaENXbStvbjNQbERYeXZpdkJ1WkFXUldXNEdjbXREVW8rSVhZT2t3MWh3UldqdkJtcExHMVZpMFhPckltbmQybTVZdWk1bHo0b1ZlekFRN1NjYVlrdDBoVEdQU1Z2UHpmVlowYWJCQlpiRmViK1hUV2tpSnBPMHBO T3dodGNadHYrN3RMMnc1OFN3QnhVTUk4NzUzdG5Sc1h1blBXZERqcUsxSDA9IGxhcHRldnMtcHV0dHk =
ipaUniqueID: 68d46dac-1d3c-11e9-82fd-0242ac110002
krbExtraData: AAL4VkVcbGFwdGV2c0BPTUlLUk9OLlBSTwA =
krbLastFailedAuth: 20190123084142Z
krbLastPwdChange: 20190121052200Z
krbLoginFailedCount: 0
krbPasswordExpiration: 20190421052200Z
Mitglied von: cn = otrs-admins, cn = Gruppen, cn = Konten, dc = my-it-company, dc = com
Mitglied von: cn = ipausers, cn = Gruppen, cn = Konten, dc = my-it-company, dc = com
mepManagedEntry: cn = laptevs, cn = Gruppen, cn = Konten, dc = my-it-company, dc = com
objectClass: top
objectClass: Person
objectClass: Organisationsperson
objectClass: inetorgperson
objectClass: inetuser
objectClass: posixaccount
objectClass: krbprincipalaux
objectClass: krbticketpolicyaux
objectClass: ipaobject
objectClass: ipasshuser
objectClass: ipaSshGroupOfPubKeys
objectClass: mepOriginEntry

dn : uid = laptevs, cn = Benutzer, cn = Konten, dc = my-it-company, dc = com
uid : laptevs
Vorname : Stanislav
sn : Laptev
cn : Laptev Stanislav
mail : laptevs@MY-IT-COMPANY.COM
l : Moskau
Telefonnummer : +7 (863) 999-99-99
Mobil : +7 (999) 999-99-99
ou : my-it-company
Titel : SysAdm

Konfigurieren Sie OTRS


Konfigurationsdateien


  • / opt / otrs / - In der Regel befinden sich hier OTRS-Systemdateien
  • Kernel / Config.pm - Konfigurationsdatei, die Sie bearbeiten
  • Kernel / Config / Defaults.pm - Eine Datei mit Standardeinstellungen. Sie können sie nicht bearbeiten, aber darin können Sie alle vorhandenen Parameter und Kommentare dazu sehen

Agent-Setup


Agentenauthentifizierung


  # --------------------------------------------------- # # Agents authentication # # --------------------------------------------------- # # my-it-company.com LDAP backend $Self->{AuthModule} = 'Kernel::System::Auth::LDAP'; #  LDAP- $Self->{'AuthModule::LDAP::Host'} = 'my-it-company.com'; $Self->{'AuthModule::LDAP::BaseDN'} = 'dc=my-it-company,dc=com'; $Self->{'AuthModule::LDAP::UID'} = 'uid'; #  ,        $Self->{'AuthModule::LDAP::SearchUserDN'} = 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com'; $Self->{'AuthModule::LDAP::SearchUserPw'} = 'bot-password!'; #    LDAP.      ,    " " $Self->{'AuthModule::LDAP::AlwaysFilter'} = '(mail=*)'; #      $Self->{'AuthModule::LDAP::Charset'} = 'utf-8'; $Self->{'AuthModule::UseSyncBackend'} = 'AuthSyncBackend'; # my-it-company.com DB backend $Self->{AuthModule2} = 'Kernel::System::Auth::DB'; $Self->{'AuthModule::DB::CryptType2'} = 'sha2'; # --------------------------------------------------- # # End Agents authentication # # --------------------------------------------------- # 

Synchronisieren von Agenten (LDAP-Gruppen mit OTRS-Rollen)


  # --------------------------------------------------- # # Agent authentication sync # # (enable agent data sync. after succsessful # # authentication) # # --------------------------------------------------- # # my-it-company.com LDAP auth sync. backend. $Self->{AuthSyncModule} = 'Kernel::System::Auth::Sync::LDAP'; $Self->{'AuthSyncModule::LDAP::Host'} = 'my-it-company.com'; $Self->{'AuthSyncModule::LDAP::BaseDN'} = 'dc=my-it-company,dc=com'; $Self->{'AuthSyncModule::LDAP::UID'} = 'uid'; $Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com'; $Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'bot-password!'; $Self->{'AuthSyncModule::LDAP::AlwaysFilter'} = '(mail=*)'; $Self->{'AuthSyncModule::LDAP::UserSyncMap'} = { # DB -> LDAP UserFirstname => 'givenName', UserLastname => 'sn', UserEmail => 'mail', }; $Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member'; $Self->{'AuthSyncModule::LDAP::UserAttr'} = 'DN'; $Self->{'AuthSyncModule::LDAP::UserSyncRolesDefinition'} = { # ldap group 'cn=otrs-sa,cn=groups,cn=accounts,dc=my-it-company,dc=com' => { # otrs role 'otrs-sa' => 1, }, 'cn=otrs-admins,cn=groups,cn=accounts,dc=my-it-company,dc=com' => { 'otrs-admins' => 1, }, 'cn=otrs-helpdesk,cn=groups,cn=accounts,dc=my-it-company,dc=com' => { 'helpdesk' => 1, } }; $Self->{DatabaseUserTable} = 'users'; $Self->{DatabaseUserTableUserID} = 'id'; $Self->{DatabaseUserTableUserPW} = 'pw'; $Self->{DatabaseUserTableUser} = 'login'; # --------------------------------------------------- # # End Agents authentication sync # # --------------------------------------------------- # 

Wenn Sie feststellen, dass die Rollen nicht zu Ihnen passen und Sie nur Gruppen möchten, gebe ich zwei Beispiele für die Synchronisierung von LDAP-Gruppen mit OTRS-Gruppen - vereinfacht und mit Einstellungsrechten für jede Gruppe.

Alternative Agentensynchronisation (LDAP-Gruppen mit OTRS-Gruppen, mit Rechten)
  # --------------------------------------------------- # # Agent authentication sync # # (enable agent data sync. after succsessful # # authentication) # # --------------------------------------------------- # # my-it-company.com LDAP auth sync. backend. $Self->{AuthSyncModule} = 'Kernel::System::Auth::Sync::LDAP'; $Self->{'AuthSyncModule::LDAP::Host'} = 'my-it-company.com'; $Self->{'AuthSyncModule::LDAP::BaseDN'} = 'dc=my-it-company,dc=com'; $Self->{'AuthSyncModule::LDAP::UID'} = 'uid'; $Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com'; $Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'bot-password!'; $Self->{'AuthSyncModule::LDAP::AlwaysFilter'} = '(mail=*)'; $Self->{'AuthSyncModule::LDAP::UserSyncMap'} = { # DB -> LDAP UserFirstname => 'givenName', UserLastname => 'sn', UserEmail => 'mail', }; $Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member'; $Self->{'AuthSyncModule::LDAP::UserAttr'} = 'DN'; # AuthSyncModule::LDAP::UserSyncGroupsDefinition # (If "LDAP" was selected for AuthModule and you want to sync LDAP # groups to otrs groups, define the following.) $Self->{'AuthSyncModule::LDAP::UserSyncGroupsDefinition'} = { # ldap group 'cn=otrs-admins,cn=groups,cn=accounts,dc=my-it-company,dc=com' => { # otrs group 'admin' => { # permission rw => 1, move_into => 1, create => 1, note => 1, owner => 1, prioriry => 1, ro => 1, }, 'stats' => { rw => 1, move_into => 1, create => 1, note => 1, owner => 1, prioriry => 1, ro => 1, }, 'users' => { rw => 1, move_into => 1, create => 1, note => 1, owner => 1, prioriry => 1, ro => 1, }, 'pear-group' => { rw => 1, move_into => 1, create => 1, note => 1, owner => 1, prioriry => 1, ro => 1, }, 'macrohard-group' => { rw => 1, move_into => 1, create => 1, note => 1, owner => 1, prioriry => 1, ro => 1, }, }, 'cn=otrs-helpdesk,cn=groups,cn=accounts,dc=my-it-company,dc=com' => { 'stats' => { rw => 1, move_into => 1, create => 1, note => 1, owner => 1, prioriry => 1, ro => 1, }, 'users' => { rw => 1, move_into => 1, create => 1, note => 1, owner => 1, prioriry => 1, ro => 1, }, } }; $Self->{DatabaseUserTable} = 'users'; $Self->{DatabaseUserTableUserID} = 'id'; $Self->{DatabaseUserTableUserPW} = 'pw'; $Self->{DatabaseUserTableUser} = 'login'; # --------------------------------------------------- # # End Agents authentication sync # # --------------------------------------------------- # 



Alternative vereinfachte Agentensynchronisation (LDAP-Gruppen mit OTRS-Rollen mit rw-Berechtigungen)
  # --------------------------------------------------- # # Agent authentication sync # # (enable agent data sync. after succsessful # # authentication) # # --------------------------------------------------- # # my-it-company.com LDAP auth sync. backend. $Self->{AuthSyncModule} = 'Kernel::System::Auth::Sync::LDAP'; $Self->{'AuthSyncModule::LDAP::Host'} = 'my-it-company.com'; $Self->{'AuthSyncModule::LDAP::BaseDN'} = 'dc=my-it-company,dc=com'; $Self->{'AuthSyncModule::LDAP::UID'} = 'uid'; $Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com'; $Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'bot-password!'; $Self->{'AuthSyncModule::LDAP::AlwaysFilter'} = '(mail=*)'; $Self->{'AuthSyncModule::LDAP::UserSyncMap'} = { # DB -> LDAP UserFirstname => 'givenName', UserLastname => 'sn', UserEmail => 'mail', }; $Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member'; $Self->{'AuthSyncModule::LDAP::UserAttr'} = 'DN'; #    -     / # AuthSyncModule::LDAP::UserSyncInitialGroups # (sync following group with rw permission after initial create of first agent # login) $Self->{'AuthSyncModule::LDAP::UserSyncInitialGroups'} = [ 'users', ]; $Self->{DatabaseUserTable} = 'users'; $Self->{DatabaseUserTableUserID} = 'id'; $Self->{DatabaseUserTableUserPW} = 'pw'; $Self->{DatabaseUserTableUser} = 'login'; # --------------------------------------------------- # # End Agents authentication sync # # --------------------------------------------------- # 



Kundeneinrichtung


Kundenauthentifizierung


  # --------------------------------------------------- # # ustomer authentication # # --------------------------------------------------- # # ustomer DB auth. backend $Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::DB'; $Self->{'Customer::AuthModule::DB::Table'} = 'customer_user'; $Self->{'Customer::AuthModule::DB::CustomerKey'} = 'login'; $Self->{'Customer::AuthModule::DB::CustomerPassword'} = 'pw'; # my-it-company.com (ustomer) LDAP auth. backend $Self->{'Customer::AuthModule2'} = 'Kernel::System::CustomerAuth::LDAP'; $Self->{'Customer::AuthModule::LDAP::Host2'} = 'my-it-company.com'; $Self->{'Customer::AuthModule::LDAP::BaseDN2'} = 'dc=my-it-company,dc=com'; $Self->{'Customer::AuthModule::LDAP::UID2'} = 'uid'; $Self->{'Customer::AuthModule::LDAP::SearchUserDN2'} = 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com'; $Self->{'Customer::AuthModule::LDAP::SearchUserPw2'} = 'bot-password!'; $Self->{'Customer::AuthModule::LDAP::AlwaysFilter2'} = '(mail=*)'; # pear LDAP auth. backend. $Self->{'Customer::AuthModule3'} = 'Kernel::System::CustomerAuth::LDAP'; $Self->{'Customer::AuthModule::LDAP::Host3'} = 'pear.com'; $Self->{'Customer::AuthModule::LDAP::BaseDN3'} = 'DC=pear,DC=com'; $Self->{'Customer::AuthModule::LDAP::UID3'} = 'sAMAccountName'; $Self->{'Customer::AuthModule::LDAP::SearchUserDN3'} = 'ldap-bot@pear.com'; $Self->{'Customer::AuthModule::LDAP::SearchUserPw3'} = 'bot-password?'; # : (mail=*) -      (samAccountType=805306368) -     (!(userAccountControl:1.2.840.113556.1.4.803:=2)) -   $Self->{'Customer::AuthModule::LDAP::AlwaysFilter3'} = '(&(mail=*)(samAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'; # macrohard LDAP auth. backend. $Self->{'Customer::AuthModule4'} = 'Kernel::System::CustomerAuth::LDAP'; $Self->{'Customer::AuthModule::LDAP::Host4'} = 'macrohard.com'; $Self->{'Customer::AuthModule::LDAP::BaseDN4'} = 'dc=macrohard,dc=com'; $Self->{'Customer::AuthModule::LDAP::UID4'} = 'sAMAccountName'; $Self->{'Customer::AuthModule::LDAP::SearchUserDN4'} = 'ldap-bot@macrohard.com'; $Self->{'Customer::AuthModule::LDAP::SearchUserPw4'} = 'bot-password!?'; $Self->{'Customer::AuthModule::LDAP::AlwaysFilter4'} = '(&(mail=*)(samAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'; # --------------------------------------------------- # # End customer authentication settings # # --------------------------------------------------- # 

Client-Synchronisation (Abrufen von Client-Attributen von LDAP, Kommunikation mit OTRS-Unternehmen)


  # --------------------------------------------------- # # Customer authentication sync # # --------------------------------------------------- # # Customer user DB backend and settings $Self->{CustomerUser} = { Name => Translatable('Database Backend'), Module => 'Kernel::System::CustomerUser::DB', Params => { Table => 'customer_user', SearchCaseSensitive => 0, }, # customer unique id CustomerKey => 'login', # customer # CustomerID => 'customer_id', CustomerValid => 'valid_id', CustomerUserListFields => [ 'first_name', 'last_name', 'email' ], CustomerUserSearchFields => [ 'login', 'first_name', 'last_name', 'customer_id' ], CustomerUserSearchPrefix => '*', CustomerUserSearchSuffix => '*', CustomerUserSearchListLimit => 250, CustomerUserPostMasterSearchFields => ['email'], CustomerUserNameFields => [ 'title', 'first_name', 'last_name' ], CustomerUserEmailUniqCheck => 1, CustomerCompanySupport => 1, CacheTTL => 60 * 60 * 24, Map => [ [ 'UserTitle', Translatable('Title or salutation'), 'title', 1, 0, 'var', '', 0, undef, undef ], [ 'UserFirstname', Translatable('Firstname'), 'first_name', 1, 1, 'var', '', 0, undef, undef ], [ 'UserLastname', Translatable('Lastname'), 'last_name', 1, 1, 'var', '', 0, undef, undef ], [ 'UserLogin', Translatable('Username'), 'login', 1, 1, 'var', '', 0, undef, undef ], [ 'UserPassword', Translatable('Password'), 'pw', 0, 0, 'var', '', 0, undef, undef ], [ 'UserEmail', Translatable('Email'), 'email', 1, 1, 'var', '', 0, undef, undef ], [ 'UserCustomerID', Translatable('CustomerID'), 'customer_id', 0, 1, 'var', '', 0, undef, undef ], [ 'UserPhone', Translatable('Phone'), 'phone', 1, 0, 'var', '', 0, undef, undef ], [ 'UserFax', Translatable('Fax'), 'fax', 1, 0, 'var', '', 0, undef, undef ], [ 'UserMobile', Translatable('Mobile'), 'mobile', 1, 0, 'var', '', 0, undef, undef ], [ 'UserStreet', Translatable('Street'), 'street', 1, 0, 'var', '', 0, undef, undef ], [ 'UserZip', Translatable('Zip'), 'zip', 1, 0, 'var', '', 0, undef, undef ], [ 'UserCity', Translatable('City'), 'city', 1, 0, 'var', '', 0, undef, undef ], [ 'UserCountry', Translatable('Country'), 'country', 1, 0, 'var', '', 0, undef, undef ], [ 'UserComment', Translatable('Comment'), 'comments', 1, 0, 'var', '', 0, undef, undef ], [ 'ValidID', Translatable('Valid'), 'valid_id', 0, 1, 'int', '', 0, undef, undef ], ], # default selections Selections => { # UserTitle => { # 'Mr.' => Translatable('Mr.'), # 'Mrs.' => Translatable('Mrs.'), # }, }, }; # my-it-company.com customer user ldap backend and settings $Self->{CustomerUser2} = { Name => 'AD my-it-company.com', Module => 'Kernel::System::CustomerUser::LDAP', Params => { # ldap host Host => 'my-it-company.com', # ldap base dn BaseDN => 'dc=my-it-company,dc=com', # search scope (one|sub) SSCOPE => 'sub', UserDN => 'uid=ldap-bot,cn=users,cn=accounts,dc=my-it-company,dc=com', UserPw => 'bot-password!', # in case you want to add always one filter to each ldap query, use # this option. eg AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)' AlwaysFilter => '(mail=*)', SourceCharset => 'utf-8', Die => 0, }, # customer unique id CustomerKey => 'uid', # customer # CustomerID => 'ou', CustomerUserListFields => ['uid', 'cn', 'mail'], CustomerUserSearchFields => ['uid', 'cn', 'mail'], CustomerUserSearchPrefix => '', CustomerUserSearchSuffix => '*', CustomerUserSearchListLimit => 250, CustomerUserPostMasterSearchFields => ['mail'], CustomerUserNameFields => ['sn', 'givenname'], # Configures the character for joining customer user name parts. Join single space if it is not defined. CustomerUserNameFieldsJoin => ' ', # show customer user and customer tickets in customer interface CustomerUserExcludePrimaryCustomerID => 0, # add a ldap filter for valid users (expert setting) # CustomerUserValidFilter => '(!(description=gesperrt))', # admin can't change customer preferences AdminSetPreferences => 1, # cache time to live in sec. - cache any ldap queries CacheTTL => 0, Map => [ [ 'UserTitle', Translatable('Title or salutation'), 'title', 1, 0, 'var', '', 1, undef, undef ], [ 'UserFirstname', Translatable('Firstname'), 'givenname', 1, 1, 'var', '', 1, undef, undef ], [ 'UserLastname', Translatable('Lastname'), 'sn', 1, 1, 'var', '', 1, undef, undef ], [ 'UserLogin', Translatable('Username'), 'uid', 1, 1, 'var', '', 1, undef, undef ], [ 'UserEmail', Translatable('Email'), 'mail', 1, 1, 'var', '', 1, undef, undef ], [ 'UserCustomerID', Translatable('CustomerID'), 'ou', 0, 1, 'var', '', 1, undef, undef ], [ 'UserPhone', Translatable('Phone'), 'telephonenumber', 1, 0, 'var', '', 1, undef, undef ], [ 'UserMobile', Translatable('Mobile'), 'mobile', 1, 0, 'var', '', 1, undef, undef ], ], }; # pear customer user ldap backend and settings $Self->{CustomerUser3} = { Name => 'AD pear', Module => 'Kernel::System::CustomerUser::LDAP', Params => { # ldap host Host => 'pear.com', BaseDN => 'DC=pear,DC=com', SSCOPE => 'sub', UserDN => 'ldap-bot@pear.com', UserPw => 'bot-password?', AlwaysFilter => '(&(mail=*)(samAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))', SourceCharset => 'utf-8', Die => 0, }, # customer unique id CustomerKey => 'sAMAccountName', # customer # CustomerID => 'company', CustomerUserListFields => ['sAMAccountName', 'cn', 'mail'], CustomerUserSearchFields => ['sAMAccountName', 'cn', 'mail'], CustomerUserSearchPrefix => '', CustomerUserSearchSuffix => '*', CustomerUserSearchListLimit => 250, CustomerUserPostMasterSearchFields => ['mail'], CustomerUserNameFields => ['sn', 'givenname'], # Configures the character for joining customer user name parts. Join single space if it is not defined. CustomerUserNameFieldsJoin => ' ', # show customer user and customer tickets in customer interface CustomerUserExcludePrimaryCustomerID => 0, AdminSetPreferences => 1, CacheTTL => 0, Map => [ # note: Login, Email and CustomerID needed! # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly, http-link-target, link class(es) [ 'UserTitle', Translatable('Title or salutation'), 'title', 1, 0, 'var', '', 1, undef, undef ], [ 'UserFirstname', Translatable('Firstname'), 'givenname', 1, 1, 'var', '', 1, undef, undef ], [ 'UserLastname', Translatable('Lastname'), 'sn', 1, 1, 'var', '', 1, undef, undef ], [ 'UserLogin', Translatable('Username'), 'sAMAccountName', 1, 1, 'var', '', 1, undef, undef ], [ 'UserFullLogin', Translatable('FullUsername'), 'userPrincipalName', 1, 1, 'var', '', 1, undef, undef ], [ 'UserEmail', Translatable('Email'), 'mail', 1, 1, 'var', '', 1, undef, undef ], [ 'UserCustomerID', Translatable('CustomerID'), 'company', 0, 1, 'var', '', 1, undef, undef ], [ 'UserPhone', Translatable('Phone'), 'telephoneNumber', 1, 0, 'var', '', 1, undef, undef ], [ 'UserMobile', Translatable('Mobile'), 'mobile', 1, 0, 'var', '', 1, undef, undef ], [ 'UserAddress', Translatable('Address'), 'postaladdress', 1, 0, 'var', '', 1, undef, undef ], [ 'UserOffice', Translatable('Office'), 'physicalDeliveryOfficeName', 1, 0, 'var', '', 1, undef, undef ], [ 'UserDepartment', Translatable('Department'), 'department', 1, 0, 'var', '', 1, undef, undef ], [ 'UserComment', Translatable('Comment'), 'description', 1, 0, 'var', '', 1, undef, undef ], ], }; # macrohard customer user ldap backend and settings $Self->{CustomerUser4} = { Name => 'AD macrohard', Module => 'Kernel::System::CustomerUser::LDAP', Params => { # ldap host Host => 'macrohard.com', # ldap base dn BaseDN => 'dc=macrohard,dc=com', # search scope (one|sub) SSCOPE => 'sub', UserDN => 'ldap-bot@macrohard.com', UserPw => 'bot-password!?', AlwaysFilter => '(&(mail=*)(samAccountType=805306368)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))', SourceCharset => 'utf-8', Die => 0, }, # customer unique id CustomerKey => 'sAMAccountName', # customer # CustomerID => 'company', CustomerUserListFields => ['sAMAccountName', 'cn', 'mail'], CustomerUserSearchFields => ['sAMAccountName', 'cn', 'mail'], CustomerUserSearchPrefix => '', CustomerUserSearchSuffix => '*', CustomerUserSearchListLimit => 250, CustomerUserPostMasterSearchFields => ['mail'], CustomerUserNameFields => ['sn', 'givenname'], # Configures the character for joining customer user name parts. Join single space if it is not defined. CustomerUserNameFieldsJoin => ' ', # show customer user and customer tickets in customer interface CustomerUserExcludePrimaryCustomerID => 0, AdminSetPreferences => 1, CacheTTL => 0, Map => [ [ 'UserTitle', Translatable('Title or salutation'), 'title', 1, 0, 'var', '', 1, undef, undef ], [ 'UserFirstname', Translatable('Firstname'), 'givenname', 1, 1, 'var', '', 1, undef, undef ], [ 'UserLastname', Translatable('Lastname'), 'sn', 1, 1, 'var', '', 1, undef, undef ], [ 'UserLogin', Translatable('Username'), 'sAMAccountName', 1, 1, 'var', '', 1, undef, undef ], [ 'UserFullLogin', Translatable('FullUsername'), 'userPrincipalName', 1, 1, 'var', '', 1, undef, undef ], [ 'UserEmail', Translatable('Email'), 'mail', 1, 1, 'var', '', 1, undef, undef ], [ 'UserCustomerID', Translatable('CustomerID'), 'company', 0, 1, 'var', '', 1, undef, undef ], [ 'UserPhone', Translatable('Phone'), 'telephoneNumber', 1, 0, 'var', '', 1, undef, undef ], [ 'UserMobile', Translatable('Mobile'), 'mobile', 1, 0, 'var', '', 1, undef, undef ], [ 'UserAddress', Translatable('Address'), 'postaladdress', 1, 0, 'var', '', 1, undef, undef ], [ 'UserOffice', Translatable('Office'), 'physicalDeliveryOfficeName', 1, 0, 'var', '', 1, undef, undef ], [ 'UserDepartment', Translatable('Department'), 'department', 1, 0, 'var', '', 1, undef, undef ], [ 'UserComment', Translatable('Comment'), 'description', 1, 0, 'var', '', 1, undef, undef ], ], }; 

Fazit


Wie Sie gesehen haben, ist das Einrichten der Authentifizierung und Kontosynchronisierung in OTRS sehr einfach, aber ich hoffe, dass dieser Artikel denjenigen hilft, die gerade erst anfangen, sich mit diesem System vertraut zu machen.

Was bleibt in diesem Artikel über Bord?

  • Parallel zu LDAP können Sie auch die SSO-Autorisierung ausführen, was den Kunden das Leben erleichtert.
  • Wenn Sie Perl-Spezialisten haben, können Sie Ihr eigenes Backend schreiben, um eine Verbindung zu anderen Informationssystemen herzustellen.
  • Die Konfiguration wird bewusst vereinfacht. Beispielsweise gibt es keine Filtereinheiten, die zu LDAP-Gruppen gehören, keine Domänensuffixe, BASE DN, Arbeiten mit zusätzlichen Attributen, Arbeiten mit LDAP an anderen Ports und vieles mehr

Tipps und Erläuterungen sind in den Kommentaren und Informationen zu Tippfehlern willkommen - in der PM.

Vielen Dank für Ihre Aufmerksamkeit. Besonderer Dank geht an die Autoren, deren Materialien zu OTRS ich vor vielen Jahren verwendet habe, als ich in dieses System eingeführt wurde: Turilion , supersuperoleg , wmlex

Source: https://habr.com/ru/post/de437596/


All Articles