6.8.09

Samba+OpenLDAP+Smbldap-tools

Здесь опишу как я делал систему авторизации пользователей windows в samba+ldap. Простейший сервер для сетевой авторизации, без прописывания в DNS и DHCP, без авторизации с помощью керберос, но сетевыми профилями хранящимися на сервере. Самое необходимое для небольшого офиса, что бы не покупать дорогущий сервер Windows с AD при минимальных временных затратах. Данный сервер был установлен на Fedora 10. Использовались пакеты из репозитария.Ничего не перекомпилировалось, все так сказать из коробки. Итак:

Сервер для авторизации windows клиентов с контролем доступа к ресурсам на основе Samba+OpenLDAP+Smbldap-tools

Для начала были установлены следующие пакеты:
# yum install samba openldap-servers smbldap-tools
После установки компонентов и их зависимостей, настраиваем ldap сервер. Для данной работу нужно сконфигурировать два файла. ldap.conf - конфиг клиента используемого самим сервером, и конечно же, slapd.conf - для конфигурации сервера. Оба файла находятся в /etc/openldap/ для своего сервера я использовал следующие конфигурации:
Конфиг ldap.conf

BASE dc=domain,dc=local
URI ldap://127.0.0.1/


Конфиг slapd.conf

include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/samba.schema
allow bind_v2
loglevel 256
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
database bdb
suffix "dc=domain,dc=local"
rootdn "cn=root,dc=domain,dc=local"
rootpw {MD5}secret_hash

access to attrs=userPassword,sambaLMPassword,sambaNTPassword
by self write
by anonymous auth
by * none

access to dn.base=""
by * read

access to dn.base="cn=Subschema"
by * read

access to attrs=shadowLastChange
by self write
by * read

access to *
by * read

directory /var/lib/ldap
index sambaSID eq
index sambaPrimaryGroupSID eq
index sambaDomainName eq
index objectClass,uid,uidNumber,gidNumber,memberUid eq
index cn,mail,surname,givenname eq,subinitial
database monitor


Разберём указанные директивы файла ldap.conf.

указываем базовый DN нашего домена должно указываться в отличительном формате LDAP:
BASE dc=domain,dc=local

Далее идет опция указывающая местонахождения сервера LDAP, в данном случае это 127.0.0.1:
URI ldap://127.0.0.1/

Теперь рассмотрим директивы непосредственно самого сервера OpenLDAP указаные в его основном конфиге slapd.conf:
директивами include обозначаеться местонахождение файлов схем. Схемы являються своеобразными скриптами написанными на языке который понимает OpenLDAP, они служат для более простого создания нужной информации в базе данных LDAP сервера. В нашем случае используються стандарные схемы которые идут в комплекте с пакетами samba и другими. Нам нужны только эти:
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/samba.schema

Разрешаем доступ к ldap по протоколу LDAP версии 2
allow bind_v2
На время настроек устанавливаем высокий уровень логов, для выявления ошибок:
loglevel 256
Стандартная директива указывающая на пид файл демона
pidfile /var/run/openldap/slapd.pid

Директива указувающая на файл в котором прописаны аргументы запуска демона из командной строки. То есть те аргументы котрые вы бы прописали для запускаемого вручную bp rjvfylyjq cnhjrb демона LDAP:
argsfile /var/run/openldap/slapd.args

Указываем формат базы данных. В данном случае это bdb:
database bdb

Суфикс DN нашего домена:
suffix "dc=domain,dc=local"

Указываем корневого пользователя для нашего сервера:
rootdn "cn=root,dc=domain,dc=local"
Далее следует указать хеш пароля для вышеуказаного пользователя сгенерированный командой:
#slappasswd -h {MD5}

в директиве:
rootpw {MD5}secret_hash
куда вместо secret_hash следует вписать хеш сгененрированный вышеуказанной командой. Далее указываем правила доступа к данным храняшимся в LDAP:

Доступ к записям в базе LDAP где храняться пароли Samba пользователей. Разрешаем запись для авторизированных пользователей, анонимным пользователям даем право на авторизацию, остальным запрещаем доступ к парольным записям:
access to attrs=userPassword,sambaLMPassword,sambaNTPassword
by self write
by anonymous auth
by * none
Устанавливаем на данные право только для чтения всем клиентам:
access to dn.base=""
by * read

access to dn.base="cn=Subschema"
by * read

