HOWTO Gentoo, OpenLDAP, Automounter.
Введение
По просьбам (а если быть точным, одной просьбе) я решил написать HOWTO по установке и настройке OpenLDAP сервера на базе Gentoo GNU/Linux. Многие подходы в данном HOWTO работоспособных для других версий GNU/Linux.
На картинке приведена топология домена. В качестве машины, на которой проводилась настройка, в тексте HOWTO выступает машина с именем kitty-house и IP-адресом 192.168.1.5.

Серверная часть.
OpenLDAP
Все начинается с установки необходимых пакетов:
~ # emerge -av net-nds/openldap sys-auth/pam_ldap sys-auth/nss_ldap
После того, как установятся необходимы пакеты начинается настройка OpenLDAP.
Первое, что нужно сделать, это сгенерировать хэш пароля для админа:
~ # slappasswd
Следующим шагом будет редактирование конфига /etc/openldap/slapd.conf. Ниже приведен конфиг, который используется на моем серверо-десктопе. Желательно не заменять им существующий файл, а именно редактировать, потому что некоторые дефолтные настройки и объяснения в комментариях пропущены.
#Здесь добавляются необходимые файлы *.schema,
#содержащие в себе описания соотношения атребутов и классов.
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/dyngroup.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
# Load dynamic backend modules:
modulepath /usr/lib/openldap/openldap
moduleload back_hdb.so
#Настройка доступа к базе.
access to dn.base="" by * read
access to dn.base="cn=Subschema" by * read
access to *
by self write
by users read
by anonymous auth
#Выбираем драйвер базы.
database bdb
#Имя домена
suffix "dc=kitty-domain,dc=com"
checkpoint 32 30 #
#Имя админа. Внимание! Не следует использовать
#имя root в качестве имени админа в целях безопасности.
rootdn "cn=admin,dc=kitty-domain,dc=com"
rootpw #Сюда следует добавить сгенерированный хэш пароля для админа
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory /var/lib/openldap-data
# Indices to maintain
index objectClass eq
Далее изменяем настройки в файле /etc/openldap/ldap.conf. Ниже опять приведен мой рабочий конфиг. Вместо IP можно указать имя хоста, например, kitty-house, но тогда в случае отсутствия сервера DNS в сети, должен быть изменен соответствующим образом файл /etc/hosts.
#
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
BASE dc=kitty-domain, dc=com
HOST 192.168.1.5
URI ldap://192.168.1.5
#SIZELIMIT 12
#TIMELIMIT 15
#DEREF never
Следующим шагом будет создание конфигурационного файла базы данных. Это делается очень просто:
~ # cp /var/lib/openldap-data/DB_CONFIG.example /var/lib/openldap-data/DB_CONFIG
Перед запуском сервера необходимо проверить, что все конфигурационные файлы, файлы schema и база данных имеют верные права доступа:
~ # ls -l /etc/openldap/
итого 32
-rw------- 1 root root 921 Авг 16 02:10 DB_CONFIG.example
-rw-r--r-- 1 root root 230 Авг 16 03:22 ldap.conf
-rw-r--r-- 1 root root 246 Авг 16 02:09 ldap.conf.default
-r-------- 1 root root 8 Авг 17 00:03 ldap_passwd
drwxr-xr-x 2 root root 4096 Авг 16 02:15 schema
-rw-r----- 1 root ldap 2682 Авг 16 02:29 slapd.conf
-rw-r----- 1 root ldap 2309 Авг 16 02:15 slapd.conf.default
drwxr-xr-x 2 root root 4096 Авг 16 02:16 ssl
~ # ls -l /etc/openldap/schema/
итого 208
-r--r--r-- 1 root root 8231 Авг 16 02:10 corba.schema
-r--r--r-- 1 root root 20591 Авг 16 02:10 core.ldif
-r--r--r-- 1 root root 19762 Авг 16 02:10 core.schema
-r--r--r-- 1 root root 74080 Авг 16 02:10 cosine.schema
-r--r--r-- 1 root root 1553 Авг 16 02:10 dyngroup.schema
-r--r--r-- 1 root root 6360 Авг 16 02:10 inetorgperson.schema
-r--r--r-- 1 root root 13984 Авг 16 02:11 java.schema
-r--r--r-- 1 root root 2471 Авг 16 02:11 misc.schema
-r--r--r-- 1 root root 7723 Авг 16 02:11 nis.schema
-r--r--r-- 1 root root 3391 Авг 16 02:10 openldap.ldif
-r--r--r-- 1 root root 1601 Авг 16 02:11 openldap.schema
-r--r--r-- 1 root root 19689 Авг 16 02:11 ppolicy.schema
-r--r--r-- 1 root root 2968 Авг 16 02:10 README
~ # ls -l /var/lib/ |grep openldap
drwx------ 2 ldap ldap 4096 Авг 16 02:30 openldap-data
~ # ls -l /var/lib/openldap-data/
итого 788
-rw-r--r-- 1 ldap ldap 4096 Авг 18 03:33 alock
-rw------- 1 ldap ldap 24576 Авг 16 02:29 __db.001
-rw------- 1 ldap ldap 155648 Авг 16 02:29 __db.002
-rw------- 1 ldap ldap 270336 Авг 16 02:29 __db.003
-rw------- 1 ldap ldap 98304 Авг 16 02:29 __db.004
-rw------- 1 ldap ldap 352256 Авг 16 02:29 __db.005
-rw------- 1 ldap ldap 24576 Авг 16 02:29 __db.006
-rw------- 1 root root 921 Авг 16 02:29 DB_CONFIG
-rw------- 1 root root 921 Авг 16 02:10 DB_CONFIG.example
-rw------- 1 ldap ldap 8192 Авг 18 23:18 dn2id.bdb
-rw------- 1 ldap ldap 32768 Авг 18 23:18 id2entry.bdb
-rw------- 1 ldap ldap 10485760 Авг 18 23:18 log.0000000001
-rw------- 1 ldap ldap 8192 Авг 18 23:18 objectClass.bdb
После этого стартуем сервер:
~ # /etc/init.d/slapd start
Настала пора добавить необходимые узлы, пользователей и группы.
Для начала добавляем верхние узлы. Добавление происходит с использованием утилиты ldapadd и файлов базы данных. Вот так выглядит мой файл базы данных:
dn: dc=kitty-domain,dc=com
dc: kitty-domain
objectclass: dcObject
objectclass: organization
o: kitty-domain
dn: cn=admin,dc=kitty-domain,dc=com
objectclass: organizationalRole
cn: admin
dn: ou=users,dc=kitty-domain,dc=com
ou: users
objectclass: top
objectclass: organizationalUnit
dn: ou=groups,dc=kitty-domain,dc=com
ou: groups
objectclass: top
objectclass: organizationalUnit
Как только файл базы данных создан, добавляем в наш домен администратора и два контейнера: один для пользователей (users), а второй для групп (groups) с помощью следующей комманды:
~ # ldapadd -D "cn=admin,dc=kitty-domain,dc=com" -x -W -f root.ldif
Теперь можно приступать к добавлению пользователей в домен. Чтобы облечить себе задачу я использовал конфиг, приведенный в статье доктора Криса Брауна в LXF’05 2008. Но перед написанием этого HOWTO я его немного отредактировал и добавил несколько возможностей, которые не были реализованные Крисом Брауном: удаление пользователя, добавление новых групп пользователя и обновление пароля. Скачать скрипт можно отсюда. Для его использования необходимо наличие в системе утилит от PADL Software. После скачивания архив следует распаковать и скопировать его содержимое в /usr/share/openldap/migration. Следующим шаго является редактирование файла /usr/share/openldap/migration/migrate_common.ph. Нужно изменить следующие строки:
$NAMINGCONTEXT{'passwd'} = "ou=users";
$NAMINGCONTEXT{'group'} = "ou=groups";
Для работы скриптов так же необходимо сделать символьную ссылку на этот файл:
~ # ln -s /usr/share/openldap/migration/migrate_common.ph \
/usr/lib/perl5/vendor_perl/5.8.8/i686-linux/migrate_common.ph
Так же для успешного выполнения скриптов мы укажем пароль admin’a в файле /etc/openldap/ldap_passwd (Спасибо Крису Брауну за такое решение):
~ # echo -n ADMIN_PASSWORD > /etc/openldap/ldap_passwd
~ # chmod 400 /etc/openldap/ldap_passwd
Теперь можно воспользоваться скриптом и добавить пользователя peter в домен. Для получения справки о флагах скрипта, его следует просто выполнить без каких либо флагов.
~ # sh ldap_managment.sh -a --user=peter --admin=admin --domain=kitty-domain.com
На этом настройка сервера OpenLDAP закончена. Теперь в нашем домене находятся пользователь peter и его основная группа peter. Осталось только добавить slapd в загрузку при старте системы:
~ # rc-update add slapd boot
NFS
Как и настройка OpenLDAP, настройка NFS начинает с установки необходимых пакетов:
~ # emerge -av net-fs/nfs-utils
Далее редактируем конфигурационные файлы. А точнее /etc/exports. У меня он выглядит таким образом:
/home 192.168.1.0/24(no_subtree_check,rw)
Я думаю, что не следует объяснить что обозначают параметры в скобках, т.к. их описание можно получить набрав man exports.
Теперь приведем в боеготовность серверную часть NFS и добавим в автозагрузку:
~ # /etc/init.d/nfs start
~ # rc-update add nfs default
Ну вот мы и получили сервер NFS, который разрешает монтирование каталога /home всем компьютера сети 192.168.1.0/24.
Клиентская часть.
OpenLDAP.
Опять начинаем с установки пакетов:
~ # emerge -av net-nds/openldap sys-auth/pam_ldap sys-auth/nss_ldap
После завершения установки редактируем конфигурационные файлы:
/etc/pam.d/system-auth. В данном случае нужно добавить следующие закомментированные строки на их места в конфиге. Будьте внимательны и не изменяйте ничего, кроме добавления строк, т.к. от этого конфига зависит система авторизации пользователей в системе!
#Добавляются следующие 4 (!!!) строки.
#auth sufficient pam_ldap.so use_first_pass
#account sufficient pam_ldap.so
#password sufficient pam_ldap.so use_authtok use_first_pass
#session optional pam_ldap.so
# Example file:
#%PAM-1.0
auth required pam_env.so
auth sufficient pam_unix.so try_first_pass likeauth nullok
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account sufficient pam_ldap.so
account required pam_unix.so
password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 try_first_pass retry=3
password sufficient pam_unix.so try_first_pass use_authtok nullok md5 shadow
password sufficient pam_ldap.so use_authtok use_first_pass
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
session optional pam_ldap.so
Следующим на очереди является /etc/nsswitch.conf. Эти строки велят резольверу сперва посмотреть в локальных файлах (то есть в /etc/passwd и /etc/group), а затем спросить сервер LDAP конфигурации.
passwd: compat files ldap
shadow: compat files ldap
group: compat files ldap
После этого следует отредактировать файл /etc/ldap.conf следующим образом (ниже приведен рабочий конфиг с комментариями к оставленным строкам):
# Another way to specify your LDAP server is to provide an
# uri with the server name. This allows to use
# Unix Domain Sockets to connect to a local LDAP Server.
uri ldap://kitty-house/
suffix "dc=kitty-domain,dc=com"
# Reconnect policy:
# hard_open: reconnect to DSA with exponential backoff if
# opening connection failed
# hard_init: reconnect to DSA with exponential backoff if
# initializing connection failed
# hard: alias for hard_open
# soft: return immediately on server failure
bind_policy soft
# Filter to AND with uid=%s
pam_filter objectclass=account
# The user ID attribute (defaults to uid)
pam_login_attribute uid
# Group member attribute
pam_member_attribute mememberuid
# RFC2307bis naming contexts
# Syntax:
# nss_base_XXX base?scope?filter
# where scope is {base,one,sub}
# and filter is a filter to be &'d with the
# default filter.
# You can omit the suffix eg:
# nss_base_passwd ou=People,
# to append the default base DN but this
# may incur a small performance impact.
nss_base_passwd ou=users,dc=kitty-domain,dc=com
nss_base_shadow ou=users,dc=kitty-domain,dc=com
nss_base_group ou=groups,dc=kitty-domain,dc=com
scope one
Последним штирхом в настройке клиента будет копирование с сервера конфига /etc/openldap/openldap.conf:
~ # scp 192.168.1.5:/etc/openldap/ldap.conf /etc/openldap
Теперь проверяем, доступны ли нам списки пользователей:
~ # getent passwd |grep peter
Если на клиенте виден пользователь peter, то с настройкой OpenLDAP можно закончить. В случае проверки работоспособности на сервере, вывод будет состоять из 2-х копий строк информации о пользователе peter.
UPD:
Во время использования своей реальной учетной записи, состоящей в группе wheel, я заметил, что не могу использовать команду su. Соответственно было проведено опертивное гуглирование на тему данной проблемы и было найдено решение. Состоит оно в редактировании еще одного файла, отвечающего за параметры аутентификации в системе: /etc/pam.d/su. Нужно добавить следующие строки (если они отутствуют):
auth sufficient pam_rootok.so
auth required pam_wheel.so
auth required pam_env.so
auth sufficient pam_ldap.so
auth required pam_deny.so
NFS и Automounter
Как и в случае с серверной частью, настройка NFS и Automounter оказывается относительно простой.
Для начала устанавливаем пакет net-fs/autofs:
~ # emerge -av net-fs/autofs
Немного отредактируем конфигурационный файл /etc/autofs/auto.master и раскомментируем строку
/home /etc/autofs/auto.home
Далее добавляем в /etc/autofs/auto.home следующую строчку:
192.168.1.5:/home/
Теперь стартуем необходимые сервисы и добавляем их в автозагрузку:
~ # /etc/init.d/rpc.statd start
~ # /etc/init.d/autofs start
~ # rc-update add rpc.statd default
~ # rc-update add autofs boot
Теперь можно проверить работоспособность нашей настройки:
Server:
peter@kitty-house ~ $ echo "Test" > test
Client:
peter@kitty-ps3 ~ $ ls -l
total 4
-rw-r--r-- 1 peter peter 5 Aug 19 01:07 test
peter@kitty-ps3 ~ $ cat test
Test
Используемая документация.
- Gentoo Guide to OpenLDAP Authentication.
- Настройка OpenLDAP и его взаимодействиия с сетевыми сервисами (ldap auth pam ssl samba squid apache).
- LXF’04 2008 Статья “Защитим вход в Dovecot”.
- LXF’05 2008 Статья “LDAP: /home виден издалека”.

HOWTO Gentoo, OpenLDAP, Automounter. by Anton “Garfeild” Kolchunov is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
Based on a work at garfeild.ru.
