Настройки всего с LDAP

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску

Информацию по работе с этой вики можно найти в руководстве пользователя.

Страницы документации сообщества администраторов drivesource.ru

замечания и предложения присылайте на почту svschwartz {at} gmail {dot} com

Для начала напишу маленький howto о том как быстро и просто поднять ldap + samba
Все действия выполняются на платформе Ubuntu Gutsy Gibbon 7.10
Теперь уже Hardy Heron 8.04 :)

Все команды выполняются "от рута". Чтобы стать рутом в убунте выполните команду

sudo bash # увас запросят ВАШ пароль, а не пароль пользователя root

Апгрейд Gutsy Gibbon 7.10 до Hardy Heron 8.04 LTS

Устанавливаем утилиту update-manager-core

aptitude install update-manager-core

Запускаем апгрейд

do-release-upgrade

Далее следуйте инструкциям в терминале :)


Сервер директорий OpenLDAP

Устанавливаем софт

apt-get install slapd ldap-utils smbldap-tools samba smbfs samba-doc

Конфигуратор системы запросит "Пароль администратора" - просто нажмите enter два раза - пароль администратора мы укажем позже.

Пара слов о пакетах. Пакет slapd - это непосредственно сервер директорий OpenLDAP.
ldap-utils - набор стандартных клиентских утилит таких как ldapsearch.
smbldap-tools - набор perl скриптов для управления данными в сервере директорий.
samba - собственно сервер протокола виндузятнегов CIFS
smbfs - модули ядра для монтирования ресурсов по протоколу CIFS
samba-doc - доки по samba. В его составе есть схема /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz необходимая для создания обектов samba.


Настраиваем сервер директорий

Распаковываем схему samba

zcat /usr/share/doc/samba-doc/examples/LDAP/samba.schema.gz > /etc/ldap/schema/samba.schema

Сгенерируем хеш пароля администратора

slappasswd

Отредактируем конфигурацию сервера OpenLDAP - файл /etc/ldap/slapd.conf

# секция
# Schema and objectClass definitions
# добавляем пару схем
include         /etc/ldap/schema/misc.schema
include         /etc/ldap/schema/samba.schema

# для начала пускай сервер будет разговорчивым
loglevel 256

# переходим в раздел описания хранилища
database hdb

# укажем корень дерева для домена drivesource.ru
suffix "dc=drivesource,dc=ru"

# укажем DN администратора 
rootdn "cn=admin,dc=drivesource,dc=ru"
# здесь же запишем хеш пароля администратора сгенерированный ранее
rootpw "{SSHA}i/dxtpiLHF9bTJ4LET7uuYkm7YZFoAny"

# индексирование влияет на производительность, так что советую сразу их задать
# Indices to maintain for this database
index objectClass                       eq,pres
index ou,cn,sn,mail,givenname   	eq,pres,sub
index uidNumber,gidNumber,memberUid     eq,pres
index loginShell			eq,pres
## required to support pdb_getsampwnam
index uid                     		pres,sub,eq
## required to support pdb_getsambapwrid()
index displayName             		pres,sub,eq
index nisMapName,nisMapEntry            eq,pres,sub
index sambaSID              		eq
index sambaPrimaryGroupSID 		eq
index sambaDomainName       		eq
index default              		sub



# далее идут прочие параметры для тонкой настройки, пока углубляться в них не будем перейдем к настройкам доступа ACL
# алгоритм применения правил - кто первый подходит, тот и применяется - сверху вниз по конфигу
# так что сначала применяем самые жесткие правила
access to attrs=userPassword,sambaLMPassword,sambaNTPassword,sambaPwdMustChange,sambaPwdLastSet
        by dn="cn=admin,dc=drivesource,dc=ru" write
        by anonymous auth
        by self write
        by * none
# правило написаное выше разрешает администратору запись перечисленных атрибутов
# клиентам не прошедших аутентификацию - принуждает пройти аутентификацию
# владельцам атрибутов - так же разрешено записывать их
# все остальные - доступ запрещен