Атрибут обновления Shadow на запись только авторизированным клиентам:
access to attrs=shadowLastChange
by self write
by * read
Остальное только для чтения для всех:
access to *
by * read
Теперь настроим Samba сервер. Основной конфиг самбы находиться в /etc/samba/ называеься smb.conf. Привожу свой рабочий конфиг:
netbios name = MAIN
workgroup = DOMAIN
server string = LDAP PDC
hosts allow = 10.12.0.0/24 127.0.0.0/8
security = user
encrypt passwords = yes
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
interfaces = lo eth0
bind interfaces only = yes
local master = yes
os level = 65
domain master = yes
preferred master = yes
null passwords = no
hide unreadable = yes
hide dot files = yes
domain logons = yes
logon path = \\%L\profiles\%U
logon drive = H:
logon home = \\%L\%U
wins support = yes
name resolve order = wins lmhosts host bcast
dns proxy = no
time server = yes
log level = 3 vfs:2
log file = /var/log/samba/log.%m
max log size = 0
add user script = /usr/sbin/smbldap-useradd -m "%u"
add machine script = /usr/sbin/smbldap-useradd -w -i "%u"
add group script = /usr/sbin/smbldap-groupadd -p "%g"
add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g"
delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g"
set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u"
passdb backend = ldapsam:ldap://127.0.0.1/
ldap delete dn = Yes
ldap ssl = no
winbind nested groups = no
ldap suffix = dc=domain,dc=local
ldap admin dn = cn=root,dc=domain,dc=local
ldap group suffix = ou=Group
ldap user suffix = ou=People
ldap machine suffix = ou=People
ldap idmap suffix = ou=Idmap
dos charset = CP866
syslog = 0

[netlogon]
path = /var/lib/samba/netlogon/
guest ok = Yes
browseable = no
write list = root
writable = no
share modes = no

[profiles]
comment = Network Profiles Service
path = %H
read only = No
store dos attributes = Yes
create mask = 0660
directory mask = 0770

[homes]
path = /home/%U
comment = Home Directories
valid users = %S, %D%w%S
browseable = No
read only = No
# inherit acls = Yes
create mask = 0660
directory mask = 0770
case sensitive = no
hosts allow = 10.12.0.0/24

[IPC$]
path = /tmp
hosts allow = 10.12.0.0/24 127.0.0.1
hosts deny = 0.0.0.0/0



Разберем указаные директивы. В начале у меня идут директивы работающие с именными параметрами сервера. В первой директиве указано что NetBios имя нашего сервера MAIN
netbios name = MAIN

Рабочая группа домена WORKGROUP
workgroup = WORKGROUP

Расширенное описание сервера которое будет видно для windows клиентов
server string = LDAP PDC

Сетевые настройки. Доступ до сервера разрешаем только для указных подсетей. В данном случае это петлевой интерфейс и локалка 10.12.0.0 с маской 255.255.255.0.
hosts allow = 10.12.0.0/24 127.0.0.0/8

Для контроллера домена уровень доступа выставляем в user:
security = user

Указываем что пароли при передаче по сети следует шифровать:
encrypt passwords = yes

Опции для соединения клиентов с сервером:
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192

Интерфейсы которые на которых демон будет ожидать соединения:
interfaces = lo eth0

Проверяем пакеты на соответствие широковещательному адресу для указанных интерфейсов, если пакет не соответствует этому адресу то не обрабатываем его:
bind interfaces only = yes

Ниже следуют некоторые настройки для NetBios сервера. Указываем что наш сервер должен пытаться стать мастер-браузером NetBios в сети:
local master = yes

Указываем уровень сервера в выборах мастер-браузера сети. Максимальное значение 255. Данный параметр сравнивается с параметрами остальными присутствующих в подсети клиентов NetBios и в зависимости от величин устанавливается какой сервер будет мастер-браузеров:
os level = 65

Указываем что наш сервер может составлять списки машин в сети, и передавать их, в случае более высокого уровня у какой либо из машин, для мастер-браузера сети:
domain master = yes

Если у вас один сервер в сети лучше всего выставить в принудительный захват роли мастер-браузера, если нет то следует очень осторожно обращаться с данным параметром, так как он может вызвать высокий широковещательный трафик в сети:
preferred master = yes

Некоторые параметры безопастности. Запрещаем пустые пароли:
null passwords = no

Запрещаем показывать нечитаемые для клиентов файлы:
hide unreadable = yes

Запрещаем показывать файлы которые начинаются с точки. (Для LInux являются скрытыми файлами):
hide dot files = yes

Поддержка режима работы для станций Win9x и режима работы как контроллер NT4:
domain logons = yes

