Настройка Samba-3.0.23d на FreeBSD-5.3 с авторизацией в Windows 2000 AD

В данном опусе речь пойдет о создании файлового сервера, работающего под управлением ОС FreeBSD-5.3 на основе пакета Samba-3.0.23d и последующем внедрении оного в качестве файлового сервера в домен, работающий под управлением Windows 2000 Server.
Статья является всего лишь попыткой поделиться своим опытом в вопросе интеграции *nix-like систем в сети, работающие под управлением серверов MS Windows, и является для автора дебютным произведением, посему любые конструктивные замечания/пожелания/дополнения/исправления будут с радостью приняты, всесторонне рассмотрены и при необходимости - учтены и внесены.
Итак, вперед. Файловый сервер будет работать в сети, состоящей из одного главного и одного вторичного Active Directory контроллеров домена, работающих под управлением ОС Windows 2000 Server. На создаваемом сервере необходимо будет настроить протоколирование действий пользователей и организовать сетевую корзину для некотрых сетевых папок.
Определимся с терминами: домен будет иметь название local.domain первичный контроллер домена будет иметь адрес 192.168.0.1 и доменное имя pdc.local.domain, вторичный - 192.168.0.2 и bdc.local.domain, создаваемый файловый сервер - filesrv.local.domain и адрес 192.168.0.3 соответственно. Файловый сервер будет иметь 3 сетевых папки, для 2-х из которых будет настроено журналирование действий пользователей и для одной из них будет организована поддержка сетевой корзины.
Что ж, приступим.
0. В качестве разминки перед боем проведем маленький экскурс в теорию.
Windows 2000 Active Directory домен с членами домена может работать двух основных режимах: в режиме NT-совместимости (NT-style compatibility) и в "родном режиме" (Native mode). В первом случае для авторизации членов домена используется протокол NTLM и данный режим используется для авторизации членов домена работающих под управлением Windows NT и Windows 9x. В "нативном" - "родном" режиме работы для авторизации клиентов используется модификация протокола Kerberos версии 5. Для работы в данном режиме соответственно необходима поддержка клиентом данного протокола, которая существует в версиях начиная с Windows 2000. Согласно документации от Microsoft - http://www.microsoft.com/rus/windows2000/l...w2k_SecTech.asp данный режим работы обеспечивает ряд преимуществ по сравнению с устаревшим протоколом NTLM, посему доверимся вышеуказанным сведениям и будем создавать сервер в "нативном" режиме AD-домена.

1. Перейдем непосредственно к настройке. Прежде всего необходимо удостовериться, что наш будущий сервер получает FQDN (Full Qualified Domain Name) имена нашего контроллера. То- есть, если команда ping pdc отрабатывает нормально, значит NIS настроен и можно переходить к п. 2. В противном случае нам нужно прописать соответствия IP-адресов именам хостов в файле /etc/hosts в виде: "IP-Address Full-Qualified-Hostname Short-Hostname . В нашем случае /etc/hosts будет иметь вид:
Код

192.168.0.1 pdc.local.domain pdc
192.168.0.2 bdc.local.domain bdc
192.168.0.3 filesrv.local.domain filesrv

ВНИМАНИЕ! В конце последней строки ОБЯЗАТЕЛЬНО необходимо сделать перевод на новую строку, иначе в будущем возможны проблемы при подключении сервера к домену.

2. Произведем установку Samba. Автор собирал Samba не из портов, а из пакета, посему это описание и приводится.
Командами tar -zxvf samba-.3.0.23d.tar.gz распакуем пакет, cd samba-3.0.23/source перейдем в каталог сборки. Теперь необходимо произвести конфигурацию, компиляцию и, собственно, установку программы. Разобьем этот процесс на три этапа.

2.1. Для конфигурирования сборки Samba существует множество опций, список которых можно посмотреть командой ./configure -help. Из всего многообразия команд нам для выполнения поставленной задачи необходимы следующие опции: --prefix=/usr/local/samba --with-ads --with-ldap --with-winbind --with-included-popt --with-acl-support --with-utmp -with-libsmbsharemodes --with-libmsrpc -with-syslog --enable-cups=no Назначения большинства параметров очевидны из названия: устанавливать в /usr/samba , поддержка Active Directory, MS RPC, ACL, Syslog, поддержка модуля Winbind, выключение поддержки системы печати CUPS.

