Настройка контроллера домена Samba для обеспечения общего сетевого ресурса с авторизацией в LDAP (openldap) во FreeBSD


Настройка контроллера домена Samba для обеспечения общего сетевого ресурса с авторизацией в LDAP (openldap)

Примечание: данная статья не заявляется как авторская, а скорее является компиляцией материалов, обработанных при практическом решении задачи.
Возникла задача создать общий ресурс на сервере для обмена файлами в небольшой организации. Т. к. серверы управляются не Windows, а FreeBSD (в первую очередь – из соображений экономии), данная задача оказалась несколько нетривиальной для windows-администратора. Когда сервер ставился, предполагалось, что весь обмен будет производиться через общий почтовый ящик IMAP (поэтому поддержка samba не была включена на этапе установки), но практика показала, что данное решение далеко не столь удобно, как казалось изначально ("единое рабочее пространство для офиса и региональных представительств, взаимодействующее через защищённое SSL/TLS соединение" достаточно медленно работало с тяжеловесными документами, да и сама процедура правки документов была не особенно удобной). Было решено создать локальную папку для общих документов, но, памятуя о возможности расширения списка пожеланий, захотелось реализовать решение со значительной избыточностью функционала. Итак, вместо просто общей папки, был создан полноценный контроллер домена, с помощью которого можно будет в последствии реализовать полноценное управление доменном (идея реализации полноценного, вплоть до политик, Windows-совместимого домена взята с http://www.lissyara.su/?id=1487, но по причинам невостребованности пока не используется).

Список использованных ресурсов:
http://www.opennet.ru/base/net/samba_pdc_freebsd.txt.html
http://www.lissyara.su/?id=1280
http://www.lissyara.su/?id=1460
http://www.lissyara.su/?id=1487
http://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=smb.conf&category=5

Да, и настоятельно рекомендую ознакомиться с материалами от IBM на эту (вернее, очень близкую) тему:
http://www.ibm.com/developerworks/ru/library/l-Zamena_AD_1/index.html
http://www.ibm.com/developerworks/ru/library/l-Zamena_AD_2/index.html
http://www.ibm.com/developerworks/ru/library/l-Zamena_AD_3/index.html

Операционная система на сервере:
gamma# uname -a
FreeBSD gamma.firm.local 7.1-RELEASE FreeBSD 7.1-RELEASE #0: Thu Jan 1 14:37:25 UTC 2009
root@logan.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC i386
gamma#

Будем устанавливать следующие порты:

openldap (2.4.16_1)
nss_ldap (1.264_2)
samba (3.3.4)
ldap-account-manager (2.6.0)
smbldap-tools (0.9.5)
ldapscripts (1.8.0_1) (в последствии я от его использования отказался)

*трафик – порядка 55 Мб.
(два последних набора, судя по всему, во многом друг друга дублируют... почему ставил два? – сначала собирал песочницу с использованием ldapscripts, но более функциональную версию получилось запустить с использованием smbldap-tools, а ldapscripts остался для дублирования функций при тестировании).

Обновляем порты

Для обновления дерева портов раньше пользовался CVSUP, позже CSUP, но последнее время прочувствовал прелесть PORTSNAP – обновление проходит в разы быстрее, да и трафик потребляется небольшой; кроме того, portsnap позволяет получить дерево портов даже на машине, установленной без дерева – например, с "мини-дистрибутива". Итак:
gamma# portsnap fetch update
Looking up portsnap.FreeBSD.org mirrors... 3 mirrors found.
...
Building new INDEX files... done.
gamma#

Устанавливаем openldap:

Как завзятый экспериментатор, ставлю последнюю из доступных версий (для обеспечения большей безопасности принято ставить "проверенные временем" версии, но, как свидетельствует накопленный опыт, "старое" не всегда означает "надёжное" – одни лишь дебаты вокруг багов в самбе 3.0.25 и ниже/выше, приводимые на упомянутых в начале статьи ресурсах, чего стоят):
gamma# cd /usr/ports/net/openldap24-server
gamma# make config

Выбираем опции:

Далее
gamma# make install clean

Ставим самбу


Так как в моём случае не было необходимости организовывать общий доступ к сетевым принтерам через сервер (фирма маленькая и сетевых принтеров банально нет), поддержка CUPS не включена; если у Вас есть такая необходимость, могу рекомендовать лишь обратиться к другим источникам, например, http://www.lissyara.su/?id=1779...
Примечание: на сервере samba 3.3 пока не работает антивирусный сканер samba-vscan, поэтому если есть желание (или необходимость) обеспечить бесплатную антивирусную защиту файлового сервера, всё же придётся воспользоваться версией 3.0.34, для которого все приводимые мной рекомендации должны быть правомочными. Лично я решил всё же оставить 3.3.4.


gamma# cd /usr/ports/net/samba33
gamma# make config

gamma# make install clean

Копируем файл схемы (это одна строка):
gamma# cp /usr/local/share/examples/samba/LDAP/samba.schema /usr/local/etc/openldap/schema

Ставим скрипты для управления openldap:

Данный набор скриптов будет использоваться сервером самбы для управления учётными записями самбы в нашем домене:
gamma# cd /usr/ports
gamma# make search name=smbldap-tools
Port: smbldap-tools-0.9.5
Path: /usr/ports/net/smbldap-tools
Info: Samba-LDAP management and support tools
Maint: mm@FreeBSD.org
B-deps: ja-p5-Jcode-2.07 libiconv-1.11_1 p5-Authen-SASL-2.12 p5-Convert-ASN1-0.21
p5-Crypt-SmbHash-0.12 p5-Digest-HMAC-1.01 p5-Digest-MD5-2.38 p5-Digest-SHA1-2.12
p5-GSSAPI-0.26 p5-IO-Socket-SSL-1.24 p5-MIME-Base64-3.07 p5-Net-SSLeay-1.35_1
p5-Text-Iconv-1.7 p5-URI-1.37 p5-Unicode-Map-0.112 p5-Unicode-Map8-0.12_1 p5-Unicode-MapUTF8-1.11
p5-Unicode-String-2.09 p5-XML-Filter-BufferText-1.01 p5-XML-NamespaceSupport-1.09_1
p5-XML-SAX-0.96 p5-XML-SAX-Writer-0.52 p5-perl-ldap-0.39 perl-5.8.9_2
R-deps: ja-p5-Jcode-2.07 libiconv-1.11_1 p5-Authen-SASL-2.12 p5-Convert-ASN1-0.21
p5-Crypt-SmbHash-0.12 p5-Digest-HMAC-1.01 p5-Digest-MD5-2.38 p5-Digest-SHA1-2.12 p5-GSSAPI-0.26
p5-IO-Socket-SSL-1.24 p5-MIME-Base64-3.07 p5-Net-SSLeay-1.35_1 p5-Text-Iconv-1.7 p5-URI-1.37
p5-Unicode-Map-0.112 p5-Unicode-Map8-0.12_1 p5-Unicode-MapUTF8-1.11 p5-Unicode-String-2.09
p5-XML-Filter-BufferText-1.01 p5-XML-NamespaceSupport-1.09_1 p5-XML-SAX-0.96 p5-XML-SAX-Writer-0.52
p5-perl-ldap-0.39 perl-5.8.9_2
WWW: <a href="https://gna.org/projects/smbldap-tools/</p>
<p>gamma#" title="https://gna.org/projects/smbldap-tools/</p>
<p>gamma#">https://gna.org/projects/smbldap-tools/</p>
<p>gamma#</p></a> cd /usr/ports/net/smbldap-tools
gamma# make install clean

Второй набор скриптов можно не ставить – приводимая далее конфигурация работает и без них, но если не жалко захламить свою систему, или планируется иное использование LDAP из командной строки (кроме самбы), то:
gamma# make search name=ldapscripts
Port: ldapscripts-1.8.0_1
Path: /usr/ports/net/ldapscripts
Info: Scripts to manage posix accounts in an OpenLDAP directory
Maint: ganael.laplanche@martymac.com
B-deps: libiconv-1.11_1
R-deps: libiconv-1.11_1 openldap-client-2.3.43
WWW: <a href="http://contribs.martymac.com</p>
<p>gamma#" title="http://contribs.martymac.com</p>
<p>gamma#">http://contribs.martymac.com</p>
<p>gamma#</p></a> cd /usr/ports/net/ldapscripts
gamma# make install clean

Ставим nss_ldap:
gamma# cd /usr/ports
gamma# make search name=nss_ldap
Port: nss_ldap-1.264_2
Path: /usr/ports/net/nss_ldap
Info: RFC 2307 NSS module
Maint: kazakov@gmail.com
B-deps: autoconf-2.62 autoconf-wrapper-20071109 automake-1.9.6_3 automake-wrapper-20071109
gettext-0.17_1 gmake-3.81_3 libiconv-1.11_1 m4-1.4.13,1 openldap-client-2.4.16 perl-5.8.9_2
R-deps: openldap-client-2.4.16
WWW: <a href="http://www.padl.com/OSS/nss_ldap.html</p>
<p>gamma#" title="http://www.padl.com/OSS/nss_ldap.html</p>
<p>gamma#">http://www.padl.com/OSS/nss_ldap.html</p>
<p>gamma#</p></a> cd /usr/ports/net/nss_ldap
gamma# make install clean

Устанавливаем LDAP Account Manager


Корректно управлять доменом через прилагаемый к самбе SWAT не получилось – inetd, через который его рекомендовали использовать, у меня не используется, а прикрутить через cgi в apache как-то руки не дошли, поэтому для настройки самбы (общих ресурсов, в первую очередь) конфиг правился ручками, а пользователи управлялись с помощью LDAP Account Manager – ставим его:
gamma# make search name=ldap-account-manager
Port: ldap-account-manager-2.6.0
Path: /usr/ports/sysutils/ldap-account-manager
Info: Webfrontend for managing accounts stored in an OpenLDAP server
Maint: basil@vpm.net.ua
B-deps: gettext-0.17_1 libiconv-1.11_1 perl-5.8.9_2
R-deps: gettext-0.17_1 libiconv-1.11_1 libltdl-1.5.26 libmcrypt-2.5.8 libxml2-2.7.3
openldap-client-2.4.16 p5-Authen-SASL-2.12 p5-Convert-ASN1-0.21 p5-Digest-HMAC-1.01
p5-Digest-SHA1-2.12 p5-GSSAPI-0.26 p5-IO-Socket-SSL-1.24 p5-MIME-Base64-3.07
p5-Net-SSLeay-1.35_1 p5-Quota-1.6.3 p5-Text-Iconv-1.7 p5-URI-1.37 p5-XML-Filter-BufferText-1.01
p5-XML-NamespaceSupport-1.09_1 p5-XML-SAX-0.96 p5-XML-SAX-Writer-0.52 p5-perl-ldap-0.39
pcre-7.9 perl-5.8.9_2 php5-5.2.9 php5-gettext-5.2.9 php5-hash-5.2.9 php5-iconv-5.2.9
php5-ldap-5.2.9 php5-mcrypt-5.2.9 php5-pcre-5.2.9 php5-session-5.2.9 php5-xml-5.2.9 pkg-config-0.23_1
WWW: <a href="http://lam.sourceforge.net/</p>
<p>gamma#" title="http://lam.sourceforge.net/</p>
<p>gamma#">http://lam.sourceforge.net/</p>
<p>gamma#</p></a> cd /usr/ports/sysutils/ldap-account-manager
gamma# make install clean

Копируем файл схемы (может понадобиться при настройке DHCP, что я пока не доделал):
gamma# cp /usr/local/share/doc/ldap-account-manager/docs/schema/dhcp.schema /usr/local/etc/openldap/schema

Обновляем доступность установленных скриптов и модулей без указания полного пути:
gamma# rehash
gamma#

Настройка поддержки ACL (права доступа пользователей)

Для корректной работы ACL (Access Control List, расширенные права доступа пользователей, привычные для NTFS) необходимо включить их поддержку на том разделе, где будут располагаться наши шары:
Узнаём имя раздела, на котором расположена общая папка:
gamma# df
Filesystem 1K-blocks Used Avail Capacity Mounted on
/dev/ar0s1a 507630 141714 325306 30% /
devfs 1 1 0 100% /dev
/dev/ar0s1e 2026030 22 1863926 0% /tmp
/dev/ar0s1f 68366114 5347438 57549388 9% /usr
/dev/ar0s1d 40622796 722436 36650538 2% /var
devfs 1 1 0 100% /var/named/dev
gamma#

В моём случае, общий каталог расположен в каталоге /usr, то есть имя раздела - /dev/ar0s1f ('ar' говорит о том, что дисковое устройство – массив RAID, 0 – номер массива в системе, s1 – первый слайс на данном устройстве, f – номер/литера/ собственно раздел/а/), тогда для включения поддержки ACL выполняем следующие действия:
Переводим систему в однопользовательский режим и включаем поддержку ACL на выбранном разделе:
gamma# shutdown now
...
Enter full pathname of shell or RETURN for /bin/sh:
# /sbin/umount /usr
# /sbin/tunefs -a enable /dev/ar0s1f
tunefs: ACLs set
# /sbin/mount /usr

Проверяем, получилось ли и возвращаемся в нормальный (многопользовательский) режим:
# /sbin/mount
/dev/ar0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ar0s1e on /tmp (ufs, local, soft-updates)
/dev/ar0s1f on /usr (ufs, NFS exported, local, soft-updates, <u><b>acls</b></u>)
/dev/ar0s1d on /var (ufs, local, soft-updates)
#
# exit


Система загрузится обратно и готова к использованию ACL в Samba (может потребоваться полная перезагрузка для восстановления полного функционала сервера - по крайней мере мне пару раз приходилось перезагружаться после смены режима)

Для начала надо настроить openldap.

Приводим конфигурационный файл (/usr/local/etc/openldap/slapd.conf) к такому виду:
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/misc.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/openldap.schema
include /usr/local/etc/openldap/schema/samba.schema
# DHCP и DNS пока не используются, поэтому оставляем комментированными
#include /usr/local/etc/openldap/schema/dhcp.schema
#include /usr/local/etc/openldap/schema/dns.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
# шифрование пока не реализовывал, посему оставляем комментированным
#ssl
#TLSCipherSuite HIGH:MEDIUM:+SSLv2:+TLSv1
#TLSCertificateFile /usr/local/etc/openldap/ldap.csr
#TLSCertificateKeyFile /usr/local/etc/openldap/ldap.key
modulepath /usr/local/libexec/openldap
moduleload back_bdb
moduleload back_ldap
#moduleload back_ldbm
#moduleload back_passwd
#moduleload back_shell
database bdb
#database ldbm
# Определяем имя домена (my-domain.local), если домен третьего
# уровня, то здесь и далее добавляем ещё один блок dc=...,
suffix "dc=my-domain,dc=local"
# Имя учётной записи LDAP с правами администратора
rootdn "cn=LDAPAdmin,dc=my-domain,dc=local"
# Пароль администратора ldap
# *создать хеш пароля: #/usr/local/sbin/slappasswd
rootpw {SSHA}t4Ghhj746gwpMyR8SNK2UqIHDkL4dujT
# С уровнем логирования по умолчанию, забивается лог, поэтому 0
loglevel 0
# каталог для хранения базы данных
directory /var/db/openldap-data
# перечисление индексируемых полей; чем их больше, тем
# ldap требовательнее к памяти, но быстрее поиск
index objectClass,uidNumber,gidNumber eq
index cn,sn,uid,displayName pres,sub,eq
index memberUid,mail,givenname eq,subinitial
index sambaSID,sambaPrimaryGroupSID,sambaDomainName eq
# разрешаем пользователям авторизовываться и менять пароль на уровне ldap
access to attrs=userPassword,sambaLMPassword,sambaNTPassword,sambaPwdLastSet,sambaPwdMustChange
by dn="cn=LDAPAdmin,dc=my-domain,dc=local" write
by self write
by anonymous auth
by * none
# некоторые атрибуты, такие как 'id user' должны быть доступны анонимно
access to attrs=objectClass,entry,homeDirectory,uid,uidNumber,gidNumber,memberUid
by dn="cn=LDAPAdmin,dc=my-domain,dc=local" write
by * read
#...а некоторые ещё и доступны пользователю для модификации
access to attrs=description,telephoneNumber,roomNumber,homePhone,loginShell,gecos,cn,sn,givenname
by dn="cn=LDAPAdmin,dc=my-domain,dc=local" write
by self write
by * read
# Некоторые атрибуты должны быть доступны для модификации сервером samba (?)
access to attrs=cn,sambaLMPassword,sambaNTPassword,sambaPwdLastSet,sambaLogonTime,
sambaLogoffTime,sambaKickoffTime,sambaPwdCanChange,sambaPwdMustChange,
sambaAcctFlags,displayName,sambaHomePath,sambaHomeDrive,sambaLogonScript,
sambaProfilePath,description,sambaUserWorkstations,sambaPrimaryGroupSID,
sambaDomainName,sambaMungedDial,sambaBadPasswordCount,sambaBadPasswordTime,
sambaPasswordHistory,sambaLogonHours,sambaSID,sambaSIDList,sambaTrustFlags,
sambaGroupType,sambaNextRid,sambaNextGroupRid,sambaNextUserRid,sambaAlgorithmicRidBase,
sambaShareName,sambaOptionName,sambaBoolOption,sambaIntegerOption,sambaStringOption,
sambaStringListoption
by dn="cn=LDAPAdmin,dc=my-domain,dc=local" write
by self read
by * none
#samba need to be able to create the samba domain account
access to dn.base="dc=my-domain,dc=local"
by dn="cn=LDAPAdmin,dc=my-domain,dc=local" write
by * none
#samba need to be able to create new users accounts
access to dn="ou=Users,dc=my-domain,dc=local"
by dn="cn=LDAPAdmin,dc=my-domain,dc=local" write
by * none
#samba need to be able to create new groups accounts
access to dn="ou=Groups,dc=my-domain,dc=local"
by dn="cn=LDAPAdmin,dc=my-domain,dc=local" write
by * none
#samba need to be able to create new computers accounts
access to dn="ou=Computers,dc=my-domain,dc=local"
by dn="cn=LDAPAdmin,dc=my-domain,dc=local" write
by * none
#this can be omitted but we let it stay because there could be other
#branches in the directory
access to *
by self read
by * none

В целях безопасности к данному файлу необходимо ограничить доступ и убедиться, что владельцем является ldap:ldap :
gamma# chown ldap:ldap /usr/local/etc/openldap/slapd.conf
gamma# chmod 0600 /usr/local/etc/openldap/slapd.conf

Добавляем в файл /etc/rc.conf такие строки:
#LDAP server
slapd_enable="YES"
# Здесь '%2f' – это символ '/'
slapd_flags="-h 'ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://192.168.0.1/ ldap://127.0.0.1/'"
slapd_sockets="/var/run/openldap/ldapi"

Поправим файлы настроек nss_ldap.

Вот тут для меня все действия выглядят чистым шаманством – исходя из описания, nss_ldap служит в роли DNS-сервера и может работать в качестве PAM (Pluggable Authentication Module), но вот как он работает я так и не понял; более того, при старте сервера ldap, данный процесс (nss_ldap) ругается, что не может взаимодействовать с сервером ldap – "could not search LDAP server - Server is unavailable", но при этом вроде бы всё работает... мистика, одним словом. Итак, /usr/local/etc/nss_ldap.conf (вносил минимальные изменения – даже комментарии не стал переводить – всё равно мне функции данных наворотов непонятны, часть комментариев в конце файла, взятого из nss_ldap.conf.sample удалена):
# @(#)$Id: ldap.conf,v 2.48 2008/07/03 02:30:29 lukeh Exp $
#
# This is the configuration file for the LDAP nameservice
# switch library and the LDAP PAM module.
#
# PADL Software
# <a href="http://www.padl.com<br />
#</a></p>
<p>#" title="http://www.padl.com<br />
#</p>
<p>#">http://www.padl.com<br />
#</p>
<p># путь к папке, где будут создаваться отладочные логи
logdir /var/log/nss_ldap
# уровень детализации отладки - пытался читать, но всё без толку :)
#debug 1

# Your LDAP server. Must be resolvable without using LDAP.
# Multiple hosts may be specified, each separated by a
# space. How long nss_ldap takes to failover depends on
# whether your LDAP client library supports configurable
# network or connect timeouts (see bind_timelimit).
host localhost

# The distinguished name of the search base.
base dc=my-domain,dc=local

# 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://127.0.0.1/
#uri ldaps://127.0.0.1/
uri ldapi://%2fvar%2frun%2fopenldap%2fldapi/
#uri ldapi:///var/run/openldap/ldapi/
# Note: %2f encodes the '/' used as directory separator

# The LDAP version to use (defaults to 3
# if supported by client library)
ldap_version 3

# The distinguished name to bind to the server with.
# Optional: default is to bind anonymously.
#binddn cn=Anonim,dc=my-domain,dc=local

# The credentials to bind with.
# Optional: default is no credential.
#bindpw secret

# The distinguished name to bind to the server with
# if the effective user ID is root. Password is
# stored in /etc/ldap.secret (mode 600)
#rootbinddn cn=LDAPAdmin,dc=my-domain,dc=local

# The port.
# Optional: default is 389.
port 389

# The search scope.
#scope sub
scope one
#scope base

# Search timelimit
timelimit 30

# Bind/connect timelimit
bind_timelimit 10

# 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 hard
bind_policy soft

# Connection policy:
# persist: DSA connections are kept open (default)
# oneshot: DSA connections destroyed after request
nss_connect_policy persist

# Idle timelimit; client will close connections
# (nss_ldap only) if the server has not been contacted
# for the number of seconds specified below.
idle_timelimit 3600

# Use paged rseults
nss_paged_results yes

# Pagesize: when paged results enable, used to set the
# pagesize to a custom value
pagesize 1000

# 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=my-domain,dc=local?one
nss_base_group ou=groups,dc=my-domain,dc=local?one
nss_base_passwd ou=computers,dc=my-domain,dc=local?one
nss_base_shadow ou=users,dc=my-domain,dc=local?one
#nss_base_hosts ou=Hosts,dc=my-domain,dc=local?one
#nss_base_services ou=Services,dc=my-domain,dc=local?one
#nss_base_networks ou=Networks,dc=my-domain,dc=local?one
#nss_base_protocols ou=Protocols,dc=my-domain,dc=local?one
#nss_base_rpc ou=Rpc,dc=my-domain,dc=local?one
#nss_base_ethers ou=Ethers,dc=my-domain,dc=local?one
#nss_base_netmasks ou=Networks,dc=my-domain,dc=local?ne
#nss_base_bootparams ou=Ethers,dc=my-domain,dc=local?one
#nss_base_aliases ou=Aliases,dc=my-domain,dc=local?one
#nss_base_netgroup ou=Netgroup,dc=my-domain,dc=local?one

Теперь правим файл /ets/nsswitch.conf до такого вида:
# nsswitch.conf(5) - name service switch configuration file
# $FreeBSD: src/etc/nsswitch.conf,v 1.1.6.1 2008/11/25 02:59:29 kensmith Exp $
group: files ldap
group_compat: nis
hosts: files dns
networks: files
passwd: files ldap
passwd_compat: nis
shadow: files ldap
shells: files

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


Сразу отмечу, что настройка порта ldapscripts я не привожу – если есть желание с ними ознакомиться, прошу обращаться на http://www.lissyara.su/?id=1487 отмечу только, что они хранятся в файле /usr/local/etc/ldapscripts/ldapscripts.conf.
Основные настройки smbldap-tools хранятса в файле /usr/local/etc/smbldap-tools/smbldap.conf:
# Данный SID надо получить на настраиваемом сервере, введя команду:
# net getlocalsid
SID="S-1-5-21-304721698-1578475460-1469728056"
sambaDomain="MY-DOMAIN"
slaveLDAP="127.0.0.1"
slavePort="389"
masterLDAP="127.0.0.1"
masterPort="389"
ldapTLS="0"
suffix="dc=my-domain,dc=local"
usersdn="ou=Users,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Groups,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
scope="sub"
hash_encrypt="CRYPT"
crypt_salt_format="%s"
userLoginShell="/sbin/nologin"
userHome="/home/samba/home/%U"
userHomeDirectoryMode="700"
userGecos="System User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/usr/share/skel"
defaultMaxPasswordAge="45"
userSmbHome="\gammahome\%U"
userHomeDrive="H:"
userScript="logon.bat"
mailDomain=""
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
with_slappasswd="1"
slappasswd="/usr/local/sbin/slappasswd"

Файл /usr/local/etc/smbldap-tools/smbldap_bind.conf – фактически, только вписать пользователя и пароль (естественно, на данный файл надо выставить разрешения 0600):
masterDN="cn=LDAPAdmin,dc=my-domain,dc=local"
masterPw="Cleartext-Parole-for-LDAP"
slaveDN="cn=LDAPAdmin,dc=my-domain,dc=local"
slavePw="Cleartext-Parole-for-LDAP"

Разрешаем запуск slapd в /etc/rc.conf, добавив следующие строки:
#LDAP server
slapd_enable="YES"
slapd_flags="-h 'ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://192.168.0.1/ ldap://127.0.0.1/'"
slapd_sockets="/var/run/openldap/ldapi"

После настройки следует проверить работоспособность сервера openldap, т. к. у меня основные ошибки возникали из-за него:
gamma# /usr/local/etc/rc.d/slapd start

Смотрим, чтобы не было ругани на физический экран и в /var/log/debug.log – нормальный запуск фиксируется примерно такой строчкой лога:
Jun 1 15:57:05 gamma slapd[7088]: @(#) $OpenLDAP: slapd 2.4.16 (May 27 2009 15:38:48) $
bubnov@gamma.my-domain.local:/usr/ports/net/openldap24-server/work/openldap-2.4.16/servers/slapd

...и проверяем – слушает ли ldap сетевые подключения (при некоторых ошибках конфигурации ругани заметно не было, но демон не стартовал):
gamma# netstat -a | grep LISTEN | grep ldap
tcp4 0 0 localhost.ldap *.* LISTEN
tcp4 0 0 gamma.ldap *.* LISTEN
gamma#

Вносим данные в таблицы LDAP (справедливости ради замечу, что я это действие "не выполнял" – после ручной настройки тотально зачистил базу LDAP и все настройки делал из LAM *см. ниже):
gamma# smbldap-populate -a LDAPAdmin

после выполнения данного скрипта, будут созданы основные записи в базе ldap. Для проверки я использовал такую команду:
gamma# ldapsearch -LLL -x -b 'dc=my-domain,dc=local' '*'

И на выходе получал что-то подобное этому:
dn: dc=my-domain,dc=local
objectClass: dcObject
objectClass: organization

dn: ou=Users,dc=my-domain,dc=local
objectClass: top
objectClass: organizationalUnit

dn: ou=Groups,dc=my-domain,dc=local
objectClass: top
objectClass: organizationalUnit

dn: ou=Computers,dc=my-domain,dc=local
objectClass: top
objectClass: organizationalUnit

dn: ou=Idmap,dc=my-domain,dc=local
objectClass: top
objectClass: organizationalUnit

dn: uid=Admin,ou=Users,dc=my-domain,dc=local
cn: Admin
sn: Admin
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: sambaSamAccount
objectClass: posixAccount
objectClass: shadowAccount
gidNumber: 0
uid: Admin
uidNumber: 0
homeDirectory: /home/samba/home/Admin
loginShell: /bin/false
gecos: Netbios Domain Administrator

Как я уже упоминал, рабочую доменную структуру я создавал в LAM (ldap-account-manager), поэтому приведённый ответ несколько может отличаться от полученного Вами.


Настраиваем samba.

Приводим файл /usr/local/etc/smb.conf к такому виду:
[global]
workgroup = MY-DOMAIN
netbios name = GAMMA
enable privileges = yes
interfaces = 192.168.0.1/24
server string = SAMBA_LDAP PDC Server
security = user
encrypt passwords = Yes
obey pam restrictions = No
ldap passwd sync = Yes
log level = 0
syslog = 0
log file = /var/log/samba/log.%m
max log size = 100
time server = Yes
socket options = TCP_NODELAY
mangling method = hash2
# Эти три строки позволяют корректно отображать имена файлов
# как в Windows, так и локально на сервере
display charset = koi8-r
unix charset = koi8-r
dos charset = cp866
logon script = logon.bat
logon drive = H:
# logon home =
logon path =
domain logons = Yes
# следующие 4 строки делают наш сервер master-browser'ом в домене, справочно -
# с чем едят master-browser: <a href="http://sysadmins.ru/topic49026.html<br />
os" title="http://sysadmins.ru/topic49026.html<br />
os">http://sysadmins.ru/topic49026.html<br />
os</a> level = 64
preferred master = yes
domain master = yes
local master = yes
#wins support = yes
# wins server = w.x.y.z
#wins proxy = yes
dns proxy = no
name resolve order = lmhosts dns host bcast wins
passdb backend= ldapsam:ldap://127.0.0.1/
ldap admin dn= cn=LDAPAdmin,dc=my-domain,dc=local
ldap suffix= dc=my-domain,dc=local
ldap user suffix= ou=Users
ldap group suffix= ou=Groups
ldap machine suffix= ou=Computers
ldap idmap suffix = ou=Users
ldap ssl= off
# ldap ssl= start tls
ldap delete dn= Yes
# Это - блок настроек скриптов взаимодействия с LDAP через smbldap-tools
add user script = /usr/local/sbin/smbldap-useradd -m "%u"
delete user script = /usr/local/sbin/smbldap-userdel "%u"
add machine script = /usr/local/sbin/smbldap-useradd -w "%u"
add group script = /usr/local/sbin/smbldap-groupadd -p "%g"
delete group script = /usr/local/sbin/smbldap-groupdel "%g"
add user to group script = /usr/local/sbin/smbldap-groupmod -m "%u" "%g"
delete user from group script = /usr/local/sbin/smbldap-groupmod -x "%u" "%g"
set primary group script = /usr/local/sbin/smbldap-usermod -g "%g" "%u"
load printers = no
# printcap name = cups
# disable spoolss = Yes
# show add printer wizard = No
# printing = cups
[homes]
# обязательный блок, описывающий домашние каталоги пользователей
# из интересного - реализация корзины.
comment = Home directories
browseable = No
path = /home/samba/homes/%U
writable = yes
public = no
valid users = %S
vfs object = recycle
recycle:repository = .Recycle
recycle:keeptree = Yes
recycle:touch = Yes
recycle:version = Yes
recycle:maxsize = 0
# маска файлов, не помещаемых в корзину - временные, индексные от TheBat,
# блокировочные OpenOffice, временные MS Office (2 вида)
recycle:exclude = *.tmp|*.tbi|*.temp|.~lock.*|~$*|*.~??
[netlogon]
comment = Network Logon Service
path = /home/samba/netlogon/
browseable = no
read only = yes
[Profiles]
path = /home/samba/profiles
read only = no
create mask = 0600
directory mask = 0700
browseable = No
guest ok = yes
profile acls = yes
csc policy = disable
force user = %U
valid users = %U @"Domain Admins"
[public]
comment = Local share
path = /home/samba/public
valid users = @"Domain Admins", @"Domain Users"
write list = @"Domain Admins", @"Domain Users"
admin users = @"Domain Admins"
browseable = yes
guest ok = yes
read only = no
directory mask = 0770
create mask = 0660
# блок, отвечающий за управление правами доступа через "галочки Windows"
inherit owner = yes
inherit acls = yes
inherit permissions = yes
map acl inherit = yes

Задаём пароль к LDAP серверу для samba (пользователь указан в файле конфигурации строкой "ldap admin dn="):
gamma# smbpasswd -w секретное_слово

Дальнейшие настройки выполняются с помощью предпочитаемого инструмента администрирования; в моём случае это LDAP Account Manager.

Настраиваем LDAP Account Manager.

LAM (будем называть его так, идя на поводу у авторов), являющийся набором php-скриптов веб-интерфейса, установился в /usr/local/www/lam. Изначально конфигурация хранится в двух файлах:
/usr/local/www/lam/config/config.cfg – его лучше руками не трогать, а настраивать через пункт "Конфигурация LAM → Редактор основных настроек" веб-интерфейса; к стати, рекомендую сразу этим и заняться, чтобы сменить пароль LAM и выбрать язык по умолчанию;
/usr/local/www/lam/config/lam.conf – настройки профиля, существующего по умолчанию – тоже лучше настроить через web-интерфейс LAM ("Конфигурация LAM → Редактировать профили сервера"), но я по незнанию правил его руками (проглядел предупреждение в шапке файла)... в результате получилось примерно следующее:
# LDAP Account Manager configuration
#
# Please do not modify this file manually.
# The configuration can be done completely by the LAM GUI.
#
#######################################################################################

# Путь к серверу (напр. ldap://localhost:389 or ldaps://localhost:636)
ServerURL: ldap://localhost:389

# Список пользователей, имеющих право пользоваться LDAP Account Manager
# учётные записи перечисляются через точку с запятой, пароль вводится в вебке,
# например: admins: cn=admin,dc=yourdomain,dc=org;cn=root,dc=yourdomain,dc=org
Admins: cn=LDAPAdmin,dc=my-domain,dc=local;cn=Bubnov,dc=my-domain,dc=local

# Это - пароль для изменения настроек (по умолчанию: lam)
#passwd: {SSHA}RjBruJcTxZEdcBjPQdRBkDaSQeY= iueleA==
Passwd: {SSHA}RjBruJcTxZEdcBjPQdRBkDaSQeY= iueleA==

# суффикс дерева (имя домена)
# напр. dc=yourdomain,dc=org
treesuffix: dc=my-domain,dc=local

# язык по умолчанию (строка из config/language)
defaultLanguage: ru_RU.utf8:UTF-8:РС_С_С_РєРёР№ (РР_С_С_РёС_)
#en_GB.utf8:UTF-8:English (Great Britain)

# Путь к внешним скриптам (?)
scriptPath:

# Сервер внешних скриптов (?)
scriptServer:

# Права доступа на домашний каталог
scriptRights: 750

# Время в минутах на кеширование LAM запросов к LDAP
# (уменьшение увеличивает нагрузку на LDAP сервер).
cachetimeout: 5

# Настройки модулей (UID и GID для учётных записей пользователей,
# групп и компьютеров

modules: posixAccount_minUID: 10000
modules: posixAccount_maxUID: 30000
modules: posixAccount_minMachine: 50000
modules: posixAccount_maxMachine: 60000
modules: posixGroup_minGID: 10000
modules: posixGroup_maxGID: 20000
modules: posixGroup_pwdHash: SSHA
modules: posixAccount_pwdHash: SSHA

# Перечень активных типов учётных записей.
activeTypes: user,group,host,smbDomain,dhcp

types: suffix_user: ou=users,dc=my-domain,dc=local
types: attr_user: #uid;#givenName;#sn;#uidNumber;#gidNumber
types: modules_user: inetOrgPerson,posixAccount,shadowAccount,sambaSamAccount

types: suffix_group: ou=groups,dc=my-domain,dc=local
types: attr_group: #cn;#gidNumber;#memberUID;#description
types: modules_group: posixGroup,sambaGroupMapping

types: suffix_host: ou=computers,dc=my-domain,dc=local
types: attr_host: #cn;#description;#uidNumber;#gidNumber
types: modules_host: account,posixAccount,sambaSamAccount

types: suffix_smbDomain: ou=domains,dc=my-domain,dc=local
types: attr_smbDomain: sambaDomainName:Domain name;sambaSID:Domain SID
types: modules_smbDomain: sambaDomain

# Уровень доступа для данного профиля LAM.
accessLevel: 100

# Метод авторизации в web-интерфейсе.
loginMethod: list

# Суффикс поиска записей для построения списка входа.
loginSearchSuffix: dc=my-domain,dc=local

# Фильтр поиска записей для построения списка входа.
loginSearchFilter: uid=%USER%
modules: sambaSamAccount_timeZone: 3
modules: posixAccount_primaryGroupAsSecondary: false
types: suffix_dhcp: ou=dhcp,dc=my-domain,dc=local
types: attr_dhcp: #cn;#dhcpRange;#fixed_ips
types: modules_dhcp: dhcp_settings,range,fixed_ip,ddns

Для того, чтобы веб-админка заработала, её надо прописать в веб-сервере. На моём сервере уже был установлен apache22, работающий с php (с настройками можно ознакомиться в окрестностях ресурса http://www.lissyara.su/?id=1360, далее предполагается что веб-сервер настроен практически по указанной статье, особое внимание – последней строке в httpd.conf:"Include etc/apache22/configs/*.conf" и поддержке php) и имеющий несколько виртуальных хостов. LAM было решено прикрутить на виртуалхост 'lam.my-domain.local', тогда создаём файл конфигурации /usr/local/etc/apache22/configs/lam.conf такого содержания:
# LAM Virtual Hosts
<VirtualHost *:80>
ServerAdmin root@my-domain.local
DocumentRoot "/usr/local/www/lam"
ServerName lam.my-domain.local
ServerAlias gamma.my-domain.local
ErrorLog "/var/log/httpd/lam-error_log"
CustomLog "/var/log/httpd/lam-access_log" common
</VirtualHost>
<Directory "/usr/local/www/lam">
Options none
AllowOverride Limit
Order Deny,Allow
Deny from all
Allow from all
</Directory>

Для его корректной работы необходимо на локальном DNS-сервере (или в файле hosts администрирующего компьютера) наличие записи, сопоставляющей IP сервера с записью вида lam.my-domain.local или gamma.my-domain.local. Всё. Заходим на http://lam.my-domain.local настраиваем конфигурации LAM ("мастер-пароль" LAM по умолчанию - lam), возвращаемся на экран авторизации LDAP (основное око входа LAM), вводим пароль для админа и настраиваем домен. Будет задано несколько вопросов об автоматическом создании записей в LDAP – я отвечал утвердительно, после чего получил вполне рабочую версию настроек дерева домена и пользователей. Для поиска ошибок следует почитать логи, указанные как ErrorLog и CustomLog – в моей конфигурации, например, запрещено устанавливать опции в файлах '.htaccess', поэтому пришлось комментировать строчки '#Options -Indexes' во всех этих файлах, расположенных в подкаталогах lam, иначе консоль не работала.
Всё. По-хорошему, можно приступать к эксплуатации – создавать администраторов и пользователей.
При создании пользователя приводятся весьма информативные подсказки. Порядок создания пользователя в LAM:
1. Заполняем поля в диалоге "Personal";
2. Заполняем поля в диалоге "Unix" (Важное замечание – почему-то у меня при создании пользователя, по умолчанию выбирается группа "Account Operators", что "не есть хорошо" – приходится следить за этим параметром), жмём кнопку "Установить пароль" и сохраняем его;
3. В диалоге "Samba 3" жмём "Добавить учётную запись Samba 3", очищаем поле "Samba пароль", чтобы использовать пароль, введённый на предыдущем этапе, изменяем поле "Windows группа" в соответствии со своими планами и жмём кнопочку "Сохранить". В ответ получаем фразу:
"LDAP операция завершена успешно.
Учетная запись создана успешно"
Либо диагностическое сообщение с описанием ошибки.
Кроме того, есть крайне полезная возможность создания учётных записей "оптом" из файла – "Утилиты → Загрузка файла"

http://www.bubnov.su

Обновлено: 12.03.2015