# это правило необходимо для корректной работы политик срока давности паролей
access to attrs=shadowLastChange,shadowMax
      by dn="cn=admin,dc=drivesource,dc=ru" write
      by self write
      by * read


# данное правило необходимо для получения информации об особенностях сервера такие как supportedSASLMechanisms
access to dn.base="" by * read

# последнее правило на сегодня разрешает чтение атрибутов для всех категорий клиентов и запись для администратора
access to *
        by dn="cn=admin,dc=drivesource,dc=ru" write
        by * read

На всякий пожарный ограничим доступ к серверу только на localhost
В файле /etc/default/slapd

SLAPD_SERVICES="ldap://127.0.0.1:389/"

Теперь когда все настроено правильно запустим сервер

# сначала остановим сервер
/etc/init.d/slapd stop
# удалим файлы который были созданы для конфига из коробки
rm -rf /var/lib/ldap/*
# стартуем сервер
/etc/init.d/slapd start

Удостоверимся что сервер стартовал и забиндился на интерфейс lo

netstat -atnp | egrep slap

Вывод команды должен быть следующего вида

tcp        0      0 127.0.0.1:389           0.0.0.0:*               LISTEN      15271/slapd     

Если сервер не стартовал и как то поругался в терминал смотрите логи в /var/log/debug или /var/log/messages

Посмотрим на содержание директории и работоспособность админского доступа

ldapsearch -h localhost -b "dc=drivesource,dc=ru" -D "cn=admin,dc=drivesource,dc=ru" -x -W '(objectClass=*)'
Enter LDAP Password: 
# extended LDIF
#
# LDAPv3
# base <dc=drivesource,dc=ru> with scope subtree
# filter: (objectClass=*)
# requesting: ALL
#

# search result
search: 2
result: 32 No such object

# numResponses: 1

Наш каталог пока что пуст, поэтому и объектов не найдено, но сервер работает и отвечает на запросы.

Настраиваем журнал syslog

В файл /etc/syslog.conf добавим строку

local4.*                        /var/log/slapd.log

Теперь необходимо рестартовать сервер журналов

/etc/init.d/syslog restart

Теперь сообщения от сервера OpenLDAP можно смотреть в файле /var/log/slapd.log

Настраиваем скрипты smbldap-tools

Распакуем примеры конфигурационных файлов

cd /usr/share/doc/smbldap-tools/examples
zcat smbldap.conf.gz > /etc/smbldap-tools/smbldap.conf
cp smbldap_bind.conf /etc/smbldap-tools/

В файле /etc/smbldap-tools/smbldap_bind.conf нужно указать dn и пароль админа

masterDN="cn=admin,dc=drivesource,dc=ru"
masterPw="password"

Не забудьте ограничить доступ к конфигу

chmod 0400 /etc/smbldap-tools/smbldap_bind.conf

Получим SID для нашего сервера

net getlocalsid

Основной конфиг скриптов /etc/smbldap-tools/smbldap.conf

# 
# Секция General Configuration
#
# первым делом указываем SID рабочей группы виндовз
SID="S-1-5-21-1281770608-2748599951-4138892180"

# затем собственно рабочую группу
sambaDomain="DRIVESOURCE"

#
# Секция LDAP Configuration
#
# ip адрес нашего сервера
masterLDAP="127.0.0.1"
# порт сервера
masterPort="389"

# корень сервера директорий
suffix="dc=drivesource,dc=ru"

#
# Секция SAMBA Configuration
#
# путь к каталогу пользователя в сетях виндовз
userSmbHome="\\daemon\%U"
# то же самое для профиля
userProfile="\\daemon\profiles\%U"
# домен электронной почты, используемый по умолчанию
mailDomain="drivesource.ru"

Итак теперь когда скрипты настроены правильно и сервер директорий работает заполним каталог первичными данными, для чего выполним команду

smbldap-populate

Результатом выполнения команды будет примерно следующее

Populating LDAP directory for domain DRIVESOURCE (S-1-5-21-1281770608-2748599951-4138892180)
(using builtin directory structure)

adding new entry: dc=drivesource,dc=ru
adding new entry: ou=Users,dc=drivesource,dc=ru
adding new entry: ou=Groups,dc=drivesource,dc=ru
adding new entry: ou=Computers,dc=drivesource,dc=ru
adding new entry: ou=Idmap,dc=drivesource,dc=ru
adding new entry: uid=root,ou=Users,dc=drivesource,dc=ru
adding new entry: uid=nobody,ou=Users,dc=drivesource,dc=ru
adding new entry: cn=Domain Admins,ou=Groups,dc=drivesource,dc=ru
adding new entry: cn=Domain Users,ou=Groups,dc=drivesource,dc=ru
adding new entry: cn=Domain Guests,ou=Groups,dc=drivesource,dc=ru
adding new entry: cn=Domain Computers,ou=Groups,dc=drivesource,dc=ru
adding new entry: cn=Administrators,ou=Groups,dc=drivesource,dc=ru
adding new entry: cn=Account Operators,ou=Groups,dc=drivesource,dc=ru
adding new entry: cn=Print Operators,ou=Groups,dc=drivesource,dc=ru
adding new entry: cn=Backup Operators,ou=Groups,dc=drivesource,dc=ru
adding new entry: cn=Replicators,ou=Groups,dc=drivesource,dc=ru
adding new entry: sambaDomainName=DRIVESOURCE,dc=drivesource,dc=ru

Please provide a password for the domain root: 
Changing UNIX and samba passwords for root
New password: 
Retype new password: 

Пользователь root для которого запросят ввести пароль - это учетная запись в сервере директорий, а не админ хост системы.

Посмотрите теперь что появилось в нашей базе каталогов

ldapsearch -h localhost -b "dc=drivesource,dc=ru" -D "cn=admin,dc=drivesource,dc=ru" -x -W '(objectClass=*)'

Так же выполните поиск анонимно, то есть без авторизации

ldapsearch -h localhost -b "dc=drivesource,dc=ru" -x '(objectClass=*)'

Обратите внимание что во втором случае атрибуты userPassword,sambaLMPassword,sambaNTPassword,sambaPwdMustChange,sambaPwdLastSet
не доступны для просмотра, это действие ACL которые мы прописали в конфиге сервера директорий.

Браузер сервера каталогов phpLDAPadmin

Итак правильно настроенная система, сервер OpenLDAP и скрипты smbldap-tools вполне рабочее решение с которым можно жить и строить. Но согласитесь что в современном мире правит GUI. Так что предлагаю воспользоваться достижениями современников и установить phpLDAPadmin для таких задачь как просмотр дерева и правка некоторых атрибутов вроде cn.

phpLDAPadmin как вы уже наверное догадываетесь веб приложение, свежие версии которого созданы с использованием технологии AJAX - YO! :)


Установка необходимого софта

В консоли от рута

apt-get update
apt-get install apache2-mpm-prefork libapache2-mod-php5 php5-ldap
/etc/init.d/apache2 restart

Итак мы установили apache2 собранный как mpm-prefork, не спрашивайте меня почему, на сколько я помню для php это оптимальный вариант. Так же установили php5(libapache2-mod-php5) и модуль к нему для работы с ldap(php5-ldap).

Создадим файл /var/www/phpinfo.php следующего содержания

<?php

phpinfo();

?>

Теперь в браузере наберите адрес http://yourserver/phpinfo.php - получите страницу с настройками php. Убедитесь что там присутствует модуль ldap

Установка phpLDAPadmin

На сайте проэкта http://phpldapadmin.sourceforge.net/ зайдите в раздел Downloads и скачайте latest release.

На данный момент выглядит это так

wget cdhttp://dfn.dl.sourceforge.net/sourceforge/phpldapadmin/phpldapadmin-1.1.0.5.tar.gz
tar -xzf phpldapadmin-1.1.0.5.tar.gz 
mv phpldapadmin-1.1.0.5 /var/www/pla
chown -R www-data.www-data /var/www

Теперь он доступен по адресу http://yourserver/pla

Настройка phpLDAPadmin

Настраивается phpLDAPadmin по всякому, опций тьма. Возьмем за основу конфиг "из коробки".

cd /var/www/pla/config
cp config.php.example config.php

Для нас главное сейчас описать наш сервер каталогов и как пройти аутентификацию.

// опции которые я здесь компактно выписал начинаются примерно с 151 строки конфига
$i=0;

// $i=0 означает просто порядковый номер в массиве, так принято в программировании что считать начинают с нуля :)
// создаем экземпляр класса, надеюсь никому не нужно обьяснять принципы ООП? отлично :)
$ldapservers = new LDAPServers;

// укажем название или по другому алиас для нашего сервера
$ldapservers->SetValue($i,'server','name','DRIVE LDAP Server');

// ip адрес
$ldapservers->SetValue($i,'server','host','127.0.0.1');

// порт
$ldapservers->SetValue($i,'server','port','389');

//а теперь нам предлагают выбрать вариант аутентификации - всего их 4. Я выбрал авторизацию по конфигу для удобства.
$ldapservers->SetValue($i,'server','auth_type','config');
$ldapservers->SetValue($i,'login','dn','cn=admin,dc=drivesource,dc=ru');
$ldapservers->SetValue($i,'login','pass','password');
$ldapservers->SetValue($i,'server','tls',false);

// не показывать ссылки для модификации чеголибо
$ldapservers->SetValue($i,'server','read_only',true);

// не показывать ссылки для создания записей
$ldapservers->SetValue($i,'appearance','show_create',false);


Наша цель в первую очередь ознакомительная. Но phpLDAPadmin очень хороший и гибкий инструмент и уж как его использовать личное дело каждого администратора.
А пока что хватит самой простой настройки. Мы сможем просматривать дерево каталогов и значения атрибутов. Запись по умолчанию заблокирована.
Обратите внимание что настройки прав в phpLDAPadmin и ACL в OpenLDAP разные вещи!

Настройка php5

Если вы уже обновили страничку http://yourserver/pla то очень огорчились увидев вместо дерева каталогов сообщение Your php memory limit is low - currently 16M
для корректной работы phpLDAPadmin нужно подкрутить опции php в файле /etc/php5/apache2/php.ini

memory_limit = 32M

Перезапустим apache

/etc/init.d/apache2 restart

Теперь обновите страничку, все должно заработать :)

Анализ конфигурации OpenLDAP в связке с smbldap-tools

Для наглядного обзора дерева каталогов воспользуемся phpLDAPadmin.

Корень дерева составляется по имени домена. В нашем случае домен drivesource.ru и корень для каталога соответственно dc=drivesource,dc=ru.
Классы для записей такого типа следующие

objectClass: dcObject
objectClass: organization

Класс organization является структурным(structural), в то время как dcObject структурным не является(auxiliary).
Каждая запись в дереве каталогов должна в своем составе иметь хотябы один структурный класс.
Подробное описание класса можно посмотреть в phpLDAPadmin в разделе схема или в дереве каталогов напротив каждого класса есть ссылка на описание i.

Следующая ступень в иерархии каталогов это подразедел(ou - organizationalUnit)

objectClass: top
objectClass: organizationalUnit

Данные которые интересуют администратора прежде всего это учетные записи пользователей, групп пользователей и компьютеров в домене.
Структура дерева каталогов довольно стандартна и названия подразделов говорит само за себя

# Users, drivesource.ru
dn: ou=Users,dc=drivesource,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: Users

# Groups, drivesource.ru
dn: ou=Groups,dc=drivesource,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: Groups

# Computers, drivesource.ru
dn: ou=Computers,dc=drivesource,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: Computers

# Idmap, drivesource.ru
dn: ou=Idmap,dc=drivesource,dc=ru
objectClass: top
objectClass: organizationalUnit
ou: Idmap

До сих пор мы рассматриваем стандартные обьекты которые существовали еще на заре становления протокола LDAP. Все как и 20 лет назад.
Самое интерестное это конечно же записи которые состоят из классов необходимых для UNIX и для SAMBA одновременно.
Это та самая фича ради которой затевался весь сыр бор :)

Итак рассмотрим учетную запись root которая хранится в нашем сервере каталогов.

# root, Users, drivesource.ru
dn: uid=root,ou=Users,dc=drivesource,dc=ru
cn: root
sn: root
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: sambaSamAccount
objectClass: posixAccount
objectClass: shadowAccount
gidNumber: 0
uid: root
uidNumber: 0
homeDirectory: /home/root
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
sambaHomePath: \\daemon\root
sambaHomeDrive: H:
sambaProfilePath: \\daemon\profiles\root
sambaPrimaryGroupSID: S-1-5-21-1281770608-2748599951-4138892180-512
sambaSID: S-1-5-21-1281770608-2748599951-4138892180-500
loginShell: /bin/false
gecos: Netbios Domain Administrator
sambaAcctFlags: [U]
shadowLastChange: 14001
shadowMax: 45

Учетная запись root в своем составе имеет классы необходимые для UNIX это posixAccount и shadowAccount.
Класс необходимый для SAMBA это sambaSamAccount. Прочие классы содержат атрибуты с такими данными как имя, фамилия, телефон и т.п.
Атрибуты хранят довольно непонятные значения, так что создавать записи вручную настоятельно не рекомендуется. Но знать что и как хранится в сервере каталогов очень полезно.

Накопленный опыт разработчиков smbldap-tools позволяет нам лекго выполнять административные задачи с использованием сервера каталогов.
Более того стандартной конфигурации достаточно для потребностей широкого круга. Просто берем готовое решение и пользуемся.


Прокси сервер Squid с авторизацией пользователей в OpenLDAP

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

Устанавливаем софт

apt-get install squid

Правим файл конфигурации /etc/squid/squid.conf

# секция authparam
# у сквида имеется набол хелперов, которые отрабатывают аутентификацию, интерфейс простой.
# запускаете бинарный файл с параметрами, он ожидает строки "user password" в бесконечном цикле
# если аутентификация будет успешной то напечатает ОК иначе ERR
# итак хелпер ldap_auth -b "база поиска" -v версияпротокола -h хост 
auth_param basic program /usr/lib/squid/ldap_auth -b "ou=Users,dc=drivesource,dc=ru" -v 3 -h daemon
auth_param basic children 5
auth_param basic realm Squid proxy-caching web server
auth_param basic credentialsttl 2 hours
auth_param basic casesensitive off

# то что мы настроили аутентификацию еще не значит что она применяется
# для сквида нужно сформулировать правила доступа ACL похожие на такие же у OpenLDAP
# подробно рассматривать не стану, просто приведу рабочий экземпляр
# добавим наши правила в конце #Recommended minimum configuration:
# my acls
acl password proxy_auth REQUIRED

#  TAG: http_access 
# my access
http_access allow password

Установка BugZilla

Для Ubuntu Server практически все основные компоненты уже установлены.
Скачайте с сайта http://www.bugzilla.org тарбол с багзиллой и русификацией.
На данный момент версия крайней стабильной багзиллы 3.0.4, русификация для нее 3.0.4-ru-1.0.

tar -xzf bugzilla-3.0.4.tar.gz
cd bugzilla-3.0.4
./checksetup --check-modules


Последняя команда выдаст вам информацию о модулях Perl от которых зависит работа багзиллы.
Так же расскажет какие модули обязательны а какие опциональны.

Установка модулей Perl

Мы установим практически все модули.

apt-get install libtemplate-perl libemail-send-perl libemail-mime-modifier-perl \
libgd-graph-perl libgd-text-perl libtemplate-plugin-gd-perl libgd-gd2-perl \
libhtml-scrubber-perl libmail-mboxparser-perl libxml-twig-perl libchart-perl \
perlmagick libsoap-lite-perl libnet-ldap-perl

В этом списке не хватает модулей Email-Reply, Email-MIME-Attachment-Stripper, PatchReader
Они либо отсутствуют в репозитариях Ubuntu либо я их там не нашел.

Запустите еще раз проверку модулей. Убедитесь что все необходимые модули установлены.
Запустим скрипт установки без всяких опций.

./checksetup.pl

Теперь у нас есть конфигурационный файл localconfig в котором необходимо указать параметры установки.
Для Ubuntu группа веб сервера apache2 - www-data, еще укажем пароль пользователя MySQL. Все остальное по дефолту.

$webservergroup = 'www-data';
$db_driver = 'mysql';
$db_host = 'localhost';
$db_name = 'bugs';
$db_user = 'bugs';
$db_pass = 'password';

Настроим сервер MySQL

Добавим в файл /etc/mysql/my.cnf в секции [mysqld] опцию для оптимизации индексирования

[mysqld]
# Allow small words in full-text indexes
ft_min_word_len=2

Сервер MySQL после этого необходимо перезапустить.

/etc/init.d/mysql restart


Создадим учетную запись багзиллы для базы данных MySQL.

mysql -u root -p
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER, CREATE, LOCK TABLES,
          CREATE TEMPORARY TABLES, DROP, REFERENCES ON bugs.*
          TO bugs@localhost IDENTIFIED BY 'password';
mysql> FLUSH PRIVILEGES;
mysql> \q

Настройка Apache

Создадим файл /etc/apache2/conf.d/bugz следующего содержания

<Directory /var/www/bugz>
AddHandler cgi-script .cgi
Options +Indexes +ExecCGI
DirectoryIndex index.cgi
AllowOverride Limit
</Directory>

Необходимо рестартовать веб сервер.

/etc/init.d/apache2 restart

Завершение установки bugzilla

Вернемся в папку содержащую скрипты bugzilla и запустим скрипт checksetup.pl для завершения устновки.

./checksetup.pl
Enter the e-mail address of the administrator: admin@drivesource.ru
Enter the real name of the administrator: Admin
Enter a password for the administrator account:
Please retype the password to verify:

Теперь когда база данных MySQL создана и первоначальный администратор создан можно вытащить багзиллу для доступа через веб.

cd ..
mv bugzilla-3.0.4 bugz
mv bugz /var/www
chown -R www-data.www-data /var/www/bugz

Теперь багзилла должна работать по адресу http://yourserver/bugz

Аутентификация учетных записей Bugzilla в OpenLDAP

Прежде чем править настройки багзиллы необходимо залогиниться администратором - admin@drivesource.ru
После логина перейдем по ссылке Parameters, в разделе LDAP заполним следующими значениями

LDAPserver localhost
LDAPstarttls off
LDAPbinddn
LDAPBaseDN ou=Users,dc=drivesource,dc=ru
LDAPuidattribute uid
LDAPmailattribute mail
LDAPfilter (objectClass=posixAccount)

Для сохранения изменений нажмите кнопку Save Changes внизу

Теперь в разделе User Authentication

user_verify_class LDAP,DB

Сохраните изменения, теперь попробуйте залогиниться с учетной записью из сервера каталогов.
Обратите внимание что при аутентификации через OpenLDAP указываете логин а не адрес электронной почты.


ru_RU.UTF-8 - локализация

Вся локализация заключается в установке шаблонов багзиллы переведенных на русский язык.
Скачать свежие переводы можно по адресу http://sourceforge.net/projects/bugzilla-ru/

wget http://dfn.dl.sourceforge.net/sourceforge/bugzilla-ru/bugzilla-3.0.4-ru-1.0.tar.gz
tar -xzf bugzilla-3.0.4-ru-1.0.tar.gz
mv bugzilla-3.0.4-ru-1.0/help/ /var/www/bugz/
mv bugzilla-3.0.4-ru-1.0/template/ru/ /var/www/bugz/template/
chown -R www-data.www-data /var/www/bugz

В настройках локализации багзиллы Parameters->Localization

languages ru, en
defaultlanguage en

Сохраните настройки.

Samba

Для тех кто хочет таки управлять сервером с пониманием того как и что происходт настоятельно рекомендую прочитать Samba Official How-to очень полезное чтиво.

В общем случаем сервер samba про пользователей ldap знаем мало, разработчики оставили это на совести хост системы.

Некоторые полезные ресурсы


Взято http://css.drivesource.ru/index.php/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0