2.2. После отработки скрипта конфигурации приступим непосредственно к компиляции, которая выполняется... правильно, командой make.

2.3 После окончания компиляции командой make install установим пакет.
ВНИМАНИЕ! У автора при инсталляции пакета по непонятной причине библиотека samba-3.0.23d/source/nsswitch/nss_winbind.so не скопировалась в системную директорию с библиотеками. Если же и у вас возникла подобная ситуация - нужно вручную скопировать ее например в /usr/local/lib. Возможно, необходимо будет создать символическую ссылку: ln -s nss_winbind.so nss_winbind.so.1 и выполнить ldconfig.
Все, процесс установки Samba успешно выполнен.

3. Настройка Kerberos.
Во FreeBSD протокол Kerberos является частью системы, посему никаких дополнительных установок производить не нужно.
Основной файл конфигурации расположен в /etc/krb5.conf. Если его нет - нужно его создать: touch /etc/krb5.conf
В данный файл нам необходимо добавить параметры нашей доменной области (realm), центра выдачи ключей - KDC (Key Distribution Center), которым по умолчанию является основной контроллер домена. Также, в данном конфигурационном файле можно задавать дополнительные параметры, такие, как время жизни билета, используемые протоколы и типы криптоалгоритмов, файлы журналов и т.п. Подробное описание их всех содержится в справочной странице krb5.conf.
Применительно к нашей сети файл будет иметь вид:

Код

[libdefaults]
default_realm = LOCAL.DOMAIN
dns_lookup_realm = false
dns_lookup_kdc = false
krb4_get_tickets = false
default_etypes = des-cbc-crc des-cbc-md5
default_etypes_des = des-cbc-crc des-cbc-md5

[appdefaults]
proxiable = true
ticket_lifetime = 24h
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false

[realms]
LOCAL.DOMAIN = {
kdc = tcp/pdc.local.domain:88 tcp/bdc.local.domain:88
admin_server = pdc.local.domain
default_domain = local.domain
}

[domain_realm]
.local.domain = LOCAL.DOMAIN
local.domain = LOCAL.DOMAIN

[kdc]
enable-kerberos4 = false

[logging]
default = FILE:/var/log/kerberos/krb5libs.log
kdc = FILE:/var/log/kerberos/krb5kdc.log
admin_server = FILE:/var/log/kerberos/kadmind.log

ВНИМАНИЕ! Содержимое файла чувствительно к регистру символов!
Для проверки правильности настроек выполним команду kinit admin@LOCAL.DOMAIN, где admin - доменная учетная запись, имеющая права администратора домена. В ответ мы должны получить нечто следующее:

Цитата

kinit: NOTICE: ticket renewable lifetime is 1 week

Это означает, что Kerberos-билет получен, т.е. настройка поддержки Kerberos выполнена успешно.
Но на данном этапе могут возникнуть и ошибки, самая распространенная из которых:

Цитата

Clock skew too great

Если такое возникло то прежде всего необходимо проверить время на локальной машине и на контроллере домена, скорее всего существует разница во времени более 5 минут (по умолчанию для Kerberos) или же, при одинаковом времени на сервере и контроллере, установлены разные часовые пояса. В общем, время на сервере нужно синхронизировать с временем на PDC.
Есть еще один вариант, очень неочевидный: выше мы упоминали про то, что если в /etc/hosts прописывается соответствие IP-адресов именам машин, то в конце последней строки обязательно должен быть пробел. Так вот если последней записью идет имя сервера или имя контроллера домена и в конце нет Enter'a, то будет появляться данная ошибка.
При возникновении других ошибок внимательно пересмотрите /etc/krb5.conf - скорее всего где-то ошибка в регистре символов переменных.

