In the last few months, I worked a lot on connecting different services to OpenLDAP. My general impression is that, in many cases, there could be a more detailed documentation about it. So here is a little collection – no long articles, just the configuration part. This is part 1: How to integrate the free ticket system software OTRS to OpenLDAP?
- There are no configuration options related to OpenLDAP in the web interface. You do the configuration in the file Kernel/Config.pm file.
- It’s really worth reading the file Kernel/Config/Defaults.pm! It contains more than defaults, it’s rather a missing manual. 😉
Here is a working example with two agent groups and a customer group in Ldap. I worked with groupOfNames and the memberOf overlay.
# OpenLDAP
# part 1: authenticate agents against ldap
$Self->{'AuthModule'} = 'Kernel::System::Auth::LDAP';
$Self->{'AuthModule::LDAP::Host'} = '127.0.0.1';
$Self->{'AuthModule::LDAP::BaseDN'} = 'ou=users,dc=example,dc=org';
$Self->{'AuthModule::LDAP::UID'} = 'uid';
$Self->{'AuthModule::LDAP::SearchUserDN'} = 'cn=binduser,dc=example,dc=org';
$Self->{'AuthModule::LDAP::SearchUserPw'} = 'secret';
$Self->{'AuthModule::LDAP::AlwaysFilter'} = '(|(memberOf=cn=group1,ou=otrs,dc=example,dc=org)(memberOf=cn=group2,ou=otrs,dc=example,dc=org))';
$Self->{'AuthModule::LDAP::UserSuffix'} = '';
$Self->{'AuthModule::LDAP::Params'} = {
port => 389,
timeout => 120,
async => 0,
version => 3,
};
# sync agents from ldap to mysql
$Self->{'AuthSyncModule'} = 'Kernel::System::Auth::Sync::LDAP';
$Self->{'AuthSyncModule::LDAP::Host'} = '127.0.0.1';
$Self->{'AuthSyncModule::LDAP::BaseDN'} = 'ou=users,dc=example,dc=org';
$Self->{'AuthSyncModule::LDAP::UID'} = 'uid';
$Self->{'AuthSyncModule::LDAP::SearchUserDN'} = 'cn=binduser,dc=example,dc=org';
$Self->{'AuthSyncModule::LDAP::SearchUserPw'} = 'secret';
$Self->{'AuthSyncModule::LDAP::UserSyncMap'} = {
# DB -> LDAP
UserFirstname => 'givenName',
UserLastname => 'sn',
UserEmail => 'mail',
};
# Use these lines from the example file to sync everyone to the group "users" in the database, without differentiation.
# AuthSyncModule::LDAP::UserSyncInitialGroups
# (sync following group with rw permission after initial create of first agent
# login)
$Self->{'AuthSyncModule::LDAP::UserSyncInitialGroups'} = [
'users',
];
# User this to sync ldap groups to otrs groups
# what to look for
$Self->{'AuthSyncModule::LDAP::AccessAttr'} = 'member';
$Self->{'AuthSyncModule::LDAP::UserAttr'} = 'DN';
# where to put them
$Self->{'AuthSyncModule::LDAP::UserSyncGroupsDefinition'} = {
'cn=group1,ou=otrs,dc=example,dc=org' => {
'admin' => {
rw => 1,
ro => 1,
},
'faq' => {
rw => 1,
ro => 0,
},
'users' => {
rw => 1,
ro => 1,
},
},
'cn=group2,ou=otrs,dc=example,dc=org' => {
'it' => {
rw => 1,
ro => 1,
},
'faq' => {
rw => 1,
ro => 0,
},
'users' => {
rw => 1,
ro => 1,
},
},
# part 2: authenticate customers against ldap
# the "2" at the end of everything adds ldap authentication and keeps allowing authentication against the database
$Self->{'Customer::AuthModule2'} = 'Kernel::System::CustomerAuth::LDAP';
$Self->{'Customer::AuthModule::LDAP::Host2'} = '127.0.0.1';
$Self->{'Customer::AuthModule::LDAP::BaseDN2'} = 'ou=users,dc=example,dc=org';
$Self->{'Customer::AuthModule::LDAP::UID2'} = 'uid';
$Self->{'Customer::AuthModule::LDAP::SearchUserDN2'} = 'cn=binduser,dc=example,dc=org';
$Self->{'Customer::AuthModule::LDAP::SearchUserPw2'} = 'secret';
$Self->{'Customer::AuthModule::LDAP::AlwaysFilter2'} = '(memberOf=cn=group3,ou=otrs,dc=example,dc=org)';
$Self->{'Customer::AuthModule::LDAP::Params'} = {
port => 389,
timeout => 120,
async => 0,
version => 3,
};
# map customer attributes
$Self->{CustomerUser2} = {
Name => 'LDAP-Backend',
Module => 'Kernel::System::CustomerUser::LDAP',
Params => {
Host => '127.0.0.1',
BaseDN => 'ou=users,dc=example,dc=org',
SSCOPE => 'sub',
UserDN => 'cn=binduser,dc=example,dc=org',
UserPw => 'secret',
AlwaysFilter => '(memberOf=cn=group3,ou=otrs,dc=example,dc=org)',
},
CustomerKey => 'uid',
CustomerID => 'mail',
# show these fields when searching in admin interface
CustomerUserListFields => ['uid', 'cn', 'mail'],
# search for these fields in ldap
CustomerUserSearchFields => ['uid', 'cn', 'mail'],
CustomerUserSearchPrefix => '',
CustomerUserSearchSuffix => '*',
CustomerUserSearchListLimit => 250,
CustomerUserPostMasterSearchFields => ['mail'],
CustomerUserNameFields => ['givenname', 'sn'],
Map => [
# note: Login, Email and CustomerID needed!
# var, frontend, storage, shown, required, storage-type
[ 'UserFirstname', 'Firstname', 'givenname', 1, 1, 'var' ],
[ 'UserLastname', 'Lastname', 'sn', 1, 1, 'var' ],
[ 'UserLogin', 'Login', 'uid', 1, 1, 'var' ],
[ 'UserEmail', 'Email', 'mail', 1, 1, 'var' ],
[ 'UserCustomerID', 'CustomerID', 'uid', 0, 1, 'var' ],
],
};
# customers are not synced to mysql