Данная статья посвящена настройке Samba 3 в качестве основного
контроллера домена (PDC), все записи о пользователях которой хранятся
в LDAP-каталоге. Преимущества подобной организации очевидны -
упрощение управления пользователями, возможность делегирования
полномочий по управлению пользователями в домене, повышение
отказоустойчивости системы.
Процесс установки производился на Alt Linux Master 2.2. Поэтому есть
много специфических деталей в описании, касающиеся именно данного
дистрибутива, но тем не менее, на основе данной статьи можно поднять
данную схему на любом другом дистрибутиве.
Статья разбита на несколько частей. Первоначально будет вкратце
описана установка и настройка OpenLDAP. Затем будет описана установка
и настройка Samba 3. Ну а далее последует подробное описание каким
образом создавать и управлять пользователями в домене.
OpenLDAP
Установка
Процесс установки OpenLDAP уже описывался
(http://unix.nordcomp.ru/articles.html?id=12), поэтому заострять на
этом внимания не буду. Важно отметить что при установке openldap из
rpm не забудьте про devel-пакеты (libldap-devel), они потребуются для
сборки samba3.
Конфигурация
Пример конфигурации slapd.conf также уже приводился. Но
поскольку описываемый процесс установки производится на Alt Linux
Master 2.2, а также для того чтобы данная статья обрела некоторый
статус самостоятельности (без зависимостей :), я опишу конфигурацию
сначала, включая специфические моменты касающиеся samba3.
Также в данной конфигурации я расскажу как поднять ldap через ssl,
поскольку наиболее вероятна ситуация когда ldap-сервер и samba-сервер
расположены на различных компьютерах и трафик между ними проходит по
общедоступной сети, а следовательно должен быть защищён от разного
рода кул-хацкеров.
/etc/openldap/slapd.conf
#-----------------------slapd.conf-----------------------------------#
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
# Последняя схема samba.schema прилагается вместе с исходниками samba3
# Есть значительные отличия схемы samba2 от схемы samba3,
# поэтому использовать нужно именно схему samba3
include /etc/openldap/schema/samba.schema
pidfile /var/run/slapd.pid
argsfile /var/run/slapd.args
# Здесь включается ssl
TLSCipherSuite HIGH:MEDIUM:+SSLv2:+TLSv1
TLSCertificateFile /etc/openldap/ldap.pem
TLSCertificateKeyFile /etc/openldap/ldap.pem
database ldbm
suffix "dc=home,dc=ru"
rootdn "cn=root,dc=home,dc=ru"
# Пароль rootpw лучше всего указывать в зашифрованном виде.
# Для генерации шифрованного пароля используйте утилиту slappasswd
# Например: slappaswd -h {crypt}
rootpw {crypt}7Ly54RT33kms9.
directory /var/lib/ldap/bases
# Для начала неплохо указать высокий уровень отладки, чтобы было проще разобраться,
# если что-то пойдёт не так.
loglevel 256
index objectClass,uid,uidNumber,gidNumber eq
index cn,mail,surname,givenname eq,subinitial
# Для samba3 также рекомендуются добавить эти индексы:
index sambaSID eq
index sambaPrimaryGroupSID eq
index sambaDomainName eq
# Basic ACL
access to attr=userPassword
by self write
by anonymous auth
by * none
# Доступ к smb-паролям пользователей только админу самбы crux
access to attrs=lmPassword,ntPassword
by dn="cn=crux,ou=Users,dc=home,dc=ru" write
by * none
access to *
by * read
#----------------------------end----------------------------#
Вот собственно и весь конфигурационный файл.
Несколько слов об ssl. Чтобы включить поддержку ssl, в системе должен
быть установлен пакет openssl, а также libssl и libssl-devel
(последний потребуется для сборки samba).
Потребуется создать self-signed сертификат ldap.pem и выложить его в
каталог /etc/openldap. Важно проследить, чтобы права на этот файл были
- 400, и принадлежать он должен пользователю под которым работает
OpenLDAP (в данном дистрибутиве - пользователь ldap). В состав пакета
openldap-servers входит утилита gencert.sh (/usr/share/openldap/gencert.sh),
с помощью которой можно создать сертификат.
После того как вы настроили OpenLDAP, запустите его командой
service ldap start
Можно проверить слушает ли сеть наш сервер, запустив команду:
Как видно slapd слушает порты 389 и 636 - последний как раз относится
к соединению через защищёный канал ssl.
Samba 3
Что нового появилось в Samba 3 версии:
· - Несколько схем хранения пользовательских аккаунтов (backends).
· - Включена поддержка Kerberos 5 аутентификации и LDAP, что
позволяет самбе нативно входить в Active Directory домен (как клиент).
· - Поддержка Unicode.
· - Полная поддержка Windows NT4 domain trusts.
Надо отметить, что активно деклалируемая "поддержка Active Directory"
в Samba3, означает, что Samba3 может входить в домен Active Directory
как полноценный member (не буду употреблять русского аналога этого
слова). Но это не значит, что Samba3 может выполнять роль сервера AD.
Также по прежнему Samba не может быть полноценным BDC для PDC под
Windows NT и наоборот, поскольку пока не реализована поддержка
репликации SAM баз пользователей между Samba и NT.
Установка
В дистрибутиве Alt Master 2.2 присутствует пакет samba3, но он уже
достаточно старый и собран без поддержки ldap. Поэтому есть два
варианта действий: скачать последнюю версию сырцов samba с samba.org
(на момент написания статьи это samba-3.0.1) или взять последнюю
версию source-rpm пакета из Sisyphus. Правильнее, конечно, последний
вариант, но попытка установить на Master2.2 что-либо из Сизифа может
повлечь значительное обновление пакетов в системе. Поэтому я предпочёл
взять source-rpm пакет samba3 пересобраный из Сизифа для Master2.2.
Найти его можно здесь: ftp://212.13.100.3/pub/shrek/ALTLinux/samba3
. На момент написания статьи это был samba3-3.0-alt46.1m.src.rpm
1. Сборка samba3 из src.rpm пакета
Сборка source-rpm в Master'е производится под непривилегированным
пользователем. Хочу отметить, что даже переделанный пакет под Master
был сделан не совсем корректно. Обнаружились две "неудовлетворяемые"
зависимости: требовались пакеты db2latex-xsl и kernel-headers-std,
которых нет в Мастере. Как мне пояснили в рассылке altlinux первый
пакет необходимо было взять из Сизифа, а чтобы ликвидировать 2-ую
зависимость надо ручками исправить spec-файл, прописать вместо
kernel-headers-std - kernel24-headers. Для этого:
$ rpm -ivh samba3-3.0-alt46.1m.src.rpm
$ cd ~/RPM/SPECS
$ vi samba3.spec
Ищите в этом файле вхождение пресловутой строки "kernel-headers-std" и
меняете на "kernel24-headers". Далее
$ rpm -bb --with ldap samba3.spec
После сборки пакетов, нужно установить samba3.
$ cd ../RPMS/i686
$ su
# rpm -ivh samba3-common-3.0-alt46.1m.i686.rpm
samba3-3.0-alt46.1m.i686.rpm
samba3-client-3.0-alt46.1m.i686.rpm samba3-vfs-3.0-alt46.1m.i686.rpm
samba3-doc-3.0-alt46.1m.i686.rpm
2. Сборка из сырцов с samba.org
Если вы решили собирать samba из сырцов, то процедура эта достаточно
стандартная, важно чтобы в системе были devel-пакеты openldap, чтобы
требуемая поддержка ldap была реализована.
$ tar zxf samba-3.0.1.tar.gz
$ cd samba-3.0.1/source
$ ./configure --with-ldap (...другие опции на ваш вкус...)
$ make
$ su
# make install
Конфигурация
Приводить весь конфигурационный файл не имеет смысла, будут указаны
лишь необходимые параметры, которые необходимы для работы Samba в
качестве PDC с поддержкой LDAP.
Конфигурационный файл samba.conf
[global]
workgroup = HOMENET
netbios name = HOME
security = user
admin users = crux
# В качестве базы данных пользователей-паролей используется ldap,
# причём соединяемся с сервером ldap через TLS
passdb backend = ldapsam:ldap://ldap.home.ru
ldap suffix = dc=home,dc=ru
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap machine suffix = ou=Computers
ldap filter = (uid=%u)
ldap admin dn = "cn=root,dc=home,dc=ru"
ldap delete dn = no
ldap ssl = start tls
domain master = yes
domain logons = yes
logon script = %u.bat
logon path = \%LProfiles%u
logon drive = H:
# Настройка кирилицы
dos charset = CP866
unix charset = KOI8-R
display charset = KOI8-R
[netlogon]
comment = Network Logon Service
path = /var/lib/samba/netlogon
browseable = no
guest ok = yes
writable = no
share modes = no
[Profiles]
path = /var/lib/samba/profiles
browseable = no
guest ok = yes
writeable = yes
; Для нормальной работы w2kSP2 убираем поддержку nt acl в профиле
nt acl support = no
После редактирования файла, можно проверить его коррестность командой
`testparm`. Если есть какие-то ошибки, то они будут обозначены в
выводе команды. Конфигурационный файл готов и можно запускать samba.
Samba подключается к ldap под аккаунтом администратора ldap
(cn=root,dc=home,dc=ru), поэтому необходимо сообщить ей пароль этого
аккаунта. Делается это следующей командой:
# smbpasswd -w PASSWORD
Создание базовой схемы и добавление пользователе
В samba 3 применяется новая схема samba.schema и есть определённые
отличия от схемы, применявшейся в samba 2-ой версии. Если есть
какие-то причины, по которым вы хотите использовать старую схему в
samba3, то такая возможность существует, требуется лишь собирать samba
с опцией --with-ldapsam. Но не рекомендую... Далее я буду описывать
лишь новую схему.
Есть ещё один весьма важный момент. Несмотря на то, что информация о
пользователях samba будет хранится в ldap, необходимо по прежнему
заводить системных пользователей для каждого пользователя samba и
аккаунтов компьютеров.
Если вспомнить схему без использования ldap, то было тоже самое,
пользователи прописывались в двух местах: системные в passwd, а
пользователи самба в smbpasswd. В схеме с ldap перестаёт
использоваться smbpasswd, но системные аккаунты по прежнему нужны.
Конечно наличие системного аккаунта не страшно, ведь он добавляется
всего лишь один раз, и все последующие операции над пользователем
samba производятся в ldap каталоге. Но это может быть очень неудобно,
если вы планируете для отказоустойчивости использовать второй
контроллер домена (BDC). Придётся дублировать системные учётные записи
на двух компьютерах, что может свести на нет все преимущества схемы с
ldap.
Чтобы не заводить системных аккаунтов и полностью хранить информацию о
пользователях (как пользователей samba так и системных) в LDAP,
необходимо воспользоваться замечательной библиотекой nss_ldap и
модулем pam_ldap. Как это сделать будет рассказано в следующей главе
статьи, а пока будет описан общий процесс создания записей.
Итак, следующий древовидную схему требуется поместить в ldap, для
работы с samba:
Внутри главного контейнера dc=home,dc=ru создаются ещё три: Users -
для хранения пользовательских аккаунтов, Group - группы, Computers -
аккаунты компьютеров в домене.
Получаем следующий ldif-файл base.ldif:
dn: dc=home,dc=ru
objectClass: dcObject
objectclass: organization
dc: home
o: home
dn: ou=Users,dc=home,dc=ru
objectClass: organizationalUnit
ou: Users
dn: ou=Groups,dc=home,dc=ru
objectClass: organizationalUnit
ou: Groups
dn: ou=Computers,dc=home,dc=ru
objectClass: organizationalUnit
ou: Computers
Замечание: Для упрощения добавления записей в ldap, в том числе и для
добавления базовой схемы я бы порекомендовал использовать
замечательный набор тулзов smbldap-tools (idealx.org), которые
поставляется вместе с самбой.
Теперь перейдём к заполнению базы пользователями и группами.
Пользовательский аккаунт для самбы использует два основных объектных
класса: posixAccount и sambaSamAccount. Аккаунт группы: posixGroup,
sambaGroupMapping.
Прежде всего должны быть созданы два пользователя: администратор и
гость. А также соотвествующие им группы администраторов и гостей
домена. Также необходимо создать группу пользователей домена, которой
будут принадлежать все обычные пользователи. Для создания этих
аккаунтов потребуется задать специфические атрибуты:
sambaPrimaryGroupSID и sambaSID. (SID в windows NT является неким
аналогом UID в UNIX). Для того чтобы знать, что писать в качестве
значений этих аттрибутов необходимо знать SID нашего домена, который
можно получить по команде:
# net getlocalsid
S-1-5-21-3153401187-884309351-300090610
Отсюда получаем такие значения для администратора домена:
Подробнее о том какие значения sid/rid бывают у встроенных учётных
записей в NT домене и каких их формировать можно почитать здесь:
http://www.unav.es/cti/ldap-smb/smb-ldap-3-howto.html#Create_builtin
После этого потребуется создать три группы (системные), например,
smbadmins, smbguests и smbusers, с соотвествующими gid (1000 - 1002),
ну и пользователя crux, входящего в группу c gid=1000.
Следующим шагом требуется задать пароль администратора самбы:
# smbpasswd crux
Замечу также, что после выполнения данной команды устанавливается не
только пароль для пользователя crux, но также прописывается запись в
ldap-каталоге о нашем домене dn: sambaDomianName=HOMENET,dc=home,dc=ru
Теперь необходимо провести соотвествие между unix-группами и
NT-группами, хранящимися в LDAP.
# net groupmap add sid=S-1-5-21-3153401187-884309351-300090610-512
unixgroup=smbadmins type=domain
# net groupmap add sid=S-1-5-21-3153401187-884309351-300090610-513
unixgroup=smbusers type=domain
# net groupmap add sid=S-1-5-21-3153401187-884309351-300090610-514
unixgroup=smbguests type=domain
Всё. Можно попробовать подключиться в домен с любого win-клиента.
Следует также помнить, что при включении win2k/NT/XP в домен
необходимо также создавать аккаунт компьютера. Делается это так:
где machine_name - это NetBIOS имя компьютера (обратите особое
внимание на значок `$` при добавлении системного пользователя и его
отсутствие при добавлении в LDAP).
Также важно, что при включении машин с win2k/NT/XP в домен, винда
попросит ввести логин и пароль аккаунта имеющего права на подключение
к домену. Это должен быть аккаунт администратора домена (в нашем
примере, crux).
Добавление обычных пользователей происходит абсолютно так же как и
обычно:
# useradd -g smbusers -d /home/user -c "new user" -s /bin/false user
# passwd -l user
# smbpasswd -a user
Удалённое администрирование Samba
В Samba3 появилась уникальная возможность управления пользователями
посредством стандартного набора утилит M$ SRVTOOLS (
ftp://ftp.microsoft.com/Softlib/MSLFILES/SRVTOOLS.EXE), которые обычно
используется для управления NT-доменом. Чтобы бы это было возможно,
необходимо лишь добавить следующие строки в конфигурацию smb.conf:
[global]
...
...
add user script = /usr/sbin/useradd %u
add group script = /usr/sbin/groupadd %g
add machine script = /usr/sbin/adduser -n -g machines -c Machine -d
/dev/null -s /bin/false %u
delete user script = /usr/sbin/userdel %u
delete user from group script = /usr/sbin/deluser %u %g
delete group script = /usr/sbin/groupdel %g
Теперь с любой win машины (в домене) можно войти под аккаунтом
администратора самбы и производить все возможные действия над
аккаунтами в домене Samba.
Что можно про это сказать - фантастика!
Использование nss_ldap, pam_ldap для хранения системных пользователей в ldap
Как я говорил, определённое неудобство может вызвать обязательное
наличие системных аккаунтов в системе. Чтобы хранить системных
пользователей в LDAP, должны быть установлены пакеты nss_ldap и
pam_ldap, ну а также nscd (для кэширования лукапов).
Вся дальнейшая информация относится исключительно к дистрибутиву Alt
Linux Master 2.2, поскольку настройка этого дистрибутива для работы c
nss_ldap и pam_ldap очень специфична, а любая ошибка может привести к
невозможности либо загрузить Линукс или войти в систему.
1. /etc/nsswitch.conf
В этом файле необходимо изменить 3 строки. Важно чтобы слово ldap не
стояло первым в списке, поскольку в Master2.2 есть большой глюк в
такой раскладке. Рекомендую такой вариант:
3. /etc/ldap.secret - здесь должен содержаться пароль администратора
ldap в plain-виде и с обязательным переносом строки в конце строки
пароля. Права на файл root:root 400.
После данных операций вы получите систему, в которой пользователи
могут содержаться как в системных файлах /etc/passwd , так и в ldap.
Для добавления пользователей samba предварительно потребуется
создавать в ldap posixAccount (либо создавая ldif-файл, либо оперируя
специальными утилитами, например, те же ldap-tools Григория
Ситкарева). После чего командой smbpasswd задавать пользователя samba.
Утилита net
Для управления Samba и удалёнными CIFS серверами можно использовать
утилиту net, которая теперь входит в состав пакета samba3. О полном
списке её возможностей можно ознакомиться на man-страницах net.
Упоминаю её здесь, потому что для некоторых операций: net user|group
.. , будет запрашиваться пароль пользователя root. Соотвественно при
использовании схемы с LDAP вам потребуется поместить в LDAP учётную
запись пользователя root и задать для неё nt-пароль. Важно что у
пользователя root аттрибуты sambaSID, sambaPrimaryGroupSID должны
иметь вид:
После этого при использовании утилиты net в качестве пароля root надо
вводить именно тот пароль который вы задали утилитой smbpasswd (но
никак не пароль системного пользователя root :).
Утилита pdbedit
Утилита pdbedit служит для управления пользовательскими аккаунтами в
SAM-базе (независимо от типа бекэнда: tdb, ldap, smbpasswd..). Она
может служить хорошей заменой smbpasswd.
Здесь я опишу несколько полезных опций при работе с этой утилитой:
# показывает список всех пользователей
pdbedit -L
# более информативный листинг
pdbedit -L -v
# добавление пользователя USER
pdbedit -a -u USER
# добавление аккаунта машины machine
pdbedit -a -m -u machine
# установка сетевого пути к домашнему каталогу пользователю USER
pdbedit -h "\\HOME\USER" -u USER
# сетевой путь к скрипту подключения пользователя USER
pdbedit -s "\\HOME\netlogon\USER.cmd" -u USER
# полное имя пользователя
pdbedit -f "USER of HOME" -u USER
С другими опциями можно ознакомиться в man pdbedit.
Пока всё.
Обо всех ошибках и неточностях рапортуйте на мыло <crux@syktsu.ru.>
или на форум http://unix.nordcomp.ru/forum.html