4. Настройка Samba.
Как известно, все основные настройки содержатся в конфигурационном файле smb.conf, который расположен в $PREFIX/lib. По умолчанию данного файла нет и нам нужно будет его создать - touch /usr/samba/lib/smb.conf.
Конфигурационный файл состоит из 3-х специальных разделов: [globals] - глобальные настройки, [homes] - домашние папки пользователей, [printers] - настройки печати посредством Samba и пользовательских разделов, которые представляют собой описания настроек сетевых папок. Имена разделов заключаются в квадратные скобки, задание параметров выполняется в виде key=value .
Начнем заполнение файла. Дабы не загромождать конфиг описаниям параметров вначале приведем его целиком, а ниже разберем и дадим описание ключевых параметров:

Код

[global]
dos charset = 866
unix charset = KOI8-U
workgroup = WG
realm = LOCAL.DOMAIN
server string = Файловый сервер
interfaces = 192.168.0.3/24
security = ADS
auth methods = winbind
password server = 192.168.0.1 192.168.0.2
private dir = /etc/samba
passdb backend = tdbsam
client NTLMv2 auth = Yes
log level = 0 vfs:1
log file = /var/log/samba/samba.log
max log size = 0
deadtime = 360
max open files = 100000
fam change notify = No
paranoid server security = No
load printers = No
show add printer wizard = No
os level = 8
idmap uid = 10000-20000
idmap gid = 10000-20000
winbind enum users = Yes
winbind enum groups = Yes
winbind use default domain = Yes
winbind nested groups = No
winbind refresh tickets = Yes
hosts allow = 192.168.0.
case sensitive = No
hide unreadable = Yes

[Документы]
comment = Архив документов
path = /mnt/hdd1
valid users = @WGvse
admin users = @WGit
read only = No
create mask = 0777
directory mask = 0777
inherit acls = Yes
inherit owner = Yes
veto files = /quota.*/.snap/
hide files = .snap
map archive = No
vfs objects = recycle full_audit
recycle:repository = /mnt/hdd2/lost_n_found
recycle:keeptree = yes
recycle:versions = yes
recycle:exclude = *.tmp | *.TMP | ~$* | ~WRL*
recycle:excludedir = /mnt/hdd1/temp
recycle:maxsize = 104805760

full_audit:facility=LOCAL5
full_audit:priority=INFO
full_audit:failure = mkdir rmdir write unlink rename
full_audit:success = mkdir rmdir write unlink rename
full_audit:prefix = %m|%U

[pub]
path = /mnt/hdd2
valid users = @WGvse
admin users = @WGit
read only = No
create mask = 0775
directory mask = 0775
inherit permissions = Yes
inherit acls = Yes
inherit owner = Yes
veto files = /quota.*/.snap/
hide files = .recycle
vfs objects = full_audit

full_audit:facility=LOCAL5
full_audit:priority=NOTICE
full_audit:failure = mkdir rmdir write unlink rename
full_audit:success = mkdir rmdir write unlink rename
full_audit:prefix = %m|%U

[install]
comment = 123
path = /mnt/hdd3
valid users = @WGit, WGd05-tishen
admin users = @WGit
read only = No
create mask = 0777
directory mask = 0777

Теперь рассмотрим более подробно:

dos charset=866
unix charset= KOI8-U
workgroup = WG
server string = Файловый сервер

Очевидно, что это настройки кодовых страниц, NetBIOS-имя сервера и строка описания. Так как автор родом с Украины, то кодовая страница - KOI8-U.

password server = 192.168.0.1 192.168.0.2
interfaces = 192.168.0.3

Первый параметр определяет имена или адреса серверов, на которых Samba будет авторизировать пользователей, которые обращаются к ее ресурсам. В данном параметре можно указывать доменные имена хостов, их IP-адреса или символ "*". В последнем случае Samba сама будет определять какой сервер выбрать для авторизации доменных пользователей.
Второй параметр определяет какой интерфейс Samba будет "слушать" на наличие входящих сетевых запросов.

realm=LOCAL.DOMAIN - имя домена, которое используется в нашей сети.
ВНИМАНИЕ! Имя должно быть таким же, как и прописано в /etc/krb5.conf и набрано в таком же регистре!

security=ADS - тип авторизации на сервере, Так как у нас AD-домен, то и тип авторизации - для AD.

