Настройка Samba-3.0.23d на FreeBSD-5.3 с авторизацией в Windows 2000 AD [2007]
Статья является всего лишь попыткой поделиться своим опытом в вопросе интеграции *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 будет иметь вид:
ВНИМАНИЕ! В конце последней строки ОБЯЗАТЕЛЬНО необходимо сделать перевод на новую строку, иначе в будущем возможны проблемы при подключении сервера к домену.
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. Применительно к нашей сети файл будет иметь вид:
ВНИМАНИЕ! Содержимое файла чувствительно к регистру символов! Для проверки правильности настроек выполним команду 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
Теперь рассмотрим более подробно: 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.
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(), рассматривать пользователей без доменного имени перед именем пользователя (DOMAIN\user) как пользователей, принадлежащих к данному домену и производить обновление 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
Модуль протоколирует действия которые завершились успешно - параметр 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 дабы разделить поступаемые классы сообщений. Сделаем это следующим образом: строку
Таким образом мы выделили приоритеты 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, который будет производить поиск доменных пользователей, имен групп, их паролей и другой служебной информации. В итоге файл должен будет содержать следующие строки:
Для проверки дадим сначала команду wbinfo -u, если в ответ выводится список пользователей значит Samba успешно "общается" с AD-доменом. Теперь проверим, видит ли сама система доменных пользоваетелей, иными словами происходит ли отображение доменных пользователей в стандартное системное окружение FreeBSD. Для этого смотрим вывод команды id srvadmin, где srvadmin - доменный пользователь. В итоге мы должны получить нечто следующее:
То значит где-то возникла ошибка, скорее всего в 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-домене. Теперь можете доставать шампанское изо льда ибо настройка окончена успешно.