Выключаем поддержку вложенных групп:
winbind nested groups = no

Парметры указывающие пути до домашних директорий на сервере для пользователей, а так же сетевой диск с данными профиля, где под %L будет пониматься наш сервер, а %U имя пользователя :
logon path = \\%L\profiles\%U
logon drive = H:
logon home = \\%L\%U

Включаем поддержку WINS:
wins support = yes

Указываем в каком порядке использовать методы резолвинга имён хостов в сети. В данном случае используются сначала wins, потом файл самбы lmhost, потом файл hosts системы, потом при помощи широковещательной рассылки:
name resolve order = wins lmhosts host bcast

Указываем что если демон wins не смог разрешить имя NetBios, то следует сделать запрос к серверу DNS:
dns proxy = no

Указываем что данный серве являеться сетевым сервером времени для Windows машин:
time server = yes

Указываем уровень вывода отладочной информации в лог. Также указываем вывод информации о чтении-записи в файловые системы.
log level = 3 vfs:2

Указываем лог-файл для сервера, в данном случае использеться разный лог для разных машин что указывает переменная %m:
log file = /var/log/samba/log.%m

Указываем, что не следует ограничивать размер файла лога:
max log size = 0

Далее следуют скрипты обработки данных для работы с LDAP и samba из пакета smbldap-tools:
Скрипт добавления пользователя в домен:
add user script = /usr/sbin/smbldap-useradd -m "%u"

Скрипт добавления машины в домен:
add machine script = /usr/sbin/smbldap-useradd -w -i "%u"

Скрипт добавления группы пользователей в домен:
add group script = /usr/sbin/smbldap-groupadd -p "%g"

Скрипт добавления пользователей в группу домена:
add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g"

Скрипт удаления пользователея из группы домена:
delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g"
Скрипт установки первичной группы для пользователя домена:
set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u"

Указываем параметры для работы с LDAP:
Адрес сервера LDAP. В нашем случае Samba и LDAP сервера находяться на одной машине:
passdb backend = ldapsam:ldap://127.0.0.1/

Разрешаем операции удаления в данных в LDAP:
ldap delete dn = Yes

Не используем ssl соединение c LDAP:
ldap ssl = no

Указываем суффикс для сервера:
ldap suffix = dc=domain,dc=local

Указываем DN администратора для соединения с LDAP:
ldap admin dn = cn=root,dc=domain,dc=local

Суффикс группы в базе LDAP:
ldap group suffix = ou=Group

Суффикс пользователей в базе LDAP:
ldap user suffix = ou=People

Суффикс машин в базе LDAP (тут указан тот же суффикс что и для пользователей из-за некоторой ошибки при работе с LDAP при присоединении компьютера к домену) :
ldap machine suffix = ou=People

IDmap суффикс в базе LDAP:
ldap idmap suffix = ou=Idmap

Указываем кодировку для Windows клиентов (для корректной поддержки кириллицы в именах файлов):
dos charset = CP866

Указываем что демону syslog передавать только сообщения о ошибках:
syslog = 0
На этом раздел [global] закрыт. Делее следуют разделы в которых указываются общие ресурсы и доступ к ним.

Системный ресурс [profiles] это ресурс на котором записывается профиль пользователя. У меня установлены следующие директивы:
комментарий к ресурсу который увидит пользователь Windows:
comment = Network Profiles Service

Путь до ресурса. Зависит от имени пользователя и домена.
path = %H

Указываем что данные на шара могут быть перезаписаны пользователем:
read only = No

Указываем что демон должен прочитать DOS атрибуты(Скрытй, Архивный, Только для чтения) файлов, из расширенных атрибутов прежде чем преобразовать атрибуты DOS в атрибуты UNIX:
store dos attributes = Yes

Указываем маску для файлов создаваемых пользователем:
create mask = 0660

И маску для директорий создаваемых пользователем:
directory mask = 0770

Далее следует каталог для пользовательской домашней директории [homes].
Путь на сервере в зависимости от имени пользователя, в папке /home/:
path = /home/%U

Маска для пользователей которым разрешён вход на ресурс:

valid users = %S, %D%w%S

Указываем что данный ресур не будет виден из проводника windows:
browseable = No

Не чувствительность к регистру символов для этого ресурса:
case sensitive = no

До данной директории допускаем только клиентов нашей подсети:
hosts allow = 10.12.0.0/24

