OpenLDAP в режиме прокси для Active Directory

Общие настройки slapd описаны в статье "Общие настройки OpenLDAP".

Предполагается, что slapd выступает кэширующим прокси между Linux компьютерами в локальной сети и внешним сервером AD, работающим под управлением Win2008R2 или старше. Задачей кэширующего сервера является обеспечение отказоустойчивости при кратковременных разрывах связи с сервером АД. Клиентом выступает Linux с сервером nslcd. Соответствующая конфигурация nslcd описана в отдельной статье.

Для доступа к LDAP в AD заведен пользователь Manager с паролем secret.

Изменение схемы LDAP

В поставке CentOS нет схемы LDAP из AD. Отсутствие необходимых атрибутов приводит к тому, что запросы с этими атрибутами не обрабатываются модулем pcache, причём без какой-либо диагностической информации.

Источником схемы может быть репозиторий https://github.com/dkoudela/active-directory-to-openldap + доработка схемы NIS, в которую для совместимости с AD добавлено имя атрибута 'unixHomeDirectory', причем, обязательно в первой позиции.

/etc/openldap/schema/nis.schema

attributetype ( 1.3.6.1.1.1.1.3 NAME ('unixHomeDirectory' 'homeDirectory')
        DESC 'The absolute path to the home directory'
        EQUALITY caseExactIA5Match
        SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )

Ещё один вариант (неполный) схемы AD в прикреплённом файле. Источник схемы.

Тестирование кэша

Для проверки работоспособности кэша необходимо запустить сервер в режиме отладки slapd -d 4096 и заставить nslcd обратиться к нему (например выполнив команду nscd -i passwd;id testuser).

В хорошем случае при первом запросе атрибутов пользователя в логе будут строки вида :

QUERY NOT ANSWERABLE
QUERY CACHEABLE

при повторных запросах будет выдаваться

QUERY ANSWERABLE (answered 3 times)

В плохом случае постоянно будут выдаваться строки

QUERY NOT ANSWERABLE
QUERY NOT CACHEABLE

Файлы конфигурации

Ниже перечислены конфигурационные файлы в которые надо внести изменения.

/etc/sysconfig/ldap

Файл содержит опции, которые используются при запуске slapd командой systemctl start slapd или service slapd start

#Явно перечисляем интерфейсы по которым будет доступен прокси
SLAPD_LDAP=no
SLAPD_LDAPI=no
SLAPD_LDAPS=no
SLAPD_URLS="ldapi:/// ldap://192.168.1.1/ ldap://192.168.2.1/ ldap://127.0.0.1/"

/etc/openldap/ldap.conf

В этом файле важен параметр TLS_REQCERT allow. Без него невозможно подключиться к серверу АД с самоподписанным сертификатом.

#URI - адрес сервера. Протокол доступа может быть ldap: и ldaps:
URI ldaps://ldapserver.example.com/
#BASE - ветка дерева LDAP в которой ведется поиск
BASE dc=example,dc=com
#TLS_CACERTDIR - путь к каталогу с сертификатами SSL для установки защищенного соединения с сервером
TLS_CACERTDIR /etc/openldap/certs
#TLS_REQCERT - что делать если сертификат сервера не найден. 'allow' - продолжить соединение
TLS_REQCERT allow

/etc/openldap/slapd.conf

Основной конфигурационный файл

# Схема из репозитория https://github.com/dkoudela/active-directory-to-openldap
# nis.schema  с небольшой модификацией
include         /etc/openldap/schema_ad/microsoftattributetype.schema
include         /etc/openldap/schema_ad/microsoftattributetypestd.schema
include         /etc/openldap/schema_ad/corba.schema
include         /etc/openldap/schema_ad/core.schema
include         /etc/openldap/schema_ad/cosine.schema
include         /etc/openldap/schema_ad/duaconf.schema
include         /etc/openldap/schema_ad/dyngroup.schema
include         /etc/openldap/schema_ad/inetorgperson.schema
include         /etc/openldap/schema_ad/java.schema
include         /etc/openldap/schema_ad/misc.schema
include         /etc/openldap/schema_ad/nis.schema
include         /etc/openldap/schema_ad/openldap.schema
include         /etc/openldap/schema_ad/ppolicy.schema
include         /etc/openldap/schema_ad/collective.schema
include         /etc/openldap/schema_ad/microsoftobjectclass.schema


#Источник данных
database ldap                                                                 
suffix          "DC=example,DC=com"
uri             ldap://ldap.example.com/ 
rootdn          "OU=People,DC=example,DC=com"
rebind-as-user  yes

# От чьего имени подключаемся к АД
idassert-bind   bindmethod=simple
                binddn="CN=Manager,DC=example,DC=com"
                credentials="secret"
                mode=none
# Кто может подключаться к нам (все - анонимно и без авторизации)                                                                              
idassert-authzFrom "*"

# Опциональное отображение атрибутов passwd на схему AD
# в нашем варианте оно делается на уровне nslcd
#moduleload rwm
#overlay  rwm
#rwm-map attribute uid sAMAccountName
#rwm-map attribute dn distinguishedName
#rwm-map attribute homeDirectory unixHomeDirectory
#rwm-map attribute gecos displayName

# Кэширование
# Загрузка модуля и включение оверлея к базе LDAP
moduleload pcache.la
overlay pcache

# pcache <database> <max_entries> <numattrsets> <entry_limit> <cc_period> 
# параметры базы:
# <database> for cached entries. 
# <max_entries> when reached - cache replacement is invoked
# <numattrsets> = pcacheAttrset
# <entry_limit> limit to the number of entries returned 
# <cc_period> Consistency check time to wait

# в базе в формате BerkleyDB хранится 2000 записей, один набор атрибутов/фильтров с индексом 0
pcache hdb 2000 1 1000 300

#кэшируем все атрибуты (0 - индекс)
pcacheattrset 0 *

#шаблон запроса должен в точности совпадать с указанным, иначе запрос не кэшируется
#нужные шаблоны запросов можно отследить, запустив slapd в отладочном режиме - slapd -d 4096
#ниже приведены шаблоны запросов nslcd в CentOS 7 с модификацией фильтра, описанной в http://parallel.uran.ru/node/408
#кэшируем перечисленные запросы и храним их 900 секунд  (0 - индекс)

pcacheTemplate (&(&(objectClass=)(uidNumber=*)(unixHomeDirectory=*))(uidNumber=)) 0 900 120
pcacheTemplate (&(&(objectClass=)(uidNumber=*)(unixHomeDirectory=*))(sAMAccountName=)) 0 900 120
pcacheTemplate (&(objectClass=)(uidNumber=*)(unixHomeDirectory=*)) 0 900 120
pcacheTemplate (&(|(objectClass=)(objectClass=))(|(memberUid=)(member=))) 0 900 120
pcacheTemplate (&(|(objectClass=)(objectClass=))(gidNumber=)) 0 900 120
pcacheTemplate (&(|(objectClass=)(objectClass=))(memberUid=)) 0 900 120
pcacheTemplate (&(|(objectClass=)(objectClass=))(cn=)) 0 900 120

# максимальный размер запроса
sizelimit unlimited

# путь к базе
directory /var/lib/ldap
cachesize 200

# индексы для ускорения доступа
index objectClass                       eq,pres
index                                   member
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub

Ссылки

  1. Обход ошибки missing id2entry.bdb

  2. OpenLDAP proxy для M$ Active Directory

Прикрепленный файлРазмер
Иконка простого текстового файла ad_schema.txt4.09 КБ