Samba и Active Directory

Протокол SMB (Server Message Block) – основной способ сетевого взаимодействия между Windows-машинами. Его главная функция – предоставление доступа к файлам и каталогам на удаленном сервере (организация сетевой файловой системы), а также удаленная печать. Кроме того, SMB обеспечивает синхронизацию времени и некоторые другие возможности.

С момента своего создания и по сей день SMB/CIFS является основным протоколом, который используют ОС семейства Windows для сетевого взаимодействия, но это не значит, что все эти годы он оставался неизменным. Теоретически, современная реализация SMB обратно совместима со всеми предыдущими версиями. Однако настройка этой совместимости часто взывает у системных администраторов проблемы даже в том случае, когда и клиентская, и серверная ОС – это Windows.
Как правило, все сводится к тому, что пользователь Windows 98 не может «зайти» на ПК с Windows XP, какие бы данные ни указывались в диалоге для ввода имени и пароля. А дело в том, что Windows 98 и Windows XP (по умолчанию) используют разные схемы аутентификации.
Впрочем, при настройке доступа через SMB на Linux-сервер с установленным пакетом Samba возникают не меньшие проблемы. Документация на официальном сайте достаточно подробна, но, к сожалению, содержит мало сведений об устранении возникающих неполадок. Поэтому пользователь, в большинстве случаев, остается один на один с выложенными в Сети HOW-TO, которые на полноту изложения тоже не претендуют. Мы постараемся описать специфику SMB, а затем – те настройки Windows и Samba, которые влияют на их взаимодействие по сети.
Методы аутентификации
Важнейшую часть протокола SMB составляют методы аутентификации. Именно их несогласованность на сторонах клиента и сервера является причиной большинства проблем при сетевом доступе. Различают четыре основных метода:
1. Открытым текстом
Пароль пересылается по сети в незашифрованном виде; по этой причине использование данного типа аутентификации крайне нежелательно. Такой метод применялся в клиентах MS-DOS, а также в старых версиях Windows NT, и отключен по умолчанию в Windows 95 и выше (для его включения необходимо редактировать реестр). В Windows 2000 и выше аутентификацию открытым текстом можно активировать и через локальные политики безопасности (надо установить переключатель «Посылать незашифрованный пароль сторонним SMB-серверам» в «Да»). Старые версии Samba также использовали аутентификацию открытым текстом; в текущих пароль шифруется. Это можно отключить, указав
encrypted password = false
в файле smb.conf.
2. Методом LM
(LAN Manager) Он используется в Windows 95/98. Здесь возможны проблемы с доступом к ресурсам, обслуживаемым Windows NT 4.0 SP3 и выше. При их возникновении следует установить параметр «Уровень проверки подлинности LAN Manager» в положение «Отправлять LM и NTLM ответы» в локальных политиках безопасности на Windows-сервере. Samba допускает аутентификацию по протоколу LM по умолчанию.
3. Методом NTLM
Технология появилась в Windows NT 3.5 и успешно применяется и по сей день в Windows 2000 и выше, правда, в переработанном виде (NTLMv2). Является методом по умолчанию в рабочих группах Windows. Windows 95/98 поддерживают ее после установки клиента Directory Services. Samba также поддерживает NTLMv2.
NTLMv2 относится к схемам типа «запрос–ответ». При этом сервер аутентификации не хранит паролей ни в открытом, ни в зашифрованном виде – он знает только их хэши. По сети же не пересылается не только пароль, но даже хэш пароля.
4. Через службу Kerberos
Kerberos является мощной системой, обеспечивающей аутентификацию и авторизацию пользователей, а также шифрование внутрисетевого трафика. Он используется в домене Active Directory (AD). Samba, начиная с версии 3, может быть полноценным клиентом домена AD и использовать все преимущества Kerberos. Однако она не может выступать в роли контроллера домена AD: эта функция доступна только разрабатываемой Samba 4.
В сети Kerberos можно выделить три основных агента: это клиент, центр выдачи квитанций (KDC – Key Distribution Center) и сервер авторизации. Если описывать процессы в системе упрощенно, то при входе в сеть клиент обращается к центру выдачи квитанций, предоставляя свои имя и пароль. Если учетные данные верны, то KDC выдает ему квитанцию на доступ к серверу авторизации. Последний проверяет, разрешен ли клиенту доступ к ресурсу, и, если ответ положителен, выдает клиенту квитанцию на доступ к ресурсу.
Kerberos в среде AD
При работе с системой Kerberos необходимо иметь в виду два момента: во-первых, вместо привычных комбинаций «имя пользователя–пароль» используются квитанции; во-вторых, если расхождение часов клиента и сервера составляет больше нескольких минут, то последний признает квитанцию недействительной и отказывает клиенту в соединении. В таком случае Windows XP, например, покажет окно для ввода имени и пароля. Стоит ли говорить, что какие бы реквизиты вы ни ввели, доступ к серверу все равно не получите? Впрочем, иногда Windows ведет себя более гуманно и просто показывает сообщение о том, что доступ запрещен.
Предположим, вам необходимо организовать файл-сервер под управлением Linux в домене AD. Linux в качестве файл-сервера имеет перед своими Windows-аналогами несколько сущест-венных преимуществ: Windows Server 2003/2008 Standard Edition стоит около $800, а Linux-сервер бесплатен; кроме того, служба удаленного вызова процедур из Samba не подвержена атакам вирусов типа Conficker-Kido.
Как уже говорилось, Samba 3 поддерживает полноценную работу в качестве члена домена. Остается только отредактировать файл smb.conf, и файл-сервер готов...
Примерно так думают многие пользователи, не представляя, что для правильной настройки Samba надо хоты бы в общих чертах представлять, как функционирует домен AD. Позволим себе сделать небольшое отступление и пояснить, какие сетевые службы входят в состав Active Directory и как они взаимодействуют.
Основу AD составляют четыре службы, или, если угодно, технологии:
Служба доменных имен DNS
Служба каталога LDAP
Протокол SMB
Служба Kerberos
Хотя все они функционируют в составе домена, к каждой из них можно обращаться как к самостоятельному сервису. Так, DNS-запросы могут посылать не только члены домена, но и сторонние клиенты; правда, по умолчанию – только для чте¬ния записей. LDAP может быть использован для аутентификации пользователей, к примеру, почтовым сервером Dovecot, установленным в Linux. Протокол SMB поддерживает подключение не только членов домена с Kerberos-авторизацией, но и других. Kerberos в составе домена AD позволяет создавать доверенные области со сторонними реализациями этой службы, к примеру, с MITKerberos.
Несмотря на такую «самостоятельность» служб, если хотя бы одна из них функционирует неправильно, то ввод клиента в домен будет невозможен. Кроме того, если на клиенте неправильно указаны адрес DNS-сервера, имя клиента или имя домена, он также не будет присоединен к домену AD. Дело в том, что DNS-сервер в составе AD содержит так называемые SRV-записи, которые указывают, в числе прочего, на расположение LDAP-сервера и центра выдачи квитанций Kerberos.
Подготовим систему
Рассмотрим для примера дистрибутив Debian GNU/Linux 4.0 Etch. Конечно, это не передний край, но серверам присущ известный консерватизм; кроме того, все наши рекомендации можно с минимальными изменениями применить и к любому другому дистрибутиву.
Технически, Samba предоставляет собой три демона: smbd, nmbd и winbindd. Первый отвечает за общий доступ к файлам и принтерам, второй – за разрешение имен по протоколу SMB и регистрацию компьютера в сети, а третий обеспечивает связь с контроллером AD и аутентификацию пользователей домена. В Etch, smbd и nmbd содержатся в пакете samba, а winbindd – в пакете winbind, в котором также можно найти утилиту net, позволяющую выполнять множество административных задач, в том числе присоединение машины к домену AD.
Установим эти пакеты командой aptitude install samba winbind и приступим к настройке. Пусть имя нашего компьютера – myhost, и он должен принадлежать к домену mydomain.local.
В файле /etc/hosts изменим строку, начинающуюся с адреса 127.0.0.1, на
127.0.0.1 myhost.mydomain.local myhost
определив таким образом полное доменное имя хоста (FQDN). Проверить правильность настройки можно командой hostname -F: вы должны увидеть строку myhost.mydomain.local.
Перейдем к файлу /etc/resolv.conf. Он отвечает за разрешение имен хостов при помощи службы DNS. Если ваш компьютер получает настройки сети через DHCP, то здесь уже могут содержаться адреса DNS-серверов. Если же файл пуст, добавьте записи вида nameserver 1.2.3.4 вручную.
Последний шаг – изменение файла /etc/nsswitch.conf. Здесь указывается, какие службы (и в каком порядке) используются системой для поиска имен пользователей, паролей, хостов, сетей и т. д. Приведем записи passwd:, group:, shadow: и hosts: к виду
passwd: compat winbind
group: compat winbind
shadow: compat winbind
hosts: files dns wins.
Это значит, что при поиске имен пользователей, групп и паролей Linux будет сперва обращаться к встроенной базе данных (файлам /etc/passwd, /etc/group, /etc/shadow), а затем – к демону winbind. При разрешении имени хоста сначала будет использоваться файл /etc/hosts, затем DNS и, в последнюю очередь, служба имен NetBIOS. Это может пригодиться, если в вашей сети есть хосты, не зарегистрированные в DNS, но имеющие имена NetBIOS, к примеру, компьютеры под управлением Windows в составе рабочей группы.
Настроим Samba
Перейдем к настройке сервисов Samba. Сохраните текущий файл /etc/samba/smb.conf где-нибудь в надежном месте и отредактируйте его в соответствии с приведенными ниже инструкциями. При желании, вы также можете создать новый конфигурационный файл с нуля.
В секции [global] следует задать несколько обязательных параметров:
netbios name = MYHOST
Это NetBIOS-имя вашего хоста, и оно должно совпадать с тем, что указано в файле /etc/hosts.
security = ads
– уровень безопасности. Кроме ads (клиент домена Active Directory), возможны значения share (рабочая группа Windows, только гостевой вход), user (рабочая группа Windows, аутентификация через БД пользователей Samba) и domain (домен NT4). В последнем случае Samba может выступать как в роли клиента, так и в роли контроллера.
workgroup = MYDOMAIN
– имя рабочей группы для режимов share и user, имя домена для режимов domain и ads.
Следующие три опции относятся к настройкам клиента AD и задают область Kerberos, определенную для домена (совпадает с его именем и записывается прописными буквами); методы, используемые smbd для аутентификации пользователей (у нас – winbind); и имя «сервера паролей»: для клиента Active Directory оно совпадает с именем контроллером домена
realm = MYDOMAIN.LOCAL
auth methods = winbind
password server = domain.mydomain.local
В документации Samba указывается, что последний параметр не обязателен, поскольку Samba умеет находить сервер паролей, используя SRV-записи DNS. Однако автоопределение сервера паролей срабатывает не всегда, особенно в старых версиях Samba.
Теперь определим настройки демона winbind, основная задача которого – прозрачная аутентификация пользователей AD в Unix. Для этого winbind отображает пользователей AD в пространство пользователей Unix. Диапазоны, в которых лежат идентификаторы виртуальных пользователей и групп, определяются следующими двумя параметрами.
idmap uid = 10000-20000
idmap gid = 10000-20000
В Windows 2000 и выше для отделения имени домена от имени пользователя используется обратная косая черта. В Linux это может привести к проблемам, поскольку данный символ трактуется как служебный. Следующая опция позволяет заменить его на что-то другое:
winbind separator = +
Вы также можете позволить перечислять пользователей и группы AD сторонним приложениям. Однако утилита wbinfo, входящая в пакет winbind, способна на это, даже если следующие два параметра не указаны:
winbind enum users = Yes
winbind enum groups = Yes
Чтоб разрешить сторонним приложениям ссылаться на пользователей AD как на локальных, не указывая имя домена и символ-разделитель, используйте
winbind use default domain = Yes
Далее можно настроить кэширование учетных данных пользователей – это обеспечит возможность входа в систему, даже если контроллер домена недоступен.
winbind offline logon = Yes
Осталась небольшая группа глобальных настроек, влияющих на другие аспекты работы Samba. Так,
preferred master = No
указывает демону nmbd, что данный хост не должен являться основным сервером имен NetBIOS. В случае критического сбоя в Samba мы будем выполнять действие panic-action:
panic action = /usr/share/samba/panic-action %d
Наконец,
log file = /var/log/samba/log.%m
debug level = 0
syslog = 0
задают путь к файлу журнала и уровень детализации отладочных сообщений, и предписывают не использовать Syslog.
Общие папки
Приведенные выше настройки были глобальными, т. е. влияли на службы Samba в целом. Давайте, помимо этого, создадим разделяемый ресурс и посмотрим, какие опции можно использовать на этом уровне.
Чтобы организовать «общую папку», просто создайте новую секцию в smb.conf:
[Общие папки]
valid users = MYDOMAIN+Администратор,@”MYDOMAIN+Пользователи домена”
admin users = MYDOMAIN+Администратор
path = /var/shares
write list = @”MYDOMAIN+Администраторы домена”
read list = @”MYDOMAIN+Пользователи домена”
comment = “Общий ресурс на сервере Samba”
Параметр valid users задает имена пользователей и групп, которым разрешен доступ к ресурсу. Имя группы начинается с символа @. Имя домена можно было и не указывать, благодаря параметру
winbind use default domain = Yes
который мы установили выше. Admin users – это пользователи и группы, имеющие полный доступ к ресурсу, path задает путь до него в локальной файловой системе, read list и write list – это списки пользователей, имеющих права на чтение и запись. Обратите внимание, что Samba не умеет творить чудеса, и у Unix-эквивалентов пользователей, перечисленных в read/write list, должны быть достаточные Unix-права для доступа к файлам в /var/shares. Поле comment задает произвольный комментарий.
Поехали!
Теперь приступим к самому главному – введем компьютер в домен AD. Эта операция выполняется при помощи утилиты net. Сначала синхронизируем часы с контроллером домена: расхождение во времени не должно превышать 5 минут.
>net time set
Втр Июн 23 15:17:53 SAMST 2009
Затем введем машину в домен:
>net ads join -U Администратор@MYDOMAIN.LOCAL
password:******
Вместо учетной записи «Администратор» можно использовать любую другую с правом присоединения компьютера к домену. Если после выполнения команды net ads вы увидели:
Use short domain name -'MYDOMAIN'
Joined 'MYHOST' to relam 'MYDOMAIN.LOCAL',
то компьютер успешно введен в домен AD. Остается только перезапустить демоны smbd, nmbd и winbind:
/etc/init.d/samba restart
/etc/init.d/winbind restart
подождать несколько секунд – и машина с Linux станет полноценным членом домена Active Directory. Проверить, соединяется ли Samba с контроллером домена, можно командами wbinfo -t (тест на возможность установки безопасного соединения) и wbinfo -u (отображает список пользователей домена). В некоторых случаях, чтобы получить доступ с Windows-клиента на Samba-сервер сразу после перезапуска демонов, может потребоваться выйти и повторно зайти в систему.
Проблемы и их решение
Рассмотрим менее приятный вариант – команда net завершилась с ошибкой. В этом случае следует обратить внимание на настройки клиента DNS и убедиться, что команда hostname -f отображает правильное имя компьютера, а nslookup или dig могут разрешить имя контроллера домена в IP-адрес. Если вы устанавливали Sаmba не из основного репозитория (например, для Etch взяли версию 3.2.5 c backports.org), следует убедиться, что обновились также и пакеты с зависимостями – прежде всего, клиентской частью Kerberos. Если же и это не помогло, поднимите уровень отладки в smb.conf (за это отвечает опция debug level) и проанализируйте, на каком из этапов присоединения компьютера к домену произошел сбой.
Существует распространенное заблуждение, будто бы Samba при входе в домен не в состоянии самостоятельно получить первую квитанцию от центра ключей Kerberos. Оно возникло из-за того, что в официальном руководстве по Samba в качестве одной из подготовительных операций при вводе машины в домен указана настройка файла /etc/krb5.conf и вызовов команды kinit. Файл /etc/krb5.conf содержит параметры автономного клиента Kerberos на локальном компьютере. Утилита kinit в составе Kerberos использует для получения квитанции именно эти настройки.
Действия по настройке kinit необходимы исключительно для тестирования связи с сервером Kerberos, и выполнять их необязательно. Samba может совершать полный цикл взаимодействия с сервером Kerberos, включая обновление квитанций по истечении срока их действия, без применения сторонних утилит. Чтобы библиотеки Kerberos были правильно настроены, Samba создает на базе информации из файла smb.conf файл /var/run/samba/smb_krb5/krb5.conf.<имя домена>, который и заменяет стандартный /etc/krb5.conf во время работы.
Наконец, упомянем еще один, казалось бы, незначительный момент, также способный вызвать проблемы при подключении к серверу Samba. Windows-клиенты AD автоматически синхронизируют свои часы с контроллером домена, однако демон winbindd в Linux этого не делает. В результате, через некоторое время после ввода машины в домен, часы сервера Samba могут «разойтись» с контроллером домена больше чем на 5 минут, и с этого момента ни один клиент, использующий Kerberos, не сможет подключится к серверу Samba.
Существует как минимум два способа решения этой проблемы. Наиболее правильным будет, конечно, установка корпоративного сервера времени и синхронизация с ним всех компьютеров по протоколу NTP. Однако возможно и временное решение. Добавим в файл /etc/crontab строку
*/5 * * * * root net time set
и выполним команду
/etc/init.d/cron reload
Тем самым мы настроим системный планировщик сron на запуск команды синхронизации времени через SMB каждые 5 минут.
И даже больше
В заключение отметим, что возможности Samba шире, чем прос¬то организация общего доступа к файлам с разделением прав на базе протокола SMB. Samba может поддерживать списки контроля доступа (ACL), как это делается на вкладке «Безопасность» в Проводнике Windows, а кроме того, выступать в качестве принт-сервера с функциями автоматической установки драйверов на клиентские компьютеры – причем, за счет модульной архитектуры, он будет намного стабильнее Диспетчера очереди печати Windows.

По материалам журнала LinuxFormat