Указываем ресурс [IPC$] (Inter Process Communication) данный ресурс предназначен для создания именованных каналов, для обмена различной служебной информацией меж компютерами. Путь ресурса будет в папочке /tmp системы:
path = /tmp

Разрешаем доступ до ресурса только для нашей подсети и запрещаем для всех остальных:
hosts allow = 10.12.6.0/24 127.0.0.1
hosts deny = 0.0.0.0/0

С конфигом smb.conf закончили. Нужно внести пароль для DN указаного в директиве 'ldap admin dn' в конфиге smb.conf, выполнив команду:
# smbpasswd -W
И введя соответсвующий пароль.

Далее следует указать настройки для локальной аутентификации. Для этого указываем в фале nsswitch.conf что для авторизации также используем winbind, добавляя параметр winbind для директив passwd, shadow, group:
passwd: files ldap winbind
shadow: files ldap winbind
group: files ldap winbind

Так же следует изменить файл /etc/ldap.conf принадлежащей пакету nss_ldap:
host main
base dc=domain,dc=local
bind_policy soft
pam_password md5
ssl no
nss_map_attribute uniqueMember member
pam_filter objectclass=posixAccount
nss_base_passwd ou=Computers,dc=domain,dc=local
nss_base_passwd ou=People,dc=domain,dc=local
nss_base_shadow ou=Computers,dc=domain,dc=local
nss_base_shadow ou=People,dc=domain,dc=local
nss_base_group ou=Group,dc=domain,dc=local
debug 0
logdir /var/log/nss_ldap

Директивы файла означают следующее:

Имя сервера:
host main

База на сервере LDAP:
base dc=domain,dc=local

Возвращение ошибки для nss_ldap при недоступности ldap:
bind_policy soft

Шифруем пароли методом md5:
pam_password md5

Не используем ssl:
ssl no

Указываем что атрибут member будет использоваться при запросах как атрибут uniqueMember:
nss_map_attribute uniqueMember member

Фильтр поиска по базе LDAP:
pam_filter objectclass=posixAccount

Далее следуют указание где искать данные для passwd, shadow, group,
nss_base_passwd ou=Computers,dc=domain,dc=local
nss_base_passwd ou=People,dc=domain,dc=local
nss_base_shadow ou=Computers,dc=domain,dc=local
nss_base_shadow ou=People,dc=domain,dc=local
nss_base_group ou=Group,dc=domain,dc=local

Уровень отображения ошибок. Можно при настройке использовать уровень 256 что бы видеть отладочные сообщения:
debug 0

Место нахождения log-файла:
logdir /var/log/nss_ldap

Теперь настроим утилиту для взаимодействия с LDAP и самбой smbldap-tools. У утилиты есть два конфигурационых файла, находящихся в /etc/smbldap-tools/. Это smbldap_bind.conf и smbldap.conf, первый содержит параметры соединения с базой LDAP, второй содержит парметры для взаимодействия с базой LDAP. Итак smbldap_bind.conf:

masterDN="cn=root,dc=domain,dc=local"
masterPw="secret"
Параметры означают следующее:
Директива masterDN содержит DN в формате LDAP для основного доступа:
masterDN="cn=root,dc=domain,dc=local"

Параметр masterPw содержит пароль основного доступа
masterPw="secret"
Можно также настроит и вторичный доступ к серверу директивами slaveDN и slavePw. Я не стал усложнять и указал root пользователя из конфига LDAP, хотя ради безопастности можно создать отдельного пользователя в базе LDAP который бы имел права на изменение параметров других пользователей.


SID="S-1-5-21-76483924-3502640226-4065347779"
sambaDomain="DOMAIN"
slaveLDAP="127.0.0.1"
slavePort="389"
masterLDAP="127.0.0.1"
masterPort="389"
ldapTLS="0"
verify="require"
cafile="/etc/pki/tls/certs/ldapserverca.pem"
clientcert="/etc/pki/tls/certs/ldapclient.pem"
clientkey="/etc/pki/tls/certs/ldapclientkey.pem"
suffix="dc=domain,dc=local"
usersdn="ou=People,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Group,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
scope="sub"
hash_encrypt="MD5"
crypt_salt_format="%s"
userLoginShell="/bin/bash"
userHome="/home/%U"
userHomeDirectoryMode="700"
userGecos="User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/etc/skel"
defaultMaxPasswordAge="45"
userSmbHome="\\MAIN\%U"
userProfile="\\MAIN\profiles\%U"
userHomeDrive="H:"
mailDomain="domain.local"
with_smbpasswd="0"
with_slappasswd="0"


