Gentoo Logo

Предупреждение : Этот документ находится в разработке, и его пока не следует считать официальным.


Руководство по аутентификации с помощью 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

# Используем функцию crypt для хэширования паролей
password-hash {crypt}

# Определяем параметры SSL и TLS (не обязательно)
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

(Вы можете получить зашифрованный пароль, как указано выше, с помощью
slappasswd -h {Md5})

Дальше мы редактируем конфигурационный файл 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;
# Закомментируйте эти строки , если только у вас нет
  загруженной почтовой схемы (mail schema)
#$DEFAULT_MAIL_DOMAIN = "genfic.com";
#$DEFAULT_MAIL_HOST = "mail.genfic.com";

Теперь запустите скрипт переноса:

Листинг 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

#host 127.0.0.1
#base dc=padl,dc=com

ssl start_tls
ssl on
suffix          "dc=genfic,dc=com"
#rootbinddn uid=root,ou=People,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



Для печати

Обновлено 15 апреля 2004

Исходный документ обновлен 15 августа 2011

Аннотация: Данное руководство рассказывает об основах LDAP и разъясняет, как настроить OpenLDAP для целей аутентификации между группой компьютеров с Gentoo.

Benjamin Coles
автор

Sven Vermeulen
редактор

Brandon Hale
редактор

Benny Chuang
редактор

Егор Тащилин
переводчик

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.