Интеграция сетевых служб с LDAP
Андрей Афлетдинов
[email protected]
Этот документ - попытка описать как под Linux можно упростить администрирование системы используя директории openLDAP. Если у вас клиенты Windows пользуются почтой, и вы хотите чтобы пользователи сами меняли свои пароли, то установите сервер LDAP, включите поддержку LDAP на сервере SAMBA и авторизируйте mail сервер через LDAP сервер. И тогда пользователи стандартными средствами (панель управления/пароли) сами смогут менять свои пароли. Содержание. |
Часть 1. DNS зоны в директориях OpenLDAP.
Первое, что необходимо - это переделать Bind, чтобы он понимал LDAP директории, для этого необходимо скачать архив bind-sdb-ldap. К моменту написания документа последние версии программ которые я использовал это bind-9.2.1 и bind-sdb-ldap-0.9.
Если у вас bind-9.2.2 и выше, то обратите внимание на папку
contrib/sdb/ldap.
Распаковываем архивы.
Все ниже приведенные
действия описаны в файле bin-sdb-ldap/INSTALL.
Копируем файлы ldapdb.c в директории bin/named и ldapdb.h в bin/named/include исходников BIND. Редактируем файл bin/named/Makefile.in добавляем строки:
DBDRIVER_OBJS = ldapdb.@O@
DBDRIVER_SRCS =
ldapdb.c
DBDRIVER_INCLUDES = -I/usr/local/include
DBDRIVER_LIBS =
-L/usr/local/lib -lldap -llber -lresolv
Редактируем файл bin/named/main.c:
- находим строку #include "xxdb.h" добавляем #include<ldapdb.h>
- находим строку xxdb_init() добавляем ldapdb_init();
- находим строку xxdb_clear() добавляем ldapdb_clear();
Все.
Дальше конфигурируем и компилируем BIND так как нам это надо. Так же если выше приведенные действия Вам кажутся сложными, то уже готовый патч для версии BIND-9.2.1 лежит здесь.
Следующий этап - настройка файла named.conf и заполнение директорий LDAP. Для понимания LDAP сервером необходимых значений dns зон - копируем схему dnszone.schema в директорию схем LDAP сервера. Также следует включить схему cosine.sсhema в файл конфигурации slapd.conf.
Разберем на примере небольшую зону (sgb мой внутренний домен):
@ IN SOA book.sgb.
root.book.sgb. ( 1 8H 2H 1W
1D)
NS book.sgb.
localhost A 127.0.0.1
book A 192.168.2.1
boss A 192.168.2.11
Создаем группу DNS в директории LDAP (dc=sgb - это root_ldap директория, и это никак не связано с доменом sgb, просто совпадения :)
dn: ou=DNS,dc=sgb |
dn:
relativeDomainName=localhost,zoneName=sgb,ou=DNS,dc=sgb |
Записываем в ldif файл и добавляем в директорию командой ldapadd. Так же для управления директориями можно установить программу с графическим интерфейсом.
Разберем обратную зону 2.168.192.in-addr.arpa:
@ IN SOA book.sgb.
root.book.sgb. ( 1 8H 2H 1W
1D)
NS book.sgb.
1 PTR book.sgb.
11 PTR boss.sgb.
Описание
зоны 2.168.192.in-addr.arpa:
Все просто. Полный HOWTO по заполнению dns зон в LDAP с примерами здесь.
Осталось заменить запись зон в named.conf. Если раньше было так:
zone "sgb" in {
type
master;
files "db.sgb";
};
zone
"2.168.192.in-addr.arpa" in {
type
master;
files "db.2.168.192";
};
Заменяем:
zone "sgb" in {
type
master;
database "ldap
ldap://127.0.0.1/zoneName=sgb,ou=DNS,dc=sgb 178600";
};
zone
"2.168.192.in-addr.arpa" in {
type
master;
database "ldap
ldap://127.0.0.1/zoneName=2.168.192.in-addr.arpa,ou=DNS,dc=sgb
178600";
};
Число 178600 это TTL для всех записей где неопределен dNSTTL.
Часть 2. Настройки Sendmail в директориях openLDAP.
Если вы используете sendmail из дистрибутива, то скорее всего он уже скомпилирован с поддержкой LDAP, проверяем:
sendmail -d0.1 -bv
root | grep LDAP
В результате должны увидеть строку содержащей слово LDAPMAP. У меня на локальной машине стоит mandrake-8.2 и sendmail уже был собран с поддержкой LDAP.
В противном случае собираем sendmail из исходников. Для этого, перед компиляцией, необходимо добавить в файл devtools/Site/site.config.m4 следующие строки:
APPENDDEF(`confMAPDEF',
`-DLDAPMAP')
APPENDDEF(`confLIBS', `-lldap
-llber')
APPENDDEF(`confINCDIRS',
`-I/usr/local/include')
APPENDDEF(`confLIBDIRS',
`-L/usr/local/lib')
Соответственно должны быть уже установлены библиотеки openLDAP, измените путь usr/local там где они у вас находится. Настройка sendmail сводится к добавлению строк в файл конфигурации sendmail.mc, с последующим его преобразованием в cf.
-информация о сервере LDAP (ldap.sgb -
сервер LDAP, dc=sgb root директория)
define(`confLDAP_DEFAULT_SPEC',`-h
ldap.sgb -b dc=sgb')dnl
-для
aliases
define(`ALIAS_FILE',`ldap:')dnl
-для
access
FEATURE(`access_db',`LDAP')dnl
Если используем virtusertable, domaintable и т.д.,то для них тоже самое по аналогии с access. Ориентируемся по таблице:
FEATURE | sendmailMTAMapName | |
access_db | LDAP | access |
authinfo | LDAP | authinfo |
bitdomain | LDAP | bitdomain |
domaintable | LDAP | domain |
genericstable | LDAP | generics |
mailertable | LDAP | mailer |
uucpdomain | LDAP | uucpdomain |
virtusertable | LDAP | virtuser |
Я кроме aliases и access ничего больше не использовал в связи с простотой моего локального сервера sendmail.
На стороне сервера LDAP необходимо добавить схему sendmail.schema в директорию схем и внести путь в конфигурационный файл slapd.conf.
Заполняем директории LDAP.
Создаем группу mail. В ней у нас будут находится все связанное с sendmail
dn: ou=mail,dc=sgb |
Создаем группу aliases. В ней будут храниться записи aliases
dn: ou=aliases,ou=mail,dc=sgb |
Создаем группу access. В ней будут хранится записи access
dn: ou=access,ou=mail,dc=sgb |
Все эти записи, вносим в ldif файл и добавляем в каталоги LDAP комадой ldapadd, либо используем программы с графическим интерфейсом.
Aliases.
Разберем на примере файл aliases:
bin: |
root |
daemon: |
root |
games: |
root |
nobody: |
root |
system: |
root |
manager: |
root |
root: |
andrek |
Описание записи bin
Описание записи daemon
В поле sendmailMTAHost указываем имя sendmail сервера, для которого действует альяс. Остальные альясы (games, nobody, manager и т.д.) вносим аналогично.
Access.
Разберем на примере файл access.
localhost.localdomain |
RELAY |
localhost |
RELAY |
127.0.0.1 |
RELAY |
192.168.2 |
RELAY |
Описание записи localhost.localdomain
Описание записи 192.168.2
Остальные записи (localhost, 127.0.0.1 и т.д.) также аналогичны.
Virtusertable, mailertable, domaintable и т.д.
Заносятся по аналогии с access. С изменением поля sendmailMTAKey (см. таблицу) и необходимых значений в sendmailMTAKey и sendmailMTAValue. Так же это все достаточно хорошо описано с примерами в документации к sendmail.
Учетные записи пользователей
На сервере sendmail достаточно включить авторизацию пользователей LDAP:
- Ставим клиента ldap, nss_ldap.
- Правим файлы ldap.conf, nssswith.conf.
После этого добавление пользователей сведется к добавлению учетных записей в каталог LDAP. Администратору останется только прописать нужные альясы на пользователей.
Часть 3. Интеграция сервера SAMBA-2.2.X в директории LDAP.
1. Действия на стороне LDAP сервера.
Копируем из исходников samba схему .../examples/LDAP/samba.schema в каталог схем сервера LDAP. Также для ее правильной работы необходимы cosine.schema и inetorgperson.schema, добавляем соответствующие записи в slapd.conf.
Установите доступ на чтение полей (lmpassword, ntpassword) только администратору.
Редактируем файл slapd.conf:
access to dn=".*,dc=sgb"
attr=lmPassword
by dn="cn=admin,dc=sgb" write
by self write
by *
auth
access to dn=".*,dc=sgb" attr=ntPassword
by
dn="cn=admin,dc=sgb" write
by self write
by * auth
Перезапускаем LDAP, для принятия изменений.
2. Действия на стороне Samba сервера.
Устанавливаем пакеты openldap, openldap-client, openldap-devel. Перекомпилируем Самбу с опциями --with-ldapsam. В конфигурационном файле smb.conf, определяем следующие опции:
[global]
ldap server =
ldap.sgb
ldap suffix = dc=sgb
ldap admin dn =
cn=admin,dc=sgb
ldap filter =
(&(uid=%u)(objectclass=sambaAccount))
ldap port = 389
ldap ssl =
no
Таким образом SAMBA будет взаимодействовать с сервером LDAP от имени учетной записи администратора LDAP. Лучшим решением будет создание отдельной учетной записи (samba_admin) на сервере LDAP, которая имееет право на чтение-запись необходимых полей. Запускаем сервер samba, и сохраняем пароль администратора командой:
smbpasswd -w пароль admin
Все! Дальше работаем с ним удаленно.
3. Действия на стороне компьютера сисадмина.
Устанавливаем пакет openldap-client. Создаем smb клиентов. Для каждого достаточно создать что нибудь похожее на это:
dn:
uid=sandy,ou=Users,dc=sgb
objectClass: top
objectClass:
posixAccount
objectClass: sambaAccount
homeDirectory:
/home/sandy
uidNumber: 502
gidNumber: 502
uid:
sandy
pwdLastSet: 1036581625
logonTime: 0
logoffTime:
2147483647
kickoffTime: 2147483647
pwdCanChange: 0
pwdMustChange:
2147483647
displayName: SandySandy
cn: SandySandy
rid:
2004
primaryGroupID: 2005
lmPassword:
B3174F63722E157EAAD3B435B51404EE
ntPassword:
6AAB3EA1D7A717FF9A3BFC222B846A7B
acctFlags: [UX]
loginShell:
/bin/false
Обратите внимание на Account Flags ( U - пользовательский аккаунт, D - учетная запись заблокирована, N - без использования пароля, W - машинная учетная запись).
Записать в ldif файл, и добавить информацию в директорию LDAP. По теории проверенной практикой пользователь sandy уже может подключиться к sambe.
Этот трудоемкий путь нам не подойдет, скачиваем пакет скриптов smbldap-tools, либо если у вас samba одна из последних версий смотрим в examples/LDAP/smbldap-tools. В нем уже есть набор необходимых утилит:
- smbldap-groupadd.pl
- smbldap-groupdel.pl
- smbldap-groupmod.pl
- smbldap-groupshow.pl
- smbldap-useradd.pl
- smbldap-userdel.pl
- smbldap-usermod.pl
- smbldap-usershow.pl
Названия говорят сами за себя. Для того чтобы ими воспользоваться необходимо отредактировать значения в smbldap_conf.pm:
#
# UID
and GID starting at...
#
$UID_START = 2000;
$GID_START =
2000;
#
# Slave LDAP : needed for read
operations
#
$slaveLDAP = "ldap.sgb";
#
# Master LDAP :
needed for write operations
#
$masterLDAP =
"ldap.sgb";
#
# LDAP Suffix
#
$suffix =
"dc=sgb";
#
# Where are stored Users
#
$usersou =
q(Users);
$usersdn = "ou=$usersou,$suffix";
#
# Where are
stored Computers
#
$computersou = q(Computers);
$computersdn =
"ou=$computersou,$suffix";
#
# Where are stored Groups
#
$groupsou = q(Group);
$groupsdn =
"ou=$groupsou,$suffix";
#
# Credential Configuration
#
#
Bind DN used
$binddn = "admin";
#
# Bind DN passwd
used
$bindpasswd = "secret";
# Login defs
#
# Default
Login Shell
#
$_userLoginShell = q(/bin/bash);
#
# Home
directory prefix (without username)
#
$_userHomePrefix =
q(/home/);
#
# Default User (POSIX and Samba)
GID
#
$_defaultUserGid = 2000;
#
# Default Computer
(Samba) GID
#
$_defaultComputerGid = 553;
#
# The UNC path
to home drives location without the username last extension
# (will be
dynamically prepended)
$_userSmbHome = q(\\a\homes);
#
# The
UNC path to profiles locations without the username last extension
#
(will be dynamically prepended)
$_userProfile =
q(\\a_\profiles\);
#
# The default Home Drive Letter
mapping
# (will be automatically mapped at logon time if home directory
exist)
$_userHomeDrive = q(H:);
#
# Allows not to use
smbpasswd (if $with_smbpasswd == 0 in smbldap_conf.pm) but
# prefer
mkntpwd... most of the time, it's a wise choice :-)
$with_smbpasswd =
0;
$smbpasswd = "/usr/bin/smbpasswd";
$mk_ntpasswd =
"/usr/local/sbin/mkntpwd";
и т.д.
Обратите внимание на последний параграф - используется утилита mkntpwd. Ее исходники есть в smbldap-tools. Так же группы Users, Group, Computers должны быть уже созданы:
dn: ou=Users,dc=sgb
objectClass:
top
objectClass: organizationalUnit
ou: Users
dn:
ou=Group,dc=sgb
objectClass: top
objectClass:
organizationalUnit
ou: Group
dn:
ou=Computers,dc=sgb
objectClass: top
objectClass:
organizationalUnit
ou: Computers
4. Пользователи меняют сами свои пароли.
Устанавливаем и настраиваем пакет скриптов smbldap-tools, на севере SAMBA. В конфигурационный файл smb.conf добавляем строки:
passwd
program = /usr/local/bin/smbldap-passwd.pl %u
unix password sync =
yes
passwd chat = *new*password* %n\n *new*password* %n\n
*updated*successfully*
Обратите внимание на passwd chat. Эти значения нам возвращает smbldap-passwd.pl при смене пароля.
После этого, перегружаем сервис для принятия изменений. Теперь пользователи могут сами поменять свои пароли через сервис панель управления-пароли.
5. Мусорная корзина
С самого начала создания файлового сервера, моим пользователям, "любители хранить самое ценное в мегабайтных корзинах", нехватало именно этого - мусорной сетевой корзины. Сначало я не задавался этим вопросом: в виндовсе нет, значит и в самбе тоже нет и написал скрипт для архивации /home. Но каково было мое удивление когда изучая материалы по examples/LDAP и мимолетом осматривая остальные каталоги - увидел знакомое слово recycle.
Вся ниже следующая информация взята из examples/VFS/recycle/README
- конфигурируем самбу source/configure
- конфигурируем VFS examples/VFS/configure
- компилируем cd examples/VFS; make
Необходимый нам модуль recycle.so собран в каталоге recycle.
Настройка сводится к добавлению ресурсу следующих строк:
vfs
object = /usr/share/samba-2.2.6/recycle.so
vfs options =
/etc/samba/recycle.conf
Пример recycle.conf:
# Название recycle bin относительно
ресурса
name = .recycle/%U
# максимальный размер файла (0 без
проверки)
maxsize = 0
# KEEP_DIRECTORIES = сохранить иерархию
директорий
# VERSIONS = создавать копии идентичных файлов
# TOUCH =
touch access date of files moved into the recycle bin
mode =
KEEP_DIRECTORIES|VERSIONS|TOUCH
# пропускать файлы:
exclude =
*.tmp|*.temp|*.o|*.obj|~$*
# пропускать папки:
excludedir =
/tmp|/temp|/cache
# Add file extensions of files where no
versioning is wanted (i.e. copy # 1...)
# only valid when mode=VERSIONS
is set
noversions = *.doc|*.xls|*.ppt
Запускаем самбу, и наслаждаемся.
Так же могут быть интересны модули audit.so block.so.
audit.so -
модуль ведения логов на следующие операции:
- share connect/disconnect
- directory opens/create/remove
- file open/close/rename/unlink/chmod.
После того как будет заведена база пользователей, можно воспользоваться услугами адресной книги. Я воспользовался клиентом KMail для проверки, после непродолжительного поиска в список попали все пользователи включая и samba пользователей. Но с незаполнеными полями mail, address и т.д. Что не трудно исправить, добавив схему inetorgperson.schema и заполнив соостветствующие поля.
Скачиваем последнюю версию пакета dhcp.
Скачиваем патч для
dhcpd.
На момент написания документа последняя версия dhcpd-3.0.1rc11.
Если у вас более свежая версия посетите сайт разработчиков, и загрузите необходимый патч.
Перед компиляцией раскомментируем строку #define LDAP_CONFIGURATION в файле includes/site.h. Запускаем ./configure. Добавляем в файл linux-2.2/server/Makefile слово -lldap в LIBS= линию.
Все эти действия описаны в readme.ldap. Далее make и make install.
Содержание нового конфигурационного файла dhcpd.conf будет таким:
ldap-server "ldap.sgb";
ldap-port 386;
ldap-username
"cn=dhcp,dc=iarz";
ldap-password "blabla";
ldap-base-dn
"dc=iarz";
ldap-method dynamic;
Действия на стороне ldap сервера.
Копируем файл contrib/dhcp.schema в каталог схем, и добавляем необходимые записи в slapd.conf. Ограничим права на информацию только для администратора dhcp.
access to dn=".*,ou=dhcp,dc=iarz"
by
dn="cn=dhcp,dc=iarz" write
by self write
by * auth
Создаем пользователя dhcp и группу dhcp где будет хранится нужная информация, вот примерный ldif файл:
dn:
cn=dhcp,dc=iarz
objectClass: top
objectClass: person
sn: DHCP
Administrator
cn: dhcp
dn: ou=dhcp,dc=iarz
objectClass:
top
objectClass: organizationalUnit
ou: dhcp
Незабудьте задать пароль для пользователя dhcp.
Далее загружаем информацию зон dhcp в ldap. Рассмотрим на примере небольшой (старый) файл конфигурации dhcp.conf:
option
domain-name "iarz";
option domain-name-servers
ns.iarz;
ddns-update-style interim;
default-lease-time
32400;
max-lease-time 64800;
key DHCP_UPDATER
{
algorithm
HMAC-MD5.SIG-ALG.REG.INT;
secret
SgBXABCDEFGHIJKLMNB75A==; }
zone iarz.
{
primary
127.0.0.1;
key DHCP_UPDATER; }
zone
0.0.192.IN-ADDR.ARPA. {
primary
127.0.0.1;
key DHCP_UPDATER; }
subnet
192.168.1.0 netmask 255.255.255.0 {
option
routers 192.168.1.1;
option subnet-mask
255.255.255.0;
range dynamic-bootp 192.168.1.60
192.168.1.90; }
subnet 192.168.2.0 netmask 255.255.255.0
{
option routers
192.168.2.1;
option subnet-mask
255.255.255.0;
range dynamic-bootp 192.168.2.60
192.168.2.90; }
Для его трансформации в ldif файл, можно воспользоваться перловым скриптом (находится тамже), но он не дает той гибкости необходимой нам.
Как делал я: смотрел в генеренный файл, писал свой и отслеживал ошибки в /var/log/message. Ниже приведен аналогичный ldif файл для загрузки:
Все, можно запускать service dhcp start. Если не пошло, читаем readme.ldap и /var/log/messages при запуске сервера. Здесь нет информации по присвоению ip-mac адресов, добавлю позже, но это не трудно поднять самим после ознакомления с документацией.
1. Авторизация используя модуль NTLM через Windows домен.2. Авторизиция используя модуль LDAP.
...
Почти готово
Тестируем :)
...
Ссылки на использованную документацию и программы.
- Bind.
- Сайт разработчиков bind-sdb-ldap http://garibaldi.venaas.priv.no/ldap/bind-sdb/
- HOWTO по заполнению зон в директории LDAP http://garibaldi.venaas.priv.no/ldap/bind-sdb/dnszonehowto.html
- Патч для исходников bind-9.2.1 http://www.ldapzone.spb.ru/download/bind_ldap.patch
- Сам архив bind-sdb-ldap-0.9
- Схема dnszone.schema
- Sendmail.
- основное руководство - sendmail/cf/README
- схема для LDAP - sendmail/cf/sendmail.schema
- Дополнительный источник http://logout.sh/computers/sendmail
- Samba.
- Основной источник файлы README в каталогах samba-2.2.x/examples/LDAP и samba-2.2.x/examples/VFS.
- Пакет скриптов smbldap-tools http://samba.idealx.org/
- DHCP.
- Сайт разработчиков патча dhcp http://home.ntelos.net/~masneyb
- схема для LDAP в директории иходников - contrib/dhcp.schema
- Клиент LDAP с графической оболочкой для linux http://biot.com/gq
- Клиент LDAP с графической оболочкой для Windows http://www.ldapadministrator.com/