Существует несколько путей для интеграции Linux компьютеров в домен. Часть из них построена на использовании специализированной программ winbind
из пакета Samba
, а часть использует автономные PAM и NSS модули для непосредственного взаимодействия с сервером домена.
Пути к файлам, использованные на этой странице, относятся к дистрибутивам Linux CentOS 6/7.
Конфигурация LDAP-сервера slapd
. Содержимое файла для запуска slapd
в режиме прокси описано в статье"OpenLDAP в режиме прокси для Active Directory".
Базовая конфигурация клиентов из пакета OpenLDAP (ldapsearch
, ldapwhoami
, slapd
в режиме прокси). Параметры из этого файла могут быть перезаписаны в командной строке. Этот файл не влияет на демон nslcd
- у того свои настройки LDAP в /etc/nslcd.conf
.
Конфигурация демона nslcd
, который обеспечивает доступ к LDAP кэширующему серверу имен nscd
. Конфигурационный файл описан в разделе "Имена пользователей и групп из LDAP (nslcd)".
Используется два основных каталога для хранения баз /etc/openldap/slapd.d
и /var/lib/ldap
. Первый каталог используется для хранения конфигурации в виде базы database config
. Второй - для хранения локальной базы записей LDAP или (в режиме прокси) для хранения кэша модулем pcache
. В каталоге /var/lib/ldap
для корректного создания базы должен находиться файл DB_CONFIG
.
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
Конфигурация slapd
может храниться в двух форматах: в файле /etc/openldap/slapd.conf
и в каталоге /etc/openldap/slapd.d
. Конфигурация из каталога имеет больший приоритет, поэтому при изменениях файла /etc/openldap/slapd.conf
надо удалить базу /etc/openldap/slapd.d
и сгенерировать ее заново:
sudo rm -rf /etc/openldap/slapd.d/*; sudo -u ldap slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d -v -d -1
slaptest
проверяет синтаксис slapd.conf
, строит базу config
в /etc/openldap/slapd.d
и пытается создать bdb/hdb базы (если они описаны в slapd.conf
) в /var/lib/ldap
. Опция -d -1 - обеспечивает выдачу отладочной информации, что бывает полезно для поиска ошибок в файле конфигурации.
Иногда при генерации баз в /var/lib/ldap
slaptest
выдает ошибку:
Checking configuration files for : bdb_db_open:
db_open(/var/lib/ldap/id2entry.bdb) failed: No such file or directory (2)
В этом случае имеет смысл один раз запустить slapd
от root'а (с опцией отладки, чтобы он не ушел в фоновый режим), а потом поменять владельца сгенерированых файлов.
slapd -d -1; chown -R ldap:ldap /var/lib/ldap
Для обеспечения целостности баз соответствующая библиотека ведёт логи транзакций, которые позволяют восстановить базу в случае сбоя на диске или аварийного отключения питания. Логи транзакций накапливаются в каталоге /var/lib/ldap/
с именами вида log.0000000001
, log.0000000002
и т.д.
Для кеширующего прокси целостность баз не имеет значения, поэтому сохранение логов транзакций можно отключить, добавив в файл /var/lib/ldap/DB_CONFIG
строку set_flags DB_LOG_AUTOREMOVE
Для записи логовов slapd
в конфигурационный файл syslog/rsyslog необходимо добавить правило
local4.* /var/log/ldap.log
Для отладки slapd
запускается с опцией -d N
, где N
- число, каждый бит которого включает определенный тип отладочной печати. При запуске с опцией отладки slapd
не уходит в фоновый режим и выдает отладочную печать на stderr
. slapd -d -1
включает вывод всей доступной отладочной печати. Запуск slapd с опцией -d \?
выдает список допустимых значений отладочных режимов и мнемонические обозначения для них. В зависимости от подключенных модулей-оверлеев, список отладочных режимов может меняться. В частности, модуль pcache
добавляет свой отладочный флаг. При запуске slapd -d pcache
выдается предупреждение, что используется неверный флаг отладки, но работает как надо.
Если есть желание отлаживать slapd
, запущенный в фоновом режиме, то вместо опции -d
следует использовать -s
- запись в syslog
.
Список битов, используемых с опциями -d
и -s
Any (-1, 0xffffffff)
Trace (1, 0x1)
Packets (2, 0x2)
Args (4, 0x4)
Conns (8, 0x8)
BER (16, 0x10)
Filter (32, 0x20)
Config (64, 0x40)
ACL (128, 0x80)
Stats (256, 0x100)
Stats2 (512, 0x200)
Shell (1024, 0x400)
Parse (2048, 0x800)
Sync (16384, 0x4000)
None (32768, 0x8000)
pcache (4096, 0x1000)
В slapd.conf включаем монитор и разрешаем доступ локальному root'у
database monitor
access to *
by dn.exact="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read
by * none
Просмотр данных
#Просмотр разделов, доступных для опроса
ldapsearch -Y EXTERNAL -H ldapi:/// -b 'cn=Monitor'
#Просмотр конкретного раздела
ldapsearch -Y EXTERNAL -H ldapi:/// -b 'cn=Statistics,cn=Monitor' -s base '(objectClass=*)' '*' '+'
Для отладки можно формировать запросы к LDAP-серверу командой ldapsearch
. Например:
ldapsearch -H ldap://localhost/ -x -b "dc=example,dc=com" -LLL '(sAMAccountName=testuser)'
Тестирование запроса nslcd:
ldapsearch -H ldap://localhost/ -x -b "ou=People,dc=example,dc=com" \
-LLL '(&(&(&(&(objectClass=user)(!(objectClass=computer)))(uidNumber=*)) \
(unixHomeDirectory=*))(sAMAccountName=testuser))'`
Общие настройки slapd
описаны в статье "Общие настройки OpenLDAP".
Предполагается, что slapd
выступает кэширующим прокси между Linux компьютерами в локальной сети и внешним сервером AD, работающим под управлением Win2008R2 или старше. Задачей кэширующего сервера является обеспечение отказоустойчивости при кратковременных разрывах связи с сервером АД. Клиентом выступает Linux с сервером nslcd
. Соответствующая конфигурация nslcd
описана в отдельной статье.
Для доступа к LDAP в AD заведен пользователь Manager с паролем secret.
В поставке 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
Ниже перечислены конфигурационные файлы в которые надо внести изменения.
Файл содержит опции, которые используются при запуске 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/"
В этом файле важен параметр 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
Основной конфигурационный файл
# Схема из репозитория 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
Прикрепленный файл | Размер |
---|---|
ad_schema.txt | 4.09 КБ |
Всё необходимое для получения имен пользователей из LDAP в CentOS 7 находится в пакете nss-pam-ldapd. Этот пакет добавляет модуль pam_ldap.so в библиотеку libpam, модуль libnss_ldap.so в библиотеку libnss и сервер nslcd (работающий в связке с кэширующим сервером nss - nscd), который и выполняет запросы к LDAP серверу.
В файле /etc/nsswitch.conf
необходимо добавить ldap, как источник данных для баз passwd
, group
и shadow
:
passwd: files ldap
shadow: files ldap
group: files ldap
В файле /etc/nslcd.conf
гнобходимо настроить сервер LDAP и набор запросов к нему. Запросы включают фильтры, которые позволяют выбрать записи относящиеся к той или иной базе, и отображения стандартных имен в базе на эквивалентные по смыслу имена, которые использует схема LDAP на сервере. В примерах есть пара рабочих вариантов настроек для доступа к серверу Active Directory (AD). Для сервера slapd
из OpenLDAP модификация запросов, скорее всего, не требуется.
# Выбираем записи имеющие атрибуты uidNumber и unixHomeDirectory
# При запросе к фильтру добавляется &(sAMAccountName=username)
#
# Не совсем понятно зачем явно отбрасываются записи для компьютеров.
# Возможно существуют сценарии с назначением компьютеру атрибута unixHomeDirectory.
filter passwd (&(objectClass=user)(!(objectClass=computer))(uidNumber=*)(unixHomeDirectory=*))
# Отображение полей passwd на атрибуты AD
map passwd uid sAMAccountName
map passwd homeDirectory unixHomeDirectory
map passwd gecos displayName
Сложнее с вариантом, когда для доступа к AD используется slapd
в режиме кэширующего прокси, используемого для отказоустойчивости при кратковременных обрывах связи с сервером AD. Этот прокси не кэширует запросы с фильтром, использующим операцию "НЕ", а следовательно, и запрос из предыдущего примера. Для работы через кэширующий прокси рабочим оказался упрощённый вариант фильтра:
filter passwd (&(objectClass=user)(uidNumber=*)(unixHomeDirectory=*))
Ссылки:
Linux: SSH + LDAP(Kerberos) - http://xvoids.blogspot.ru/2008/09/linux-rhel-ssh-kerberos-ldapad.html
Аутентификация в apache используя Active Directory и kerberos - http://val-khmyrov.blogspot.ru/2011/04/apache-active-directory-kerberos.html
Прокси сервер Squid в Active Directory с Kerberos аутентификацией - http://www.theadmin.ru/linux/squid/proksi-server-squid-v-active-directory-s-kerberos-autentifikaciej/
Admin Guide for Mod_auth_kerb - http://www.its.mn/hp_docs/apache/mod_auth_kerb.admin.guide mod_auth_kerb - http://modauthkerb.sourceforge.net/configure.html
Kerberos Single Signon with Joomla! or other PHP apps - http://sammoffatt.com.au/knowledge-base-mainmenu/9-joomla/7-kerberos-single-signon-with-joomla-or-other-php-apps
Using mod_auth_kerb and Windows 2000/2003/2008R2 as KDC - http://www.grolmsnet.de/kerbtut/