Рассмотрим директивы поподробнее. Первая это SID локальной системы. Что бы его получить следует запустить сервисы Samba:
#/etc/init.d/smb start
#/etc/init.d/nmb start


После чего выполнить команду
#net getlocalsid


которая в ответ выдаст SID локальной системы. Его следует скопировать в нижеследующую директиву:
SID="S-1-5-21-76483924-3502640226-4065347779"

Домен Samba кторый указали в конфиге smb.conf:
sambaDomain="DOMAIN"

Указываем адресс основного сервера LDAP и порт который слушает LDAP:
masterLDAP="127.0.0.1"
masterPort="389"
Не используем TLS:
ldapTLS="0"

требуем проверки сертификата сервера:
verify="require"
Пути до сертификатов сервера и клиента соотвественно:
cafile="/etc/pki/tls/certs/ldapserverca.pem"
clientcert="/etc/pki/tls/certs/ldapclient.pem"
clientkey="/etc/pki/tls/certs/ldapclientkey.pem"
Суфикс в формате LDAP:
suffix="dc=domain,dc=local"

основные DN сервера:
usersdn="ou=People,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Group,${suffix}"
idmapdn="ou=Idmap,${suffix}"

Указываем как брать свобные UNIX UID и GID для новых пользователей:
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"

Диапазон по умолчанию:
scope="sub"

Метод шифрования:
hash_encrypt="MD5"
Формат соли для шифрования:
crypt_salt_format="%s"

Параметры пользователей которые будут прописаны в LDAP.
Шелл для пользователя:
userLoginShell="/bin/bash"

Домашняя директория с точки зрения сервера:
userHome="/home/%U"

Права дуступа для домашних каталогов:
userHomeDirectoryMode="700"

Вспомогательное поле для пользовователей, содержашее дополнительную информацию:
userGecos="User"

Samba GID для пользователея по умолчанию:
defaultUserGid="513"

Samba GID для компютера по умолчанию:
defaultComputerGid="515"

Директория которая буде копироваться в профиль новых пользователей:
skeletonDir="/etc/skel"

Время жизни пароля по умолчанию в сутках:
defaultMaxPasswordAge="45"

Путь до домашней директории пользователя Samba:
userSmbHome="\\MAIN\%U"
Путь до профиля пользователя Samba:
userProfile="\\MAIN\profiles\%U"

Сетевой диск с домашней директорией подключаемы у клиента:
userHomeDrive="H:"

Почтовый домен:
mailDomain="mail.domain.local"

Позволяет не использовать smbpasswd и slappasswd предпочитая Crypt:: библиотеки:
with_smbpasswd="0"
with_smbpasswd="0"
Теперь следует запустить службу LDAP
#/etc/init.d/ldap start
Теперь с помощью скриптов из smbldap-tools заполняем базу данных:
#smbldap-populate

Будут внесены основные пользователи и группы. Остальных пользователей добавляем командой:
#smbldap-useradd -a -m -P user

После этого в можно заводить пользовательский машины в домен.

Может что то забыл. Буду дополнять и исправлять статью по мере нахождения ошибок.

4 комментария:

  1. во что забыл
    bdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap

    ОтветитьУдалить
  2. Ну да этот файл следует создать в каталоге с базой данных. У меня он пустой.

    ОтветитьУдалить
  3. он лежит /usr/share/doc/openldap-servers-2.4.18/DB_CONFIG.example я его спопировал и переименовал
    и еще щас пробую все это на федоре 12 и наткнулся на вот что (уточняю openldap-servers 2.4.18) они все поменяли(враги блин)
    --------------------
    An existing slapd.conf(5) file can be converted to the new format using slaptest(8) or any of the slap tools:

    slaptest -f /usr/local/etc/openldap/slapd.conf -F /usr/local/etc/openldap/slapd.d

    You can then discard the old slapd.conf(5) file. Make sure to launch slapd(8) with the -F option to specify the configuration directory.
    ------------------
    и еще учтони для людей
    yum install migrationtools
    потом правим /usr/share/migrationtools/migratiom_common.ph чтобы легко было сконвертить пользователей и т.д.

    Щас все это проверю и попробую поставить Fedora Directory Server на существующую БД ldap.

    ОтветитьУдалить
  4. https://wiki.samba.org/index.php/FAQ
    "An LDAP backend to the AD DC is not a viable proposition at this point in time, as even with the addition of massive extra resources trying to revive it would create an incredible distraction. ..."

    ОтветитьУдалить

Популярные сообщения