encrypt passwords = Yes - разрешить шифрование паролей.

auth methods = winbind - указывает Samba использовать модуль winbind при авторизации пользователей.

idmap uid = 10000-20000
idmap gid = 10000-20000
Диапазон идентификаторов пользователя и группы, которые будут выделяться при отображении Win-пользователей с их SID (Secure ID) в UNIX. Диапазон не должен включать UID и GID существующих во FreeBSD пользователей и групп (обычно локальные записи имеют значения ID < 1000).

winbind enum users = Yes
winbind enum groups = Yes
winbind use default domain = Yes
winbind refresh tickets = Yes
Дает указание Samba-модулю winbind вести учет пользователей и групп вместо локальных системных вызовов setpwent(), getpwent(), рассматривать пользователей без доменного имени перед именем пользователя (DOMAINuser) как пользователей, принадлежащих к данному домену и производить обновление Kerberos-билетов с помощью модуля winbind.

log level = 0 vfs:1
log file = /var/log/samba/samba.log
max log size = 0
Настройки протоколирования: уровень общих логов устанавливается в 0 (только ошибки), для VFS-модулей - 1 (ошибки и предупреждения); путь к файлу журнала и размер лог-файла - неограниченный.

client NTLMv2 auth = Yes - если в сети есть машины с WinNT <SP4 - то нужно добавить поддержку протокола NTLM версии 2. При включении этой опции plaintext и lanman протоколы аутентификации будут отключены. Если же таких машин нет - данный параметр не нужен.

fam change notify = No - отключить демона FAM, который оповещает подключенных к Samba клиентов о изменении в структуре каталогов. У автора по невыясненной причине сей модуль периодически выдавал ошибки, посему оный был просто отключен.

load printers = No
show add printer wizard = No
Не включать поддержку печати и не показывать в списке сетевых ресурсов сервера папку "Принтеры"

os level = 8
Указывает "вес" Samba-сервера при участи в выборах обозревателя сети (не путать с DNS). Обычно основным обозревателем является контроллер домена, но это не обязательно. Мы же так и оставим - пусть контроллер сам себя "выбирает"

hosts allow = 192.168.0. - список IP- адресов, которым разрешено подключаться к Samba-серверу.

case sensitive = No - не различать регистр символов в именах файлов/директорий.

hide unreadable = Yes - прятать от пользователей файлы и каталоги, для которых у них нет прав чтения.

5. Так, настройка глобальной секции завершена, посмотрим на настройки сетевых папок. Итак, по заданию у нас должно быть 3 сетевые шары 2 из которых должны вести протоколы работы пользователей и одна из них в нагрузку должна иметь сетевую корзину.

Вместе с Samba поставляется ряд так называемых "VFS-модулей" (Virtual File System), с их помощью становится возможным выполнение таких действий как протоколирование процесса работы на сетевых папках, организация сетевой корзины, теневое копирование (shadow copy) данных, подключение антивирусных модулей и т.п. В частности, для протоколирования действий пользователей в Samba имеется три VFS-модуля: audit, extd_audit, full_audit. Для поставленной нами задачи мы будем использовать последний из них.
У данного модуля, впрочем как и у других, есть ряд параметров, с помощью которых производится его конфигурирование и настройка. Указание параметров производится в следующем виде:

имя_модуля:параметр1
имя_модуля:параметр2=значение1
имя_модуля:параметр3=значение2 значение3 значение4

Все настройки производятся в главном конфигурационном фале Samba - smb.conf. Полный список параметров можно, вернее даже лучше всего, посмотреть в исходном коде модуля, который находится в директории samba-3.0.23d/source/vfs. Давайте построчно рассмотрим вышеприведенный конфиг:

vfs objects = full_audit
Подключает использование данного модуля при работе с указанной сетевой папкой

full_audit:prefix= %m|%U
Задает возможность с помощью макропеременных Samba подставлять нужные значения в качестве источника события на сетевой папке при протоколировании действий. В нашем случае в качестве источника будет производится подстановка вида NetBIOS_имя_комьютера|имя_пользователя и в log-файл будет записываться что-то вроде:

