[gelöst] LDAP Sync

Hilfe zu Znuny Problemen aller Art
Locked
Dennis13
Znuny newbie
Posts: 14
Joined: 06 Dec 2012, 15:38
Znuny Version: 3.1.1

[gelöst] LDAP Sync

Post by Dennis13 »

Hallo,

Ersteinmal meine Ausgangsdaten:
Windows 2008 R2
OTRS 3.1.11
ActiveDirectory
Alle Benutzer im AD in OU Benutzer und OU Benutzer/inaktive
die OTS Gruppen liegen in OU otrs

Generell funktioniert die LDAP Anbindung. Ich sehe als Agent die Kunden aus dem LDAP im Adressbuch.
Kunden denen bereits ein Ticket zugeordnet war, und somit in der DB sind, können sich im Customer Bereich einloggen.
Versucht sich ein Kunde, der im AD vorhanden ist aber noch kein Ticket hatte, einzuloggen kommt die Meldung:
"Authentication succeeded, but no customer record is found in the customer backend. Please contact your administrator."
Im Log:
[Fri Dec 7 12:53:48 2012][Notice][Kernel::System::CustomerAuth::LDAP::Auth] CustomerUser: otrskunde (CN=otrskunde,OU=Benutzer,DC=tm,DC=local) authentication ok (REMOTE_ADDR: 10.68.7.9).
[Fri Dec 7 12:53:48 2012][Error][Kernel::System::CustomerUser::SetPreferences][506] No such user 'otrskunde'!

Soweit ich das verstanden habe, ist das auch richtig so und lässt sich nicht ändern, dass alle AD User sich als Kunde von beginn an anmelden können.

Was aber funktionieren kann, nur bei mir noch nicht, ist folgendes Szenario:
AD User in Gruppe OTRS_Agents soll ich in otrs anmelden können, ohne das ein Admin einen Benutzer in der otrs DB anlegt.
Z.Z. kommt folgendr Fehler:
"Panic, user authenticated but no user data can be found in OTRS DB!! Perhaps the user is invalid."
Im Log:
[Fri Dec 7 12:59:55 2012][Notice][Kernel::System::Auth::LDAP::Auth] User: otrsagent (CN=otrsagent,OU=Benutzer,DC=tm,DC=local) authentication ok (REMOTE_ADDR: 10.68.7.9).
[Fri Dec 7 12:59:55 2012][Error][Kernel::System::User::UserLookup][797] No UserID found for 'otrsagent'!
[Fri Dec 7 12:59:55 2012][Error][Kernel::System::User::UserLookup][797] No UserID found for 'otrsagent'!
[Fri Dec 7 12:59:55 2012][Notice][Kernel::System::User::GetUserData] Panic! No UserData for user: 'otrsagent'!!!


Meine Config.pm im zweiten Post...
Last edited by Dennis13 on 18 Dec 2012, 15:02, edited 3 times in total.
OTRS 3.1.11 - Windows 2008 R2 - ActiveDirectory
Dennis13
Znuny newbie
Posts: 14
Joined: 06 Dec 2012, 15:38
Znuny Version: 3.1.1

Re: LDAP Sync

Post by Dennis13 »

Ich habe das mit der Gruppenzugehörigkeit auch zum Testen ausgeklammert:
(Das ist aus der Config von "LDAP für Dummis" die Kommentare muss ich noch entfernen ;)

Code: Select all

# --
# Kernel/Config.pm - Config file for OTRS kernel
# Copyright (C) 2001-2011 xxx, http://otrs.org/
# --
# $Id: Config.pm.dist,v 1.25 2011/09/16 10:58:28 mg Exp $
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
# --
#  Note:
#
#  -->> OTRS does have a lot of config settings. For more settings
#       (Notifications, Ticket::ViewAccelerator, Ticket::NumberGenerator,
#       LDAP, PostMaster, Session, Preferences, ...) see
#       Kernel/Config/Defaults.pm and copy your wanted lines into "this"
#       config file. This file will not be changed on update!
#
# --

package Kernel::Config;

use utf8;

