Предупреждение :
Этот документ находится в разработке, и его пока не следует считать официальным.
|
Руководство по аутентификации с помощью OpenLDAP
1.
Введение в OpenLDAP
Что такое LDAP ?
LDAP означает Lightweight Directory Access Protocol (легковесный протокол
доступа к каталогу). Основанный на протоколе X.500 он содержит большинство
его основных функций, но не содержит некоторых дополнительных функций, которые
имеет X.500. Итак - что такое этот X.500 и почему есть LDAP?
X.500 - это модель для сервиса каталога в концепции OSI. Он содержит описания
пространств имен и протоколов для запросов из каталога и обновления информации
в нем. Однако, X.500 оказался слишком сложным во многих ситуациях. И тут
появляется LDAP. Как и X.500 он предоставляет модель данные/пространство_имен
для каталога, а так же протокол. Однако, LDAP разработан, чтобы работать поверх
стека TCP/IP. Таким образом LDAP - это урезанная версия X.500.
Я не понял. Что за каталог?
Каталог - это специализированная база данных, разработанная для частых
чтений(запросов), но редких изменений. В отличие от обычных баз данных, она не
поддерживает транзакции или возможность «отката» изменений.
Каталоги легко реплицируются для увеличения доступности и надежности.
Когда каталоги реплицируются, временные расхождения позволяются, так как
каталоги в любом случае синхронизируются.
Как информация структурирована?
Вся информация внутри каталога расположена иерархически. Даже больше, если Вы
хотите внести данные в каталог, каталог должен знать, как хранить эти данные
внутри дерева. Давайте взглянем на некую фиктивную компанию и похожее на
Internet дерево.
Листинг 1.1: Организационная структура для GenFic, фиктивной Gentoo компании |
dc: com
|
dc: genfic
/ \
ou: people servers
/ \ ..
uid: .. jhon
|
Так как, Вы не предоставляете данные в базу данных в таком похожем на ascii-art
виде, каждый узел такого дерева должен быть определен. Для именования таких
узлов, LDAP использует схему именования. Большинство реализаций LDAP (включая и
OpenLDAP) уже содержат достаточное количество предопределенных (и доказавших
работоспособность) схем, таких как «inetorgperson», - часто
используемой схемы для описания пользователей.
Заинтересовавшиеся пользователи могут прочитать Руководство администратора
OpenLDAP.
2.
Настройка OpenLDAP
Начальная конфигурация
Примечание:
В данном документе мы используем адрес genfic.com в качестве примера. Вы
конечно должны изменить его. Однако убедитесь, что верхний узел является
официальным доменом верхнего уровня (net, com, cc, be, ...).
|
Давайте для начала сделаем emerge всех необходимых компонентов для нашего
сервера:
Листинг 2.1: Установка OpenLDAP |
# emerge openldap pam_ldap nss_ldap migrationtools
# chown ldap:ldap /var/lib/openldap-ldbm /var/lib/openldap-data
# /var/lib/openldap-slurp
|
Отредактируйте файл /etc/openldap/slapd.conf и добавьте следующее
сразу после core.schema:
Листинг 2.2: /etc/openldap/slapd.conf |
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
password-hash {crypt}
TLSCertificateFile /etc/ssl/ldap.pem
TLSCertificateKeyFile /etc/openldap/ssl/ldap.pem
TLSCACertificateFile /etc/ssl/ldap.pem
database ldbm
suffix "dc=genfic,dc=com"
rootdn "cn=Manager,dc=genfic,dc=com"
rootpw {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
directory /var/lib/openldap-ldbm
index objectClass eq
|
Дальше мы редактируем конфигурационный файл LDAP:
Листинг 2.3: /etc/openldap/ldap.conf |
# nano -w /etc/openldap/ldap.conf
BASE dc=genfic, dc=com
URI ldaps://auth.genfic.com:636/
TLS_REQCERT allow
|
Теперь Вы сгенерируете SSL сертификат, чтобы защитить ваш каталог. Отвечайте на
задаваемые вопросы как можно правильнее. Когда запросят Ваш Common Name,
введите имя, которое клиенты будут использовать при обращении к серверу. Обычно
это полное доменное имя (например auth.genfic.com).
Листинг 2.4: Генерируем SSL сертификаты |
# cd /etc/ssl
# openssl req -config /etc/ssl/openssl.cnf -new -x509 -nodes -out \
ldap.pem -keyout /etc/openldap/ssl/ldap.pem -days 999999
|
Теперь отредактируйте файл /etc/conf.d/slapd и добавьте следующее,
закомментировав существующую строку:
Листинг 2.5: /etc/conf.d/slapd |
OPTS="-h 'ldaps:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"
|
Запустите slapd:
Листинг 2.6: Запуск SLAPd |
# /etc/init.d/slapd start
|
Вы может проверить работу с помощью следующей команды:
Листинг 2.7: Проверка демона SLAPd |
# ldapsearch -D "cn=Manager,dc=genfic,dc=com" -W
|
Если Вы получили ошибку, попробуйте добавить -d 255, чтобы увеличить
подробность вывода и решить возникшую проблему.
3.
Перенос существующих данных
Перенос учетных записей пользователей
Далее мы перенесем учетные записи пользователей. Откройте файл
/usr/share/migrationtools/migrate_common.ph и добавьте следующее:
Листинг 3.1: /usr/share/migrationtools/migrate_common.ph |
$DEFAULT_BASE = "dc=genfic,dc=com";
$EXTENDED_SCHEMA = 1;
|
Теперь запустите скрипт переноса:
Листинг 3.2: Запуск скрипта переноса |
# export ETC_SHADOW=/etc/shadow
# cd /usr/share/migrationtools
# ./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
|
Этот последний шаг переносит указанные выше файлы в ldif-файлы, читаемые LDAP.
Теперь давайте добавим файлы в наш каталог:
Листинг 3.3: Импортируем данные в наш каталог |
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/base.ldif
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/group.ldif
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/passwd.ldif
# ldapadd -D "cn=Manager,dc=genfic,dc=com" -W -f /tmp/hosts.ldif
|
4.
Настрйока аутентификации
Настраиваем PAM
Далее мы будем настраивать PAM для использования LDAP-аутентификации. Добавьте
следующие строки в файл /etc/pam.d/system-auth:
Листинг 4.1: /etc/pam.d/system-auth |
auth sufficient /lib/security/pam_ldap.so use_first_pass
account sufficient /lib/security/pam_ldap.so
password sufficient /lib/security/pam_ldap.so use_authtok
session required /lib/security/pam_mkhomedir.so skel=/etc/skel/ umask=0
session optional /lib/security/pam_ldap.so
|
Теперь измените файл /etc/ldap.conf:
Листинг 4.2: /etc/ldap.conf |
ssl start_tls
ssl on
suffix "dc=genfic,dc=com"
uri ldaps://auth.genfic.com/
pam_password exop
ldap_version 3
pam_filter objectclass=posixAccount
pam_login_attribute uid
pam_member_attribute memberuid
nss_base_passwd ou=People,dc=genfic,dc=com
nss_base_shadow ou=People,dc=genfic,dc=com
nss_base_group ou=Group,dc=genfic,dc=com
nss_base_hosts ou=Hosts,dc=genfic,dc=com
scope one
|
Наконец, настройте ваших клиентов так, чтобы они проверяли LDAP на наличие
учетных записей:
Листинг 4.3: /etc/nsswitch.conf |
passwd: files ldap
group: files ldap
shadow: files ldap
|
Для того, чтобы проверить изменения, наберите:
Листинг 4.4: Проверка LDAP-аутентификации |
# getent passwd|grep 0:0
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
|
Если Вы обратили внимание, что одна из строк, которые Вы вставили в файл
/etc/ldap.conf была закомментирована (строка rootbinddn) -
Вам она не нужна до тех пор, пока Вы не захотите изменить пароль пользователя
из под суперпользователя. В этом случае Вы должны вставить root-пароль в файл
/etc/ldap.secret чистым текстом. Это ОПАСНО и файл
должен иметь права измененными на 600. Я же оставил этот файл пустым и когда
мне надо изменить чей-то пароль, который находится и в LDAP и в
/etc/passwd я помещаю пароль в файл на 10 секунд, пока я меняю
пароли и убираю пароль из файла, когда заканчиваю.
Права доступа в OpenLDAP
Если мы взглянем на файл /etc/openldap/slapd.conf, Вы увидете, что
Вы можете указать списки ACL (права доступа, если угодно) для данных, которые
пользователи могут читать и/или писать:
Листинг 4.5: /etc/openldap/slapd.conf |
access to *
by dn="uid=root,ou=people,dc=genfic,dc=com" write
by users read
by anonymous auth
access to attrs=userPassword,gecos,description,loginShell
by self write
|
Этим Вам дается доступ КО ВСЕМУ. Если это Ваша информация - тогда Вы получаете
права на запись к ней; если это информация другого пользователя, то Вы можете
читать ее; неизвестные пользователи могут послать имя и пароль, чтобы войти в
систему. Есть четыре уровня, от нижнего к верхнему: auth search read
write.
Следующие списки ACL более безопасные, так как они запрещают обычному
пользователю читать пароли других людей:
Листинг 4.6: /etc/openldap/slapd.conf |
access to dn=".*,dc=genfic,dc=com" attr="userPassword"
by dn="uid=root,ou=people,dc=genfic,dc=com" write
by dn="uid=John, ou=People,dc=genfic,dc=com" write
by anonymous auth
by self write
by * search
access to *
by dn="uid=root,ou=People,dc=genfic,dc=com" write
by * read
|
Этот пример дает root и John права на чтение/запись/поиск для всего в дереве
ниже dc=genfic,dc=com. Так же он позволяет пользователям менять их
личные userPassword. В последнем выражении всем остальным
позволяется только поиск в том смысле, что они могут заполнить фильтр для
поиска, но никогда не смогут прочесть найденное. Далее Вы можете иметь
множество других добавлений, но правилом является то, что они обрабатываются
сверху вниз, так что самые верхние должны быть самыми ограничивающими.
5.
Работа с OpenLDAP
Поддержка каталога
Вы можете начать использовать каталог для аутентификации пользователей в
apache/proftpd/qmail/samba. Вы так же можете управлять каталогом с помощью
Webmin, который предоставляет простой интерфейс управления. Так же Вы можете
использовать gq или directory_administrator.
6.
Благодарности
Мы хотели бы поблагодарить Matt'а Heler'а за то, что он одолжил нам свой
компьютер для целей данного руководства. Благодарности так же относятся к
народу на канале #ldap @ irc.freenode.net
Текст этого документа распространяется на условиях лицензии
Creative Commons
- Attribution / Share Alike.
|