LDAP аутентификация · 4 min read · Dec 13, 2025
Аутентификация LDAP в Linux

Этот гид покажет вам, как хранить ваших пользователей в LDAP и аутентифицировать некоторые из сервисов против него. Я не буду показывать, как устанавливать конкретные пакеты, так как это зависит от дистрибутива/системы. Я сосредоточусь на “чистой” конфигурации всех компонентов, необходимых для аутентификации/хранения пользователей в LDAP. Гид предполагает, что вы как-то мигрируете с обычной аутентификации passwd/shadow, но он также подходит для людей, которые делают это с нуля.
Требования
- OpenLDAP
- pam_ldap
- nss_ldap
- PADL migrationtools
Введение
Цель, которую мы хотим достичь, заключается в том, чтобы наши пользователи хранились в LDAP, аутентифицировались против LDAP (прямо или через pam) и имели какой-то инструмент для управления этим в понятной для человека форме.
Таким образом, мы можем использовать все программное обеспечение, которое поддерживает LDAP, или вернуться к модулю PAM LDAP, который будет действовать как шлюз PAM->LDAP.
Больше информации о концепции LDAP можно найти в Википедии: LDAP wikipedia
Конфигурация OpenLDAP
OpenLDAP состоит из демонов slapd и slurpd. Этот гид охватывает один LDAP сервер без репликации, поэтому мы сосредоточимся только на slapd. Я также предполагаю, что вы установили и инициализировали вашу установку OpenLDAP (в зависимости от системы/дистрибуции). Если это так, давайте перейдем к части конфигурации.
На моей системе (Gentoo) конфигурация OpenLDAP хранится в /etc/openldap, нас интересует файл /etc/openldap/slapd.conf. Но сначала нам нужно сгенерировать пароль для администратора LDAP, чтобы вставить его в конфигурационный файл:
slappasswd -h {md5}Конфигурация выглядит следующим образом:
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
allow bind_v2
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
modulepath /usr/lib/openldap/openldap
access to attrs=userPassword
by dn="uid=root,ou=People,dc=domain,dc=com" write
by dn="cn=Manager,dc=domain,dc=com" write
by anonymous auth
by self write
by * none
access to dn.base="" by * read
access to *
by dn="cn=Manager,dc=domain,dc=com" write
by * read
database bdb
suffix "dc=domain,dc=com"
rootdn "cn=Manager,dc=domain,dc=com"
rootpw {MD5}Tk1sMytv5ipjr+Vhcf03JQ==
directory /var/lib/openldap-data
index objectClass eq
Не забудьте изменить суффикс и пути в соответствии с вашими потребностями.
Это основные параметры с некоторыми базовыми ACL, необходимыми для изменения паролей пользователем. Если вам нужна более функциональная возможность, пожалуйста, прочитайте руководство по OpenLDAP. Теперь, когда у нас есть правильная конфигурация для slapd, мы можем запустить демон:
service slapd startПожалуйста, помните, что в конфигурационном файле должно быть что-то подобное, отвечающее за аргументы, передаваемые в slapd (путь должен указывать на slapd.sock):
OPTS="-h 'ldaps:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"Теперь мы можем проверить, работает ли openldap и функционирует ли он правильно. У нас еще нет данных в каталоге, но мы можем попробовать привязаться как cn=Manager,dc=domain,dc=com. Когда вас попросят ввести пароль, вы должны использовать тот, который вы сгенерировали (конечно, в открытом текстовом виде):
ldapsearch -D "cn=Manager,dc=domain,dc=com" -WМиграция/Добавление данных в каталог
Теперь, когда у нас есть работающий LDAP сервер, нам нужно заполнить его данными, либо создать, либо мигрировать записи. Я покажу вам, как мигрировать существующие записи из обычных /etc/passwd, /etc/shadow, /etc/groups.
Первый шаг — настроить инструменты миграции в соответствии с вашими потребностями. Конфигурационный файл на Gentoo находится в /usr/share/migrationtools/migrate_common.ph.
В общем, вам нужно изменить только эти:
$DEFAULT_BASE = "dc=domain,dc=com";
$EXTENDED_SCHEMA = 1;
Теперь вы готовы мигрировать данные (на самом деле это работает даже без команды экспорта):
export ETC_SHADOW=/etc/shadow
./migrate_base.pl > /tmp/base.ldif
./migrate_group.pl /etc/group /tmp/group.ldif
./migrate_hosts.pl /etc/hosts /tmp/hosts.ldif
./migrate_passwd.pl /etc/passwd /tmp/passwd.ldifТеперь у нас есть данные в формате, понятном серверу LDAP. Пожалуйста, откройте один из файлов в текстовом редакторе, чтобы привыкнуть к синтаксису. После этого мы можем добавить данные из ldifs.
ldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/base.ldifldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/group.ldifldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/passwd.ldifldapadd -D "cn=Manager,dc=domain,dc=com" -W -f /tmp/hosts.ldifВы можете попробовать поискать некоторые данные:
ldapsearch uid=foouserКонфигурация клиента
Под клиентом я имею в виду машину, которая подключается к серверу LDAP для получения пользователей и авторизации. Это также может быть машина, на которой работает сервер LDAP. В обоих случаях нам нужно отредактировать три файла: /etc/ldap.conf, /etc/nsswitch.conf и /etc/pam.d/system-auth.
Начнем с ldap.conf, клиента ldap:
BASE dc=domain, dc=com
scope sub
suffix "dc=domain,dc=com"
## когда вы хотите изменить пароль пользователя от имени root
rootbinddn cn=Manager,dc=domain,dc=com
## они нужны, когда ваш ldap выходит из строя
timelimit 5
bind_timelimit 5
uri ldap://ldap.domain.com/
pam_password exop
ldap_version 3
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid
nss_base_passwd ou=Computers,dc=cognifide,dc=pl
nss_base_passwd ou=People,dc=cognifide,dc=pl
nss_base_shadow ou=People,dc=cognifide,dc=pl
nss_base_group ou=Group,dc=cognifide,dc=pl
nss_base_hosts ou=Hosts,dc=cognifide,dc=pl
Теперь пришло время для nsswitch.conf и pam.
Добавьте это в nsswitch.conf:
passwd: files ldap
shadow: files ldap
group: files ldap
И измените system-auth (или что-то подобное, например login, sshd и т. д.) на:
auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account sufficient pam_unix.so
account sufficient pam_ldap.so
account required pam_ldap.so
password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
password sufficient pam_unix.so nullok md5 shadow use_authtok
password sufficient pam_ldap.so use_first_pass
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
session optional pam_ldap.so
Время протестировать это. Лучший инструмент для этого — добрый старый getent. Выберите пользователя из вашей системы и выполните:
getent passwd | grep foouserВы должны получить результат дважды, если это так, то nss_ldap работает нормально. Часть pam можно протестировать, удалив пользователя из /etc/passwd и попытавшись войти через ssh.
Apache mod_auth_ldap
Чтобы иметь авторизацию LDAP в apache, вам нужно загрузить модуль mod_auth_ldap.
LoadModule mm_auth_ldap_module modules/mod_auth_ldap.soТеперь достаточно сделать .htaccess следующим образом:
AuthName "Restricted"
AuthType Basic
AuthLDAPURL ldap://ldap.domain.com:389/ou=People,dc=domain,dc=com?uid
AuthLDAPBindDN "cn=Manager,dc=domain,dc=com"
AuthLDAPBindPassword "your_secret_secret_password_to_ldap_admin"
require valid-user
Обратите внимание, что этот метод также можно использовать для авторизации WebDAV subversion.
Инструменты администрирования для LDAP
Есть несколько инструментов, которые я рекомендую использовать для администрирования сервера OpenLDAP:
- phpldapadmin - веб-инструмент
- ldapvi - просмотр в vim
- PADL migrationtools - инструменты миграции
- IDEALX sambaldap tools - инструменты samba LDAP
Другие приложения, поддерживающие ldap
- Postfix
- Courier IMAP
- jabberd
- eGroupware
Резюме
Если у кого-то есть что-то добавить, пожалуйста, сделайте это. Я знаю, что конфигурация может быть не идеальной.
Get new posts in your inbox
No spam. Unsubscribe anytime.