sub Load {
    my $Self = shift;
    # ---------------------------------------------------- #
    # ---------------------------------------------------- #
    #                                                      #
    #         Start of your own config options!!!          #
    #                                                      #
    # ---------------------------------------------------- #
    # ---------------------------------------------------- #

    # ---------------------------------------------------- #
    # database settings                                    #
    # ---------------------------------------------------- #
    # DatabaseHost
    # (The database host.)
    $Self->{'DatabaseHost'} = 'localhost';
    # Database
    # (The database name.)
    $Self->{'Database'} = 'otrs';
    # DatabaseUser
    # (The database user.)
    $Self->{'DatabaseUser'} = 'otrs';
    # DatabasePw
    # (The password of database user. You also can use bin/otrs.CryptPassword.pl
    # for crypted passwords.)
    $Self->{'DatabasePw'} = 'http://localhost/otrs/installer.pl';
    # DatabaseDSN
    # (The database DSN for MySQL ==> more: "man DBD::mysql")
    $Self->{DatabaseDSN} = "DBI:mysql:database=$Self->{Database};host=$Self->{DatabaseHost};";

    # (The database DSN for PostgreSQL ==> more: "man DBD::Pg")
    # if you want to use a local socket connection
#    $Self->{DatabaseDSN} = "DBI:Pg:dbname=$Self->{Database};";
    # if you want to use a tcpip connection
#    $Self->{DatabaseDSN} = "DBI:Pg:dbname=$Self->{Database};host=$Self->{DatabaseHost};";
    # if you have PostgresSQL 8.1 or earlier, activate the legacy driver with this line:
#    $Self->{DatabasePostgresqlBefore82} = 1;

    # ---------------------------------------------------- #
    # fs root directory
    # ---------------------------------------------------- #
    $Self->{Home} = 'C:/PROGRA~2/OTRS/OTRS';

    # ---------------------------------------------------- #
    # insert your own config settings "here"               #
    # config settings taken from Kernel/Config/Defaults.pm #
    # ---------------------------------------------------- #
    # $Self->{SessionUseCookie} = 0;
    # $Self->{CheckMXRecord} = 0;

    # ---------------------------------------------------- #

    # ---------------------------------------------------- #
    # data inserted by installer                           #
    # ---------------------------------------------------- #

    $Self->{LogModule}          = 'Kernel::System::Log::File';
    $Self->{LogModule::LogFile} = 'C:/PROGRA~2/OTRS/OTRS/var/log/otrs.log';
    # $DIBI$








#--------------------------------------------------------------------------------------------
#                                            Firma1                                        #
#--------------------------------------------------------------------------------------------
#--------------------------------------------------------------------------------------------
#                                   Agenten Authentifizeirung                               #
#--------------------------------------------------------------------------------------------
  $Self->{'AuthModule'} = 'Kernel::System::Auth::LDAP';
  $Self->{'AuthModule::LDAP::Host'} = 'dc.firma.local'; 				#hier kann auch die IP des DCs stehen. aber sinvollerweise hat man ja mehr als einen:-)
  $Self->{'AuthModule::LDAP::BaseDN'} = 'OU=Benutzer, DC=firma, DC=local';				# lest euch die Seiten die ich oben verlinkt habe durch, dann wird DN,OU, DC usw. alles klar:-) 
  $Self->{'AuthModule::LDAP::UID'} = 'sAMAccountName';
#  $Self->{'AuthModule::LDAP::GroupDN'} = 'CN=OTRS_Agents,OU=otrs,DC=firma,DC=local';       # nur Mitlieder dieser Gruppe dürfen sich einloggen, ich habs auskommentiert weil ich es bei uns nicht filtere.
  $Self->{'AuthModule::LDAP::AccessAttr'} = 'member';					# bei 2008er Domänen ist es 'member' bei 2003er ist es 'memberUID'*
  $Self->{'AuthModule::LDAP::SearchUserDN'} = 'ldapuserotrs@firma.local'; # hier geht es auch mit dem user Principal Name, 
											# oder eben die DN des Bindusers, war bei mir ne böse Falle weil ich es nicht wörtlich genug genommen habe. Die SearchUserDN ist nicht die DN 
											# in der der User liegt sondern die eindeutige des Users, das gleiche gilt für die GroupDNs
											# der Search User muss Mitglied in "Domänen-Benutzer" und in "Windows-Authentifizierungszugriffgruppe" sein
											# sähe dann ungefähr so aus
        										#$Self->{'AuthModule::LDAP::SearchUserDN'} = 'CN=otrsldap,CN=Users,DC=Firma1,DC=local'; 
  $Self->{'AuthModule::LDAP::SearchUserPw'} = 'geheim';
#--------------------------------------------------------------------------------------------
#                                  Kunden Authentifizeirung                                 #
#--------------------------------------------------------------------------------------------
  $Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::LDAP';
  $Self->{'Customer::AuthModule::LDAP::Host'} = 'dc.firma.local';
  $Self->{'Customer::AuthModule::LDAP::BaseDN'} = 'OU=Benutzer, DC=firma, DC=local';
  $Self->{'Customer::AuthModule::LDAP::UID'} = 'sAMAccountName';
  $Self->{'Customer::AuthModule::LDAP::GroupDN'} = 'CN=OTRS_Kunden,OU=otrs,DC=firma,DC=local'; # das gleiche wie bei den Agents nur wer in der Gruppe 'otrscustomer' ist darf sich einloggen, bei uns ist es nicht so, deswegen auskommantiert:-)
  $Self->{'Customer::AuthModule::LDAP::SearchUserDN'} = 'ldapuserotrs@firma.local';
  $Self->{'Customer::AuthModule::LDAP::SearchUserPw'} = 'geheim';
#-------------------------------------------------------------------------------------------- 
#                                     Kundendaten                                           #
#--------------------------------------------------------------------------------------------
   $Self->{CustomerUser} = {
    Module => 'Kernel::System::CustomerUser::LDAP',
    Params => {
      Host => 'dc.firma.local',
      BaseDN => 'OU=Benutzer, DC=firma, DC=local',						# hier die DN in der eure User liegen, kommt halt drauf an wie eurer AD strukturiert ist
      SSCOPE => 'sub',
      UserDN => 'ldapuserotrs@firma.local',
      UserPw => 'geheim',
	  AlwaysFilter =>  '(&(objectclass=user)(mail=*.*@firma.de))',
	  	# falls ihr was ausschliessen wollt geht das mit (!(ausgeschlossenes Attribut)):
		# AlwaysFilter =>  '(&(objectclass=user)(mail=*.*@Firma.de)(!((was auch immer)))',
    },
    CustomerKey => 'sAMAccountName',
    CustomerID => 'mail',
    CustomerUserListFields => ['sAMAccountName', 'cn', 'mail'],
    CustomerUserSearchFields => ['sAMAccountName', 'cn', 'mail'],
    CustomerUserPostMasterSearchFields => ['mail'],
    CustomerUserNameFields => ['givenname', 'sn'],
    Map => [
	
	# hier könnt ihr euch LDAP Atribute Mappen. Firma2 (unten) hat ein Besipiel drin.
	# da wird die FAX-Nummer ins Kommentarfeld gemappt
	
      # note: Login, Email and CustomerID needed!
      # var, frontend, storage, shown, required, storage-type
#      [ 'UserSalutation', 'Title', 'title', 1, 0, 'var' ],
#      [ 'UserFirstname', 'Firstname', 'givenname', 1, 1, 'var' ],
#      [ 'UserLastname', 'Lastname', 'sn', 1, 1, 'var' ],
      [ 'UserLogin', 'Login', 'sAMAccountName', 1, 1, 'var' ],
      [ 'UserEmail', 'Email', 'mail', 1, 1, 'var' ],
      [ 'UserCustomerID', 'CustomerID', 'mail', 0, 1, 'var' ],
#      [ 'UserPhone', 'Phone', 'telephonenumber', 1, 0, 'var' ],
#       [ 'UserAddress', 'Address', 'postaladdress', 1, 0, 'var' ],
#       [ 'UserComment', 'Comment', 'description', 1, 0, 'var' ],
    ],
  };




 #--------------------------------------------------------------------------------------------
 #                                      Firma Ende                                         #
 #--------------------------------------------------------------------------------------------









    # ---------------------------------------------------- #
    # ---------------------------------------------------- #
    #                                                      #
    #           End of your own config options!!!          #
    #                                                      #
    # ---------------------------------------------------- #
    # ---------------------------------------------------- #
}

