Samba: инструмент для работы в сетях Windows
Сергей «grinder» Яремчук (grinder@ua.fm, )
Администрирование сравнительно небольшой сети, настроенной как рабочая группа, может замотать даже самого трудолюбивого администратора. Постоянно возникающие проблемы с доступом, пропавшими файлами и сетевыми ресурсами, бесконтрольность и некомпетентность пользователей, способные обесценить любую систему безопасности, и прочие проблемы. Выход из такой ситуации только один — взять все под свой контроль, установив контроллер домена. Решить эту задачу с минимальным бюджетом можно используя Linux с пакетом Samba.
Содержание:
- Установка Samba
- Конфигурационный файл Samba
- Сетевые ресурсы и принтеры
- Заводим пользователей
- Врезка: Переменные в Samba
Пакет позволяет *nix-системам имитировать работу Windows сервера, обеспечивая доступ к ресурсам или принтерам клиентам по протоколам SMB/CIFS. Сервер на базе Samba может работать индивидуально, или входить в домен Windows. Более того, Samba может выступать в роли первичного или резервного контроллера домена.
Разработка Samba ведется с 1992 года. Актуальной на момент написания статьи была стабильная версия 3.0.24. Кроме того, уже доступен для тестирования следующий релиз — 4.0.0-TP4 (Technology Preview). Эта версия более трех лет развивается параллельно с основной. В ней полностью переписан код, основной упор сделан на полную совместимость с продуктами Microsoft и реализацию работы в качестве контроллера домена Active Directory. Вариантов использования Samba в качестве PDC очень много, мы рассмотрим лишь один из них — авторизация пользователей средствами Linux без LDAP.
Для установки контроллера домена был выбран дистрибутив Ubuntu 6.06 LTS. В Debian, ALTLinux и других дистрибутивах, использующих apt, процесс будет выглядеть аналогично. Инсталляция Samba в других дистрибутивах будет отличаться только командами установки пакетов. Настройка же везде одинакова.
$ sudo apt-get install samba
Все, серверный пакет Samba установлен. Для инсталляции пакета с документацией можно добавить samba-doc. Если потребуется еще и клиент, то добавляем пакет smbclient. Единственное «но». В репозитарии на момент написания статьи была версия 3.0.22, вероятно, кто-то захочет использовать последнюю доступную. Для того чтобы не возиться с зависимостями, вводим:
$ sudo apt-get build-dep samba-common
Затем распаковываем архив, заходим внутрь каталога и конфигурируем:
$ tar xzvf samba-3.0.24.tar.gz $ cd samba-3.0.24 $ ./autogen.sh $ ./configure --prefix=/usr --with-ads --enable-cups
Т.е. устанавливаем в каталог /usr, включаем поддержку Active Directory и подсистемы печати. Остальное будет добавлено автоматически. Затем следуют стандартные «make; sudo make install». Вот, собственно, и все премудрости.
Конфигурационный файл сервера (и частично клиента) — традиционный для *nix-систем: для того чтобы задействовать большинство параметров, достаточно раскомментировать или подправить соответствующую строчку. Файл /etc/samba/smb.conf — не исключение. Он состоит из именованных разделов, начинающихся из имени раздела, заключенного в квадратные скобки. Внутри каждого раздела находится ряд параметров в виде «параметр=значение». Файл конфигурации содержит четыре специальных раздела: global, homes, printers и отдельные ресурсы shares.
Как следует из названия, секция global определяет переменные, которые Samba будет использовать для определения доступа ко всем ресурсам. Значения некоторых переменных можно переопределить в секциях отдельных ресурсов. Параметров очень много, остановлюсь только на самых интересных.
Итак, открываем smb.conf в любимом текстовом редакторе и вносим изменения:
# vi /etc/samba/smb.conf [global] # Название рабочей группы в сети Windows workgroup = WORKGROUP # Имя сервера в сети netbios name = server.com # Комментарий, который виден в окне свойств просмотра сети server string = Samba Server %v # Значения security могут быть следующие: user - на уровне пользователя; # share - на уровне ресурсов; server можно использовать при хранении базы # паролей на другом SMB-сервере. Если сервер является членом домена, # используется значение domain. В нашем случае тип домена - Active Directory: security = ads # Этот параметр позволяет указать, кто и где будет хранить пароли, возможно # использование нескольких систем (при этом они указываются через пробел), # новые пользователи по умолчанию будут добавляться в первый. Через ':' # указывается место хранения, если оно отлично от используемого по умолчанию. # Так smbpasswd хранит пароли в файле etc/samba/smbpasswd, поэтому его можно # опустить. Кроме того, возможны параметры: tdbsam, ldapsam, nisplussam, # xmlsam и mysql. ##auth methods = winbind passdb backend = smbpasswd:/etc/samba/smbpasswd # Разрешаем доступ к Samba только с определенных адресов hosts allow = 192.168.1.0/24 127.0.0.0/8 interfaces = eth0, lo bind interfaces only = yes # Чтобы сделать Samba PDC, обязательно включаем следующие параметры: local master = yes os level = 65 domain master = yes preferred master = yes domain logons = yes # Командный файл, который будет выполнен при успешной регистрации пользователя logon script = login.bat logon path = # Включаем WINS wins support = yes name resolve order = wins lmhosts host bcast dns proxy = no # Разрешаем Samba быть сервером времени для Windows клиентов time server = yes # Указываем требуемую кодировку unix charset = utf8 dos charset = cp1251 display charset = cp1251 # Повышаем уровень безопасности encrypt passwords = true null passwords = no hide unreadable = yes hide dot files = yes map to guest = Bad User invalid users = root guest admin @wheel # Журнальные записи log file = /var/log/samba/log.%m max log size = 1000 syslog only = no syslog = 0 panic action = /usr/share/samba/panic-action %d # В этой секции описывается, где взять профиль по умолчанию для новых # пользователей, и где искать командный файл [netlogon] path = /home/samba/netlogon read only = yes browseable = no guest ok = no
Создаем ресурс, в котором будут находиться документы:
[docs] # Комментарий, который виден в окне свойств сети comment = Documentation path = /home/samba/docs available = yes # Директива browseable определяет, выводить ли ресурс в списке просмотра browseable = yes # Разрешаем запись writable = yes # Права доступа для вновь созданных файлов create mode = 0750 # Права доступа для вновь созданных каталогов directory mode = 0775
При желании можно расшарить и CD/DVD привод:
[cdrom] comment = DVD-ROM writable = no locking = no path = /media/cdrom public = yes preexec = /bin/mount /media/cdrom postexec = /bin/umount /media/cdrom
И в /etc/fstab:
/dev/scd0 /media/cdrom iso9660 defaults,noauto,ro,user 0 0
С помощью Samba можно организовать возможность сетевой печати. Для этого в секции global необходимо дописать следующие строки:
load printers = yes # Описание принтеров printcap name = cups disable spoolss = Yes show add printer wizard = No # Подсистема печати printing = cups
Далее каждый принтер описывается аналогично дисковому ресурсу с одним исключением: вводится параметр «printable = yes». Например:
[printers] # Указывает на каталог, куда помещаются задания на печать path = /tmp browseable = yes printable = yes read only = yes
После создания конфигурационного файла smb.conf необходимо протестировать его с помощью утилиты testparm. При тестировании будут выведены все установки, даже те, что установлены по умолчанию, поэтому внимательно просмотри результат. Хотя стоит помнить, что с помощью testparm можно обнаружить лишь синтаксические ошибки, а не логические. Соответственно, нет никакой гарантии, что описанные в файле сервисы будут работать корректно. Но если программа не ругается, можно надеяться, что при запуске файл будет загружен без проблем. У меня были выданы следующие ошибки:
ERROR: pid directory /var/run/samba does not exist WARNING: passdb expand explicit = yes is deprecated
В первом случае создаем каталог «sudo mkdir /var/run/samba». Заодно создаем и остальные каталоги, описанные в smb.conf:
$ sudo mkdir -p /home/samba/{netlogon,docs}
Чтобы убрать предупреждение, добавляем в секцию global параметр:
passdb expand explicit = no
Обрати внимание на запись «Server role: ROLE_DOMAIN_PDC». Это значит, что Samba настроен на работу как PDC, чего собственно мы и хотели добиться.
Теперь создаем файл login.bat, который будет выполнен при регистрации пользователей. В нашем примере в нем содержатся команды для автоматического монтирования сетевого диска и синхронизации часов:
$ sudo mcedit /home/samba/netlogon/login.bat net time \\grinder.com /set /yes net use h: \\grinder.com\docs
Помни, этот файл должен быть в стиле Windows, то есть с ВК/ПС в конце строки. Лучше его подготовить в Блокноте, а затем скопировать на Linux систему.
Если установка Samba производилась из пакетов, то стартовые скрипты уже готовы. Запускаем сервер:
$ sudo /etc/init.d/samba start
Команда «ps ax | grep mbd» должна показать наличие процессов, а вывод «nestat -a» — наличие открытых портов (135, 139), характерных для Windows систем. C помощью следующей команды получаем список ресурсов сервера:
$ smbclient -L localhost -U user%password
Если после всех перечисленных действий так и не удалось организовать доступ к ресурсам Samba, то в дальнейшей настройке помогут такие утилиты, как ping для проверки доступности узла, nmblookup (для запроса имен NetBIOS) или уже на крайний случай tcpdump. И, конечно же, журналы, расположенные в /vat/log/samba. Не стоит забывать и про права доступа. Ведь назначив для пользователя каталог /gde/to/w/glubine, пользователь должен зайти и в предыдущие каталоги (право на выполнение).
Установив необходимую конфигурацию, необходимо создать учетные записи пользователей. В нашем случае данные об аутентификации пользователей Samba будут записаны в файл /etc/samba/smbpasswd, в котором содержатся имена и зашифрованные пароли пользователей. Пользователи Windows обязательно должны иметь учетную запись на Linux компьютере. Так как механизм шифрования в сетях Windows-машин не совместим со стандартными Unix механизмами, то для заполнения файла паролей используется отдельная утилита — smbpasswd:
$ sudo useradd -s /bin/false -d /home/samba/sergej sergej $ sudo smbpasswd -a sergej $ sudo smbpasswd -е sergej
В этом примере добавляется новый пользователь sergej с фиктивной оболочкой (возможны варианты /sbin/nologin, /dev/null) и домашним каталогом /home/samba/sergej. Затем создается пароль для пользователя sergej. Последним шагом включаем доступ пользователя, так как по умолчанию отключен. Если посмотреть сейчас в файл /etc/samba/smbpasswd, можно увидеть новую запись. Весьма желательно с помощью cron создать задание, которое периодически создавало бы резервную копию этого файла.
В системах Windows по умолчанию имеется несколько групп, имеющих четко заданную роль, — Domain Admins, Administrators, Users, Guests и прочие. Чтобы все это работало, необходимо сопоставить группы Windows и Linux. Для просмотра имеющихся в домене групп используем команду:
$ sudo net groupmap list System Operators (S-1-5-32-549) -> -1 ... Domain Admins (S-1-5-21-497369389-3960344947-4188168368-512) -> -1 Domain Guests (S-1-5-21-497369389-3960344947-4188168368-514) -> -1 Domain Users (S-1-5-21-497369389-3960344947-4188168368-513) -> -1
И так далее. Знак ‘-1′ указывает, что пока ни одна группа не сопоставлена. Обрати внимание на цифры. Этот так называемые sambaPrimaryGroupSID и sambaSID (SID — security identifier в Windows является некий аналог UID в Linux, уникальный для всей сети). Получить его можно командой:
$ sudo net getlocalsid
Последние последние три цифры «Domain Admins» -> 512 — это так называемый RID (relative identifier), уникальный идентификатор пользователя домена. Его рекомендуется указывать при сопоставлении пользователей. Чтобы управлять доменом, нам нужно сопоставить группу Linux c «Domain Admins». Можно использовать уже имеющиеся группы, а можно создать специальную для работы в домене, чтобы затем было легче разобраться:
$ sudo groupadd domain_admins $ sudo net groupmap modify ntgroup="Domain Admins" \ unixgroup=domain_admins
Можно и так:
$ sudo net groupmap add sid=S-1-5-21-497369389-3960344947-4188168368-512 \ unixgroup=domain_admins type=domain
Аналогичные команды вводим при сопоставлении других пользователей, только включаем их в Domain Users. Кстати, Windows не допустит, чтобы имя пользователя совпадало с именем группы. Можно сопоставить нескольких пользователей Windows одному пользователю Linux, для этого создается файл /etc/smbusers.map. В нем отдельной строкой задается каждое сопоставление:
пользователь_ Linux = user_win1 user_win2 user_winN
А в секции global добавь строку «username map = /etc/smbusers.map». Команда на создание новой доменной группы практически аналогична:
$ sudo net groupmap add ntgroup="Sales" unixgroup=domain_sales type=d
Параметр type определяет тип группы и может принимать два значения: d (domain global) или l (domain local). Для удаления доменной группы вводим «net groupmap delete» с указанием названия группы.
При использовании Samba (в отличие от Windows 2003) компьютеры также следует заносить вручную. Для этого стоит создать еще одну группу (например, domain_computers), пользователи, входящие в которую, и будут компьютерами:
$ sudo groupadd domain_computers $ sudo useradd -G domain_computers -s /bin/false -d /dev/null comp1$ $ sudo passwd -l comp1$ $ sudo smbpasswd -a -m comp1
При добавлении системного пользователя значок ‘$’ в конце имени обязателен. Добавляем пользователя sergej в группу domain_admins и проверяем:
$ sudo net rpc group members "Domain Admins" -U sergej%password
Теперь добавляем компьютер в домен:
$ sudo net rpc join -Usergej%password
Проверить подключение можно командой «net rpc testjoin». Итак, пользователи созданы. По умолчанию группа «Domain Admins» имеет права только на раздачу привилегий. Список всех предоставленных привилегий можно просмотреть командой:
$ sudo net rpc rights list accounts -U sergej%password
А список возможных привилегий, так:
$ sudo net rpc rights list -U sergej%password
SeMachineAccountPrivilege Add machines to domain
SePrintOperatorPrivilege Manage printers
SeAddUsersPrivilege Add users and groups to the domain
SeRemoteShutdownPrivilege Force shutdown from a remote system
SeDiskOperatorPrivilege Manage disk shares
SeBackupPrivilege Back up files and directories
SeRestorePrivilege Restore files and directories
SeTakeOwnershipPrivilege Take ownership of files or other objects
Чтобы иметь возможность полноценно работать, сначала нужно даровать самим себе все права:
$ sudo net rpc rights grant "server.com\Domain Admins" \ SeMachineAccountPrivilege SePrintOperatorPrivilege \ SeAddUsersPrivilege SeRemoteShutdownPrivilege \ SeDiskOperatorPrivilege SeBackupPrivilege \ SeRestorePrivilege SeTakeOwnershipPrivilege \ -U sergej%password Successfully granted rights.
Вот, собственно, и все. Теперь у нас есть контроллер домена под управлением Linux, пользователи, обладающие необходимыми правами, и доступные сетевые ресурсы. Стоит также отметить, что имеются графические инструменты, позволяющие упростить настройку Samba. Это SWAT, входящий в состав Samba (требуется установить пакет swat), и универсальный Webmin. Последний, кроме контроля и основных настроек, имеет еще ряд полезных возможностей, например, автоматическое конвертирование пользователей и групп Linux в Windows. Успехов.
В секции global возможно использование различных переменных для более гибкой настройки работы сервера. После установки соединения вместо них подставляются реальные значения. Например, в директиве «log file = /var/log/samba/%m.log» параметр %m помогает определить отдельный лог-файл для каждой клиентской машины. Приведу наиболее часто используемые переменные секции global:
- %a — архитектура ОС на клиентской машине (возможные значения Win95, Win NT, UNKNOWN и т.д.)
- %m — NetBIOS-имя компьютера клиента
- %L — NetBIOS-имя сервера Samba
- %v — версия Samba
- %I — IP-адрес компьютера клиента
- %T — дата и время
- %u — имя пользователя, использующего сервис
- %H — домашняя директория пользователя %u
Для более гибкой настройки применяется директива include, использующая приведенные выше переменные. Например, «include = /etc/samba/smb.conf.%m<» — теперь при запросе с компьютера sales при наличии файла /etc/samba/smb.conf.sales конфигурация будет взята из этого файла.
Также имеется интересная возможность создания виртуального сервера. Для этого используется параметр netbios aliases:
netbios aliases = sales accounting admin
И указываем серверу для каждого виртуального сервера использовать свой конфигурационный файл:
include = /etc/samba/smb.conf.%L
Теперь в окне обозревателя сети будет видны три сервера: sales, accounting, admin.
Статья опубликована в майском номере журнала «Xakep» за 2007 год.





