Authorisierung mit LDAP

Hilfe zu OTRS Problemen aller Art
Post Reply
USchleucher
Znuny newbie
Posts: 6
Joined: 26 Apr 2021, 09:19
Znuny Version: 6.0.34
Real Name: Udo Schleucher
Company: Bundespatentgericht

Authorisierung mit LDAP

Post by USchleucher »

Hallo zusammen,

ich habe auf einem Testsystem zu znuny-OTRS erfolgreich Single-Sign-On über Apache gssapi konfiguriert - die Anmeldung klappt auch bestens. Was nicht funktioniert, ist die Authorisierung gegen AD-Gruppen basierend auf Config.pm, was dazu führt, dass grundsätzlich jeder AD-User über index.pl reingelassen wird und nicht bei fehlender AD-Gruppen-Zugehörigkeit abgewiesen wird.

Das Problem liegt in unseren CommonNames aus dem Active Directoy: CN=schul15\, test,OU=Benutzer,DC=DOMÄNE,DC=TLD

Dort ist voreingestellt, dass der CN aus Nachname, Vorname erstellt wird, wobei das "," dann mit einem "\" maskiert wird. Ich möchte ungern das bestehende AD hier in der Konfiguration des DisplayName / CN ändern, weil ich nicht sicher bin, ob das nicht wiederum Seiteneffekte auf weitere Anwendungen hat, die ebenfalls auf das AD zugreifen.

An sich ist das bis hierher auch noch kein Problem, znuny-OTRS macht daraus aber leider noch eine weitere Umwandlung der Strings, so dass aus dem AD-CN "CN=schul15\, test,OU=Benutzer,DC=DOMÄNE,DC=TLD" innerhalb von znuny-OTRS ein "CN=schul15\5c, test,OU=Benutzer,DC=DOMÄNE,DC=TLD" wird, was einen Match gegen AD-Gruppen zum Scheitern verurteilt.

Zusätzlich haben wir auch Namen mit Umlauten, die ebenfalls von znuny-OTRS bearbeitet werden - so wird ein ö zu "ö.

Kann man das znung-OTRS irgendwie abgewöhnen - meinetwegen auch in einer der Quelldateien?

Oder für die Suche im AD statt des CN bspw. den userPrincipalName oder sAMAccountName des Users heranziehen?

Wir setzen OTRS-Version 6.0.34 ein.

Vielen Dank im Voraus.

Viele Grüße,

Udo
reneeb
Znuny guru
Posts: 5018
Joined: 13 Mar 2011, 09:54
Znuny Version: 6.0.x
Real Name: Renée Bäcker
Company: Perl-Services.de
Contact:

Re: Authorisierung mit LDAP

Post by reneeb »

Kannst Du die Config dazu zeigen (Zugangsdaten etc. bitte anonymisieren)? Ist der Charset richtig eingestellt?
Perl / Znuny development: http://perl-services.de
Free Znuny add ons from the community: http://opar.perl-services.de
Commercial add ons: http://feature-addons.de
USchleucher
Znuny newbie
Posts: 6
Joined: 26 Apr 2021, 09:19
Znuny Version: 6.0.34
Real Name: Udo Schleucher
Company: Bundespatentgericht

Re: Authorisierung mit LDAP

Post by USchleucher »

Hier meine Konfig (Charset ist eingetragen - allerdings nur für Customer - wo wäre denn die richtige Stelle für Agents?):

Code: Select all

package Kernel::Config;

use strict;
use warnings;
use utf8;