# ---------------------------------------------------- #
# needed system stuff (don't edit this)                #
# ---------------------------------------------------- #
use strict;
use warnings;

use vars qw(@ISA $VERSION);
$VERSION = qw($Revision: 1.25 $)[1];

use Kernel::Config::Defaults;
push (@ISA, 'Kernel::Config::Defaults');

# -----------------------------------------------------#

1;

Grüße,
Dennis
Last edited by Dennis13 on 07 Dec 2012, 14:17, edited 1 time in total.
OTRS 3.1.11 - Windows 2008 R2 - ActiveDirectory
catweazle
Znuny advanced
Posts: 121
Joined: 15 Feb 2012, 12:22
Znuny Version: 3.1

Re: LDAP Sync

Post by catweazle »

poste doch mal DEINEN Customer Sync aus der Config.pm
1: OTRS 3.1.21 + Support + MasterSlave @ CentOS 6.5 , MySQL
2: Test: OTRS 3.1.21 + Support + MasterSlave @ CentOS 6.5 , MySQL
3: Test-2: OTRS 3.3.x + Support + MasterSlave @ CentOS 6.5 , MySQL (iphone, idoit-trash)
Dennis13
Znuny newbie
Posts: 14
Joined: 06 Dec 2012, 15:38
Znuny Version: 3.1.1

Re: LDAP Sync

Post by Dennis13 »

Ich habe die komplette Config.pm im 2. Post eingestellt. Das ist alles was ich habe.
OTRS 3.1.11 - Windows 2008 R2 - ActiveDirectory
Dennis13
Znuny newbie
Posts: 14
Joined: 06 Dec 2012, 15:38
Znuny Version: 3.1.1

Re: LDAP Sync

Post by Dennis13 »

Ich habe mal den Abschnitt für den Agentsync eingefügt.
Das ist aber nicht was du meinst, oder? Und wird auch nicht unbedingt für meine Anforderung benötigt?

Code: Select all

#--------------------------------------------------------------------------------------------
#                                   agent data sync against ldap                            #
#--------------------------------------------------------------------------------------------
$Self->{'AuthSyncModule'} = 'Kernel::System::Auth::Sync::LDAP';
$Self->{'AuthSyncModule::LDAP::Host'} = 'dc.firma.local';
$Self->{'AuthSyncModule::LDAP::BaseDN'} = 'OU=Benutzer, DC=tm, DC=local';
$Self->{'AuthSyncModule::LDAP::UID'} = 'sAMAccountName';
$Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'ldapuserotrs@firma.local';
$Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'geheim';
$Self->{'AuthSyncModule::LDAP::UserSyncMap'} = {
    # DB -> LDAP
    UserFirstname => 'givenName',
    UserLastname  => 'sn',
    UserEmail     => 'mail',
};

# AuthSyncModule::LDAP::UserSyncInitialGroups
# (sync following group with rw permission after initial create of first agent
# login)
$Self->{'AuthSyncModule::LDAP::UserSyncInitialGroups'} = [
    'users',
];
OTRS 3.1.11 - Windows 2008 R2 - ActiveDirectory
catweazle
Znuny advanced
Posts: 121
Joined: 15 Feb 2012, 12:22
Znuny Version: 3.1

Re: LDAP Sync

Post by catweazle »

Für Customer braucht Du

Code: Select all

$Self->{CustomerUser} = {
...
so lange Du aber nicht Deinen angepassten Code hier postest (bitte nicht die Passwörter...), wird es schwer zu sagen wo der Fehler liegt...
1: OTRS 3.1.21 + Support + MasterSlave @ CentOS 6.5 , MySQL
2: Test: OTRS 3.1.21 + Support + MasterSlave @ CentOS 6.5 , MySQL
3: Test-2: OTRS 3.3.x + Support + MasterSlave @ CentOS 6.5 , MySQL (iphone, idoit-trash)
Dennis13
Znuny newbie
Posts: 14
Joined: 06 Dec 2012, 15:38
Znuny Version: 3.1.1

Re: LDAP Sync

Post by Dennis13 »

catweazle wrote:Für Customer braucht Du

Code: Select all

$Self->{CustomerUser} = {
...
so lange Du aber nicht Deinen angepassten Code hier postest (bitte nicht die Passwörter...), wird es schwer zu sagen wo der Fehler liegt...

Ich verweise hier noch einmal auf den zweiten Post in diesem Thema. Dort habe ich den kompletten Inhalt der config.pm gepostet.
Wenn trotzdem noch etwas fehlt, sag mit bitte genauer was fehlt, und ich poste es.
OTRS 3.1.11 - Windows 2008 R2 - ActiveDirectory
catweazle
Znuny advanced
Posts: 121
Joined: 15 Feb 2012, 12:22
Znuny Version: 3.1

Re: LDAP Sync

Post by catweazle »

Dennis13 wrote: Ich verweise hier noch einmal auf den zweiten Post in diesem Thema. Dort habe ich den kompletten Inhalt der config.pm gepostet.
Wenn trotzdem noch etwas fehlt, sag mit bitte genauer was fehlt, und ich poste es.
okay, das ist doch aber nur der unbehandelte Code aus dem Beispiel, oder?
1: OTRS 3.1.21 + Support + MasterSlave @ CentOS 6.5 , MySQL
2: Test: OTRS 3.1.21 + Support + MasterSlave @ CentOS 6.5 , MySQL
3: Test-2: OTRS 3.3.x + Support + MasterSlave @ CentOS 6.5 , MySQL (iphone, idoit-trash)
Dennis13
Znuny newbie
Posts: 14
Joined: 06 Dec 2012, 15:38
Znuny Version: 3.1.1

Re: LDAP Sync

Post by Dennis13 »

Man kann doch in dem Code-Fenster scrollen... :/

Aber ich habe die Konfiguration noch einmal komplett neu überarbeitet und jetzt funktioniert alles.
Ein wichtiger Hinweis wäre, die OTRS Dienste, öfters neu zu starten.

Ein weiteres Problem habe ich von beginn an, dass wenn ich ein neues Ticket erstelle und auf Erstellen klicke,
das Ticket erstellt wird aber ich auf eine leere/ weiße Seite komme.
Es wird in der Adresszeile http://server/otrs/index.pl angezeigt.
Hierzu sollte ich aber besser ein neues Thema anlegen...

Code: Select all

#--------------------------------------------------------------------------------------------
#                              Agent Authentifizeirung mit AD                               #
#--------------------------------------------------------------------------------------------
 $Self->{'AuthModule'} = 'Kernel::System::Auth::LDAP';
 $Self->{'AuthModule::LDAP::Host'} = 'ad.domäne.local';
 $Self->{'AuthModule::LDAP::BaseDN'} = 'DC=domäne,dc=local';
 $Self->{'AuthModule::LDAP::UID'} = 'sAMAccountName';

 # Agents müssen der Gruppe angehören um sich anzumelden
 $Self->{'AuthModule::LDAP::GroupDN'} = 'CN=OTRSAgents,OU=otrs,DC=domäne,DC=local';
 $Self->{'AuthModule::LDAP::AccessAttr'} = 'member';

 # User Account mit Domänen-Benutzer Recht für AD abgleich
 $Self->{'AuthModule::LDAP::SearchUserDN'} = 'ldapuserotrs@domäne.local';
 $Self->{'AuthModule::LDAP::SearchUserPw'} = 'geheim';

 
#--------------------------------------------------------------------------------------------
#                                Agenten Data Sync mit AD                                   #
#--------------------------------------------------------------------------------------------
 $Self->{'AuthModule::UseSyncBackend'} = 'AuthSyncBackend';

 # Agent data sync mit AD
 $Self->{'AuthSyncModule'} = 'Kernel::System::Auth::Sync::LDAP';
 $Self->{'AuthSyncModule::LDAP::Host'} = 'ad.domäne.local';
 $Self->{'AuthSyncModule::LDAP::BaseDN'} = 'DC=domäne,dc=local';
 $Self->{'AuthSyncModule::LDAP::UID'} = 'sAMAccountName';
 $Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member';
 $Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'ldapuserotrs@domäne.local';
 $Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'geheim';
 $Self->{'AuthSyncModule::LDAP::UserSyncMap'} = {
     # DB -> LDAP
     UserFirstname => 'givenName',
     UserLastname  => 'sn',
     UserEmail     => 'mail',
 };

 # Agent erhält folgende Gruppenzugehörigkeit bei erstem Login
 $Self->{'AuthSyncModule::LDAP::UserSyncInitialGroups'} = [
     'users',
 ];


#--------------------------------------------------------------------------------------------
#                              Kunden Authentifizeirung mit AD                              #
#--------------------------------------------------------------------------------------------
  $Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::LDAP';
  $Self->{'Customer::AuthModule::LDAP::Host'} = 'ad.domäne.local';
  $Self->{'Customer::AuthModule::LDAP::BaseDN'} = 'OU=Benutzer, DC=domäne, DC=local';
  $Self->{'Customer::AuthModule::LDAP::UID'} = 'sAMAccountName';
  
  # Kunden müssen der Gruppe angehören um sich anzumelden
  $Self->{'Customer::AuthModule::LDAP::GroupDN'} = 'CN=OTRSKunden,OU=otrs,DC=domäne,DC=local';
  $Self->{'Customer::AuthModule::LDAP::AccessAttr'} = 'member';

 
  # User Account mit Domänen-Benutzer Recht für AD abgleich
  $Self->{'Customer::AuthModule::LDAP::SearchUserDN'} = 'ldapuserotrs@domäne.local';
  $Self->{'Customer::AuthModule::LDAP::SearchUserPw'} = 'geheim';


#-------------------------------------------------------------------------------------------- 
#                                     Kundendaten                                           #
#--------------------------------------------------------------------------------------------
   $Self->{CustomerUser} = {
    Module => 'Kernel::System::CustomerUser::LDAP',
    Params => {
      Host => 'ad.domäne.local',
      BaseDN => 'OU=Benutzer, DC=domäne, DC=local',
      SSCOPE => 'sub',
      UserDN => 'ldapuserotrs@domäne.local',
      UserPw => 'geheim',
	  SourceCharset => 'utf-8',
      DestCharset => 'utf-8',
	  },
    CustomerKey => 'sAMAccountName',
    CustomerID => 'mail',
    CustomerUserListFields => ['sAMAccountName', 'cn', 'mail'],
    CustomerUserSearchFields => ['sAMAccountName', 'cn', 'mail'],
    CustomerUserPostMasterSearchFields => ['mail'],
    CustomerUserNameFields => ['givenname', 'sn'],
    Map => [
      # note: Login, Email and CustomerID needed!
      # var, frontend, storage, shown, required, storage-type
      [ 'UserSalutation', 'Title', 'title', 1, 0, 'var' ],
      [ 'UserFirstname', 'Firstname', 'givenname', 1, 1, 'var' ],
      [ 'UserLastname', 'Lastname', 'sn', 1, 1, 'var' ],
      [ 'UserLogin', 'Login', 'sAMAccountName', 1, 1, 'var' ],
      [ 'UserEmail', 'Email', 'mail', 1, 1, 'var' ],
      [ 'UserCustomerID', 'CustomerID', 'mail', 0, 1, 'var' ],
      [ 'UserPhone', 'Phone', 'telephonenumber', 1, 0, 'var' ],
#       [ 'UserAddress', 'Address', 'postaladdress', 1, 0, 'var' ],
#       [ 'UserComment', 'Comment', 'description', 1, 0, 'var' ],
    ],
  };
OTRS 3.1.11 - Windows 2008 R2 - ActiveDirectory
Locked