Цитата

Mar 5 08:47:51 calypso smbd_audit: comp1|username|mkdir|ok|/mnt/hdd1/new folder

full_audit:success=write rename unlink mkdir rmdir
full_audit:failure=write rename unlink mkdir rmdir

Модуль протоколирует действия которые завершились успешно - параметр success и закончились неудачей - failure соответственно. Как, наверное уже понятно, для данной сетевой папки мы будем фиксировать как "успех" так и "неудачу" создания, переименования и удаления файлов и директорий. Если же, например, нужно протоколировать ВСЕ неудачные действия на шаре то параметр full_audit:failure нужно не указывать и по умолчанию он будет фиксировать все "неудачи".

full_audit:facility=LOCAL5
full_audit:priority=INFO

Здесь мы остановимся немного подробнее.
Samba умеет вести журналы как самостоятельно так и с помощью системы Syslog. Для подробного протоколирования действий пользователей второй вариант является более предпочтительным, так как с его помощью можно более гибко настроить журналирование. Данная гибкость, в частности, позволит нам вести протоколы работы с каждой сетевой папкой в отдельный файл.
Для определения источника журналируемых записей Syslog имеет такие понятия как "категория" - facility и "приоритет" - priority. Категория - это ряд предописанных значений, событий, вроде сообщений о регистрации пользователей, сообщений от системного планировщика, ядра, почтовой системы и т.п. Применительно к нашей задаче имеются зарезервированные категории local0 - local7, которые не привязаны ни к какому системному событию и могут быть свободно использованы администратором.
Понятие "приоритет" означает уровень важности поступаемых сообщений. Имеется 8 уровней приоритета: debug, info, warning, notice, warning, err, crit, alert, emerg.
Нам необходимо настроить протоколирование таким образом, чтобы протоколы с сетевых папок велись в отдельные файлы: каждая "шара" - в свой файл журнала. Вот здесь нам на помощь и приходят вышеописанные уровни приоритета. Мы каждой системной папке присвоим свой уникальный уровень приоритета в пределах выбранной категории, а syslog сконфигурируем таким образом, чтобы он разделял протоколы, поступающие от сетевых папок. Т.е. будут использоваться приоритеты INFO и NOTICE категории LOCAL5.
Приступим к настройке syslogd.
По умолчанию во FreeBSD все сообщения класса notice перенаправляются в файл /var/log/messages. Нам сие не нужно, поэтому нужно переконфигурировать syslog дабы разделить поступаемые классы сообщений. Сделаем это следующим образом: строку

Код

*.notice ...

заменим на

Код

local5.=info /var/log/samba/docs.log
local5.=notice /var/log/samba/pub.log
local0.notice;local1.notice;local2.notice;local3.notice /var/log/messages
local4.notice;local6.notice;local7.notice /var/log/messages

Таким образом мы выделили приоритеты info и notice категории local5 и перенаправили их в соответствующие файлы журналов и, на всякий случай, для других приложений перенаправили остальные категории local0-local7 приоритета notice в /var/log/messages

6. Теперь очередь за настройкой сетевой корзины. За это отвечает VFS-модуль recycle. У него имеются следующие параметры:

recycle:repository=/mnt/hdd2/lost_n_found
Абсолютный путь к папке, в которую будут перемещаться удаленные на сетевой шаре файлы и директории.

recycle:exclude = *.tmp | *.TMP | ~$* | ~WRL*
Список регулярных выражений для имен файлов которые при удалении будут удаляться, а не перемещаться в корзину. Каждое выражение отделяется от соседних символом "|".
ВНИАНИЕ! Маска файла и символ "|" обязательно должны разделяться символом пробела.

recycle:excludedir = /mnt/hdd1/temp
Список директорий удаление файлов и директорий из которых не переместит их в сетевую корзину и они на самом деле будут удалены.

recycle:maxsize=104805760
Максимальный размер файла в байтах, который может помещаться в корзину, если размер больше - файл будет удален. В данном случае в корзину будут попадать файлы размером не более 10 Мб.

recycle:keeptree
При удалении файла сохранять весь файловый путь относительно сетевой папки. Т.е. например при удалении файла file.txt, находящегося по пути path/to/file относительно сетевой шары [pub] с абсолютным путем /mnt/hdd2, в сетевой корзине будет создан файловый путь/mnt/hdd2/path/to/file и в эту директорию будет помещен file.txt.

recycle:versions
При удалении одного и того же файла filename, находящегося по одному и тому же сетевому пути, в сетевой корзине будут создаваться копии файла с именами Copy #1 filename, Copy #2 filename и т.д.

7. Настройка nsswitch.conf
Теперь нам для полного и окончательного счастья необходимо произвести настройку подсистемы Name-service switch. Эта подсистема отвечает за то как и где системный вызов ndispatch будет производить поиск разнообразной информации в системных базах вроде названий хостов, имен пользователей, паролей и т.п. В качестве системных баз используются локальные файлы вроде /etc/hosts, /etc/passwd, DNS, NIS и пр.
Конфигурирование производится в файле /etc/nsswitch.conf. Формат файла имеет следующий вид: "системная база: список источников [опции]".
Применительно к нашей задаче нам необходимо к источникам данных добавить вызов модуля winbind, который будет производить поиск доменных пользователей, имен групп, их паролей и другой служебной информации. В итоге файл должен будет содержать следующие строки:

Код

group: files winbind
hosts: files dns nis winbind
networks: files winbind
passwd: files winbind
shadow: files winbind
shells: files winbind

Для проверки дадим сначала команду wbinfo -u, если в ответ выводится список пользователей значит Samba успешно "общается" с AD-доменом. Теперь проверим, видит ли сама система доменных пользоваетелей, иными словами происходит ли отображение доменных пользователей в стандартное системное окружение FreeBSD. Для этого смотрим вывод команды id srvadmin, где srvadmin - доменный пользователь. В итоге мы должны получить нечто следующее:

Цитата

uid=10105(srvadmin) gid=10000(администраторы домена) groups=10000(администраторы домена)

Если же в ответ выдается

Цитата

id: srvadmin: no such user

То значит где-то возникла ошибка, скорее всего в nsswitch.conf.

8. "Поехали!"
Конфигурирование окончено, пришел час запускать в бой наше творение. Прежде всего командой testparm проверим правильность файла smb.conf, если в ответ получаем что-то вроде:

Цитата

Load smb config files from /usr/local/samba/lib/smb.conf
Processing section "[Документы]"
Processing section "[pub]"
Processing section "[install]"
Loaded services file OK.
Server role: ROLE_DOMAIN_MEMBER
Press enter to see a dump of your service definitions

значит все в норме, ошибок нет и можно запускать самбу. Иначе - ищем что не так.
При инсталляции в /usr/local/etc/rc.d/ помещается скрипт запуска/останова самбы - samba.sh. Для нашего пущего удобства переместим его в /etc/rc.d/: mv /usr/local/etc/rc.d/samba.sh /etc/rc.d. Теперь командами /etc/rc.d/samba.sh start|stop|restart мы можем стартовать, останавливать и перезапускать Samba-демоны. Дополнительно в /etc/rc.conf пропишем samba_enable="YES" для автоматического запуска Samba при перезагрузках сервера.
Итак, запуск: /etc/rc.d/samba.sh start - запустили. Теперь нужно зарегистрировать сервер в Active Directory: net ads join -U srvadmin%password, где srvadmin - пользователь домена имеющий права администратора домена, password - соответственно его пароль. При успешной регистраиции в ответ мы долдны получить нечто следующее:

Цитата

Using short domain name -- WG
Joined 'FILESRV' to realm 'LOCAL.DOMAIN'

Если сие сообщение получено значит настройка Samba успешно выполнена. Запускаем на клиентской машине поиск компьютера по имени и вводим, разумеется, имя сервера. Здесь может возникнуть еще одна маленькая "закавыка": при регистрации сервера в домене он зачастую не прописывается в DNS и, соответственно, не находится по поиску, но, если же попробовать зайти по IP-адресу, то все работает . В этом случае нужно всего- лишь прописать сервер в AD-домене.

Обновлено: 12.03.2015