sub Load {
    my $Self = shift;

    # ---------------------------------------------------- #
    # database settings                                    #
    # ---------------------------------------------------- #

    # The database host
    $Self->{'DatabaseHost'} = '[DB-SERVER]';

    # The database name
    $Self->{'Database'} = "znuny-test";

    # The database user
    $Self->{'DatabaseUser'} = "[Name]";

    # The password of database user. You also can use bin/otrs.Console.pl Maint::Database::PasswordCrypt
    # for crypted passwords
    $Self->{'DatabasePw'} = '[Pwd]';

    # The database DSN for MySQL ==> more: "perldoc DBD::mysql"
    $Self->{'DatabaseDSN'} = "DBI:mysql:database=$Self->{Database};host=$Self->{DatabaseHost}";

    # The database DSN for PostgreSQL ==> more: "perldoc DBD::Pg"
    # if you want to use a local socket connection
#    $Self->{DatabaseDSN} = "DBI:Pg:dbname=$Self->{Database};";
    # if you want to use a TCP/IP connection
#    $Self->{DatabaseDSN} = "DBI:Pg:dbname=$Self->{Database};host=$Self->{DatabaseHost};";

    # The database DSN for Microsoft SQL Server - only supported if OTRS is
    # installed on Windows as well
#    $Self->{DatabaseDSN} = "DBI:ODBC:driver={SQL Server};Database=$Self->{Database};Server=$Self->{DatabaseHost},1433";

    # The database DSN for Oracle ==> more: "perldoc DBD::oracle"
#    $Self->{DatabaseDSN} = "DBI:Oracle://$Self->{DatabaseHost}:1521/$Self->{Database}";
#
#    $ENV{ORACLE_HOME}     = '/path/to/your/oracle';
#    $ENV{NLS_DATE_FORMAT} = 'YYYY-MM-DD HH24:MI:SS';
#    $ENV{NLS_LANG}        = 'AMERICAN_AMERICA.AL32UTF8';
    # ---------------------------------------------------- #
    # fs root directory
    # ---------------------------------------------------- #
    $Self->{Home} = '/opt/otrs';

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


############## SingleSignOn SSO ###########################
        $Self->{'AuthModule'} = 'Kernel::System::Auth::HTTPBasicAuth';
        $Self->{'AuthModule::HTTPBasicAuth::ReplaceRegExp'} ='@BPATG.INT';
############## SingleSignOn SSO - ENDE ####################
############## Agenten-Login ##############################

    $Self->{'AuthModule::LDAP::GroupDN'} = 'CN=[ADGruppe],OU=[Groups],DC=[DOM],DC=[TLD]';
    #for ldap posixGroups objectclass (just uid)
#    $Self->{'AuthModule::LDAP::UserAttr'} = 'UID';

    # for non ldap posixGroups objectclass (with full user dn)
    $Self->{'AuthModule::LDAP::UserAttr'} = 'DN';
#       $Self->{'AuthModule::LDAP::UserAttr'} = 'sAMAccountName';

    # The following is valid but would only be necessary if the
    # anonymous user do NOT have permission to read from the LDAP tree
    $Self->{'AuthModule::LDAP::SearchUserDN'} = '[Benutzer]@[DOM]';
    $Self->{'AuthModule::LDAP::SearchUserPw'} = '[Pwd]';

    # in case you want to add always one filter to each ldap query, use
    # this option. e. g. AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)'
    $Self->{'AuthModule::LDAP::AlwaysFilter'} = '(&(mail=*)(objectclass=user))';
##$Self->{'AuthModule::LDAP::AlwaysFilter'} = '((objectclass=user))';

    # in case you want to add a suffix to each login name, then
    # you can use this option. e. g. user just want to use user but
    # in your ldap directory exists user@domain.
#    $Self->{'AuthModule::LDAP::UserSuffix'} = '@[Dom]';

    # Net::LDAP new params (if needed - for more info see perldoc Net::LDAP)
    $Self->{'AuthModule::LDAP::Params'} = {
        port => 389,
        timeout => 120,
        async => 0,
        version => 3,
    };

    # agent data sync against ldap
    $Self->{'AuthSyncModule'} = 'Kernel::System::Auth::Sync::LDAP';
    $Self->{'AuthSyncModule::LDAP::Host'} = '[SERVER]';
    $Self->{'AuthSyncModule::LDAP::BaseDN'} = '[BaseDN]';
    $Self->{'AuthSyncModule::LDAP::UID'} = 'sAMAccountName';
    $Self->{'AuthSyncModule::LDAP::SearchUserDN'} = '[User]';
    $Self->{'AuthSyncModule::LDAP::SearchUserPw'} = '[Pwd]';
    $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',
    ];

    # Zuweisen von OTRS-Rollen auf Basis der LDAP-Gruppen
    # AuthSyncModule::LDAP::UserSyncRolesDefinition
    # (If "LDAP" was selected for AuthModule and you want to sync LDAP
    # groups to otrs roles, define the following.)
    $Self->{'AuthSyncModule::LDAP::UserSyncRolesDefinition'} = {
        # ldap group
        'CN=ACN=[ADGruppe1],OU=[Groups],DC=[DOM],DC=[TLD]' => {
            # otrs role
            'Anwenderbetreuer' => 1,
        },
        'CN=CN=[ADGruppe2],OU=[Groups],DC=[DOM],DC=[TLD]' => {
            'admin' => 1,
        }
    };

    # alternatives Anmeldemodul: Datenbank! (dann aber nur mit den in der DB enthaltenen Einträgen)
    $Self->{'AuthModule2'} = 'Kernel::System::Auth::DB';
    $Self->{'AuthModule::DB::CryptType2'} = 'crypt';

$Self->{LoginURL} = 'https://SERVER/otrs/public.pl';
$Self->{LogoutURL} = 'https://SERVER.bpatg.int/otrs/index.pl';


################# /Agenten #############################
################## Customers ############################
   # CustomerUser
    # (customer user ldap backend and settings)
    $Self->{CustomerUser} = {
        Name => 'ActiveDirectory',
        Module => 'Kernel::System::CustomerUser::LDAP',
        Params => {
            # ldap host
            Host => '[Server]',
            # ldap base dn
            BaseDN => '[BaseDN]',
            # search scope (one|sub)
            SSCOPE => 'sub',
#            # The following is valid but would only be necessary if the
#            # anonymous user does NOT have permission to read from the LDAP tree
            UserDN => '[Benutzer]',
            UserPw => '[Pwd]',
            # in case you want to add always one filter to each ldap query, use
            # this option. e. g. AlwaysFilter => '(mail=*)' or AlwaysFilter => '(objectclass=user)'
            AlwaysFilter => '',
            # if your frontend is e. g. iso-8859-1 and the charset of your
            # ldap server is utf-8, use this options (if not, ignore it)
            SourceCharset => 'utf-8',
            DestCharset => 'utf-8',
            # Net::LDAP new params (if needed - for more info see perldoc Net::LDAP)
            Params => {
                port => 389,
                timeout => 120,
                async => 0,
                version => 3,
            },
        },
        # ustomer uniq id
        CustomerKey => 'sAMAccountName',
        # customer #
        CustomerID => 'mail',
        CustomerUserListFields => ['givenname', 'sn', 'mail'],
        CustomerUserSearchFields => ['sn', 'cn', 'mail', 'givenname'],
        CustomerUserSearchPrefix => '*',
        CustomerUserSearchSuffix => '*',
        CustomerUserSearchListLimit => 400,
        CustomerUserPostMasterSearchFields => ['mail'],
        CustomerUserNameFields => ['givenname', 'sn'],
        # show not own tickets in customer panel, CompanyTickets
        CustomerUserExcludePrimaryCustomerID => 0,
        # add a ldap filter for valid users (expert setting)
       CustomerUserValidFilter => '(&(mail=*)(objectclass=person))',
        # admin can't change customer preferences
        AdminSetPreferences => 0,
#        # cache time to life in sec. - cache any database queris
#        CacheTTL => 0,
        Map => [
            # note: Login, Email and CustomerID needed!
            # var, frontend, storage, shown (1=always,2=lite), required, storage-type, http-link, readonly
            [ 'UserSalutation', 'Title',      'title',           1, 0, 'var', '', 0 ],
            [ 'UserFirstname',  'Firstname',  'givenname',       1, 1, 'var', '', 0 ],
            [ 'UserLastname',   'Lastname',   'sn',              1, 1, 'var', '', 0 ],
            [ 'UserLogin',      'Username',   'sAMAccountName',             1, 1, 'var', '', 0 ],
            [ 'UserEmail',      'Email',      'mail',            1, 1, 'var', '', 0 ],
            [ 'UserCustomerID', 'CustomerID', 'mail',            0, 1, 'var', '', 0 ],
#            [ 'UserCustomerIDs', 'CustomerIDs', 'second_customer_ids', 1, 0, 'var', '', 0 ],
            [ 'UserPhone',      'Phone',      'telephonenumber', 1, 0, 'var', '', 0 ],
            [ 'UserAddress',    'Address',    'postaladdress',   1, 0, 'var', '', 0 ],
            [ 'UserComment',    'Comment',    'description',     1, 0, 'var', '', 0 ],
            [ 'UserRoom',       'Raum-Nummer',  'roomnumber',     1, 0, 'var', '', 0 ],
        ],
    };


$Self->{'Customer::AuthModule'} = 'Kernel::System::CustomerAuth::HTTPBasicAuth';
$Self->{'Customer::AuthModule::HTTPBasicAuth::ReplaceRegExp'} ='@[DOM]';


$Self->{CustomerPanelLoginURL} = 'https://SERVER.bpatg.int/otrs/public.pl';
$Self->{CustomerPanelLogoutURL} = 'https://SERVER.bpatg.int/otrs/customer.pl';

################# /Customers ###########################

############### Proxy #########################


$Self->{'WebUserAgent::Proxy'} = '[Proxy]:[Port]';



################# /Proxy ########################







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

    # ---------------------------------------------------- #
    # data inserted by installer                           #
    # ---------------------------------------------------- #
    # $DIBI$

    # ---------------------------------------------------- #
    # ---------------------------------------------------- #
    #                                                      #
    # end of your own config options!!!                    #
    #                                                      #
    # ---------------------------------------------------- #
    # ---------------------------------------------------- #

    return 1;
}

# ---------------------------------------------------- #
# needed system stuff (don't edit this)                #
# ---------------------------------------------------- #

use Kernel::Config::Defaults; # import Translatable()
use parent qw(Kernel::Config::Defaults);

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

1;
Wie schon beschrieben, die Authentizierung funktioniert einwandfrei ...

Ich korrigiere: Ich habe gerade noch einmal einen Testuser ("Nüßlein, Rösi")mit mehreren Umlauten angelegt - znuny-OTRS kann den User schon gar nicht anlegen(auch nicht "Kundenbenutzer"):

Code: Select all

Can't create user 'nuesslein' (CN=Nüßlein\, Rösi,OU=Testuser,OU=[UserOU],DC=[DOM],DC=[TLD]) in RDBMS!
root
Administrator
Posts: 3934
Joined: 18 Dec 2007, 12:23
Znuny Version: Znuny and Znuny LTS
Real Name: Roy Kaldung
Company: Znuny
Contact:

Re: Authorisierung mit LDAP

Post by root »

USchleucher wrote: 29 Nov 2021, 09:42
Ich korrigiere: Ich habe gerade noch einmal einen Testuser ("Nüßlein, Rösi")mit mehreren Umlauten angelegt - znuny-OTRS kann den User schon gar nicht anlegen(auch nicht "Kundenbenutzer"):

Code: Select all

Can't create user 'nuesslein' (CN=Nüßlein\, Rösi,OU=Testuser,OU=[UserOU],DC=[DOM],DC=[TLD]) in RDBMS!
Hi,

hat denn Testuser auch Werte in den Attribute Vorname, Nachname, Login und E-Mail?

- Roy
Znuny and Znuny LTS running on CentOS / RHEL / Debian / SLES / MySQL / PostgreSQL / Oracle / OpenLDAP / Active Directory / SSO

Use a test system - always.

Do you need professional services? Check out https://www.znuny.com/

Do you want to contribute or want to know where it goes ?
USchleucher
Znuny newbie
Posts: 6
Joined: 26 Apr 2021, 09:19
Znuny Version: 6.0.34
Real Name: Udo Schleucher
Company: Bundespatentgericht

Re: Authorisierung mit LDAP

Post by USchleucher »

:shock: .... ja, klar .... nehme meine "Korrektur" wieder zurück .... natürlich hat die Mailadresse zum Testuser gefehlt ....

es bleibt damit beim Authorisierungs-Problem der Agent-Seite index.pl

Code: Select all

User: nuesslein not in GroupDN='CN=[ADGruppe1],OU=[Groups],DC=[DOM],DC=[TLD]', Filter='(memberUid=CN=Nüßlein\5c, Rösi,OU=Testuser,OU=[UserOU],DC=[DOM],DC=[TLD])'! (REMOTE_ADDR: [IP]).
Mon Nov 29 13:24:40 2021 (Europe/Berlin)	notice	OTRS-CGI-38	User: nuesslein not in GroupDN='CN=[ADGruppe2],OU=[Groups],DC=[DOM],DC=[TLD]', Filter='(memberUid=CN=Nüßlein\5c, Rösi,OU=Testuser,OU=[UserOU],DC=[DOM],DC=[TLD])'! (REMOTE_ADDR: [IP).
Mon Nov 29 13:24:40 2021 (Europe/Berlin)	notice	OTRS-CGI-38	Initial data for 'nuesslein' (CN=Nüßlein\, Rösi,OU=Testuser,OU=[UserOU],DC=[DOM],DC=[TLD]) created in RDBMS.
root
Administrator
Posts: 3934
Joined: 18 Dec 2007, 12:23
Znuny Version: Znuny and Znuny LTS
Real Name: Roy Kaldung
Company: Znuny
Contact:

Re: Authorisierung mit LDAP

Post by root »

Hi,

dann stellt sich mir die nächste Frage: woher kommt das memberUid in dem Filter? Ich vermute aus der Default-Einstellung.

Schreibe doch mal in Deine Config.pm, also bei den anderen AuthSyncModule Einstellungen

Code: Select all

$Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member:1.2.840.113556.1.4.1941:';
$Self->{'AuthSyncModule::LDAP::UserAttr'}   = 'DN';
- Roy
Znuny and Znuny LTS running on CentOS / RHEL / Debian / SLES / MySQL / PostgreSQL / Oracle / OpenLDAP / Active Directory / SSO

Use a test system - always.

Do you need professional services? Check out https://www.znuny.com/

Do you want to contribute or want to know where it goes ?
USchleucher
Znuny newbie
Posts: 6
Joined: 26 Apr 2021, 09:19
Znuny Version: 6.0.34
Real Name: Udo Schleucher
Company: Bundespatentgericht

Re: Authorisierung mit LDAP

Post by USchleucher »

Herzlichen Dank!!!!

Super! Das war's .... wenn ich noch blöd fragen darf: Was bewirkt $Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member:1.2.840.113556.1.4.1941:';?
root
Administrator
Posts: 3934
Joined: 18 Dec 2007, 12:23
Znuny Version: Znuny and Znuny LTS
Real Name: Roy Kaldung
Company: Znuny
Contact:

Re: Authorisierung mit LDAP

Post by root »

USchleucher wrote: 29 Nov 2021, 16:34 Herzlichen Dank!!!!

Super! Das war's .... wenn ich noch blöd fragen darf: Was bewirkt $Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member:1.2.840.113556.1.4.1941:';?
Hi,

member würde ausreichen, der Zusatz bewirkt das der Domain Controller auch rekursiv sucht, sprich verschachtelte Gruppen.

- Roy
Znuny and Znuny LTS running on CentOS / RHEL / Debian / SLES / MySQL / PostgreSQL / Oracle / OpenLDAP / Active Directory / SSO

Use a test system - always.

Do you need professional services? Check out https://www.znuny.com/

Do you want to contribute or want to know where it goes ?
USchleucher
Znuny newbie
Posts: 6
Joined: 26 Apr 2021, 09:19
Znuny Version: 6.0.34
Real Name: Udo Schleucher
Company: Bundespatentgericht

Re: Authorisierung mit LDAP

Post by USchleucher »

Danke für den Hinweis.

Dennoch ein seltsames Verhalten, da beide Gruppen nicht nested sind - die Benutzer sind direkt Mitglied - aber egal: Es funktioniert!
root
Administrator
Posts: 3934
Joined: 18 Dec 2007, 12:23
Znuny Version: Znuny and Znuny LTS
Real Name: Roy Kaldung
Company: Znuny
Contact:

Re: Authorisierung mit LDAP

Post by root »

USchleucher wrote: 29 Nov 2021, 16:41 Danke für den Hinweis.

Dennoch ein seltsames Verhalten, da beide Gruppen nicht nested sind - die Benutzer sind direkt Mitglied - aber egal: Es funktioniert!
Das ist nicht seltsam. Vorher war es memberUid und das ist eher für OpenLDAP gedacht. Bei einem Active Directory braucht's member, optional mit dem Zusatz den ich verwendet habe.

- Roy
Znuny and Znuny LTS running on CentOS / RHEL / Debian / SLES / MySQL / PostgreSQL / Oracle / OpenLDAP / Active Directory / SSO

Use a test system - always.

Do you need professional services? Check out https://www.znuny.com/

Do you want to contribute or want to know where it goes ?
USchleucher
Znuny newbie
Posts: 6
Joined: 26 Apr 2021, 09:19
Znuny Version: 6.0.34
Real Name: Udo Schleucher
Company: Bundespatentgericht

Re: Authorisierung mit LDAP

Post by USchleucher »

Danke, jetzt hab ich's kapiert.
Post Reply