СЕРГЕЙ ЯРЕМЧУК
Что такое Samba?
Я думаю, что утверждение о том, что самой популярной операционной системой для клиентских машин является Windows, не вызовет больших споров. Хотя с появлением таких продуктов, как OpenOffice.ru, и активному продвижению своих продуктов компаниями AltLinux и ASPLinux, положение несколько изменилось, но до массовости еще дело не дошло. Поэтому большинство пользователей продолжают набирать документы в Word и бродить по Интернету с помощью Internet Explorer. А вот в качестве сервера положение последней уже не так однозначно, здесь уже играют роль NetWare от Novell и, конечно же, UNIX. Плюс за последний год пришлось всем потесниться из-за появления новых «игроков» на этом рынке – операционных систем с открытым кодом – Linux, FreeBSD и OpenBSD, которые уже сейчас занимают немалый процент рынка серверов. Прежде всего по причине своей надежности, устойчивости, совместимости со множеством платформ и безопасности. Поэтому сейчас системному администратору приходится часто решать вопросы интеграции серверов под управлением Linux/UNIX в сеть, где преобладают клиентские машины от Microsoft, особенно в качестве файл-серверов или серверов печати.
Так как чуда от Microsoft особенно ждать не приходится и Windows врядли научится работать с сетевой файловой системой UNIX (NFS) стандартными средствами, то по принципу горы и Магомета, просто научили UNIX притворяться, будто бы он – Windows NT.
Взаимодействие компьютеров в сети Windows построено на использовании протокола SMB (Server Message Block – блоки серверных сообщений), который обеспечивает выполнение всех необходимых в этих случаях задач по открытию и закрытию, чтению и записи, поиску файлов, созданию и удалению каталогов, постановке задания на печать и удалению его оттуда. Все необходимые для этого действия реализуются в UNIX-подобных операционных системах посредством использования пакета SAMBA. Что же должен обеспечить SAMBA сервер для нормальной работы в сети Windows машин? Во-первых, контроль доступа, который может быть реализован либо на уровне ресурсов (share level), когда какому-либо ресурсу в сети назначается пароль и соответствующие правила использования («только для чтения», например), приэтом имя пользователя не имеет абсолютно никакого значения. Либо более совершенная и гибкая организация на уровне пользователя, когда для каждого пользователя создается учетная запись, где помимо имени и пароля содержится вся необходимая информация о правах доступа к ресурсу. И прежде чем получить доступ к требуемому ресурсу каждый пользователь проходит аутентификацию, после успешного прохождения которой ему и предоставляется права на использование согласно учетным записям. Во-вторых, необходима эмуляция прав доступа, определяемых файловой системой. Все дело в том, что у рассматриваемых систем права доступа к файлам и каталогам на диске организованы по-разному. В UNIX традиционно существует три категории пользователей файла – владелец (owner), группа (group) и остальные (other). Каждому из этих субъектов могут быть предоставлены права на чтение (read), запись(write) и выполнение ( execute). В Windows NT система доступа несколько гибче, доступ предоставляется нескольким группам или пользователям, причем соответствующие права доступа определяются раздельно для каждого субъекта. Поэтому полноценно эмулировать средствами SAMBA права доступа заложенные в NTFS, невозможно. А с клиентами, работающими под управлением Windows 9x, дело обстоит иначе. Еще со времен дедушки ДОС, по причине того, что система однопользовательская и ни о каких пользователях, а тем более группах, не могло быть и речи, для файловой системы FAT определено всего четыре атрибута – только чтение (read only), системный (system), архивный (archive) и скрытый (hidden). Плюс ко всему в Windows, в отличие от UNIX, имеет особое значение расширение файла, так файлы, предназначенные для выполнения, имеют расширение – exe, com, bat. Соответствия между правами доступа UNIX и DOS выражаются так:
- только для чтения – чтение, запись для владельца;
- архивный – выполнение для владельца;
- системный – выполнение для группы;
- скрытый – выполнение для группы.
Вот с проблемами так или иначе разобрались. Давайте разберемся теперь конкретно с реализацией и настройкой SAMBA в Linux. Для работы Samba необходимо, чтобы были запущены два демона: smbd обеспечивает работу службы печати и разделения файлов для клиентов Samba, таких как Windows всех мастей; демон nmbd обеспечивает работу службы имен NetBIOS, а также может использоваться для запроса других демонов служб имен. Для доступа к клиентам используется протокол TCP/IP. Как правило, Samba устанавливается вместе с дистрибутивом Linux. Как проверить? Просто дайте команду:
sergej@grinder sergej]$ whereis samba
и вы должны получить что-то вроде этого:
samba: /usr/sbin/samba /etc/samba /usr/share/man/man7/samba.7.gz |
Если нет, то идите на ftp://ftp.samba.org/pub/samba/samba-latest.tar.gz или практически на любой сервер с программами для Linux и качайте в виде rpm или исходников. Пакет прост в установке, поэтому, чтобы не занимать места, будем считать, что он у вас установлен. Теперь давайте проверим, запущен ли демон:
[sergej@grinder sergej]$ ps -aux | grep smbd
root 1122 0.0 0.6 4440 380 ? S 16:36 0:00 smbd -D |
У меня уже запущен. Если у вас нет, то в Linux Mandrake, например, чтобы он запускался при старте отметьте нужный пункт в: DrakConf – стартовые сервисы или control-panel – Servise Configuration в Red Hat, обычно этого бывает достаточно, или запускайте вручную: ./etc/rc.d/init.d/smb start. Единственный конфигурационный файл Samba называется smb.conf и находится в каталоге /етс иногда (в AltLinux, например, в каталоге /etc/samba). Сервис SAMBA считывает его каждые 60 секунд. Поэтому изменения внесенные в конфигурацию вступают в силу без перезагрузки, но не распространяются на уже установленные соединения.
Вот за что я люблю Linux – так это за то, что конфигурационные файлы являются обычными текстовыми( к тому же хорошо комментированные внутри), и для того чтобы задействовать большинство параметров достаточно только раскомментировать соответствующую строчку. Файл smb.conf – не исключение. Он состоит из именованных разделов, начинающихся из имени раздела, заключенного в квадратные скобки. Внутри каждого раздела находится ряд параметров в виде key=value. Файл конфигурации содержит четыре специальных раздела: [global], [homes], [printers] и отдельные ресурсы (shares). Как следует из названия, раздел [global] содержит наиболее общие характеристики, которые будут применяться везде, но которые, впрочем, затем можно переопределить в секциях для отдельных ресурсов.
Значения типичных параметров секции global:
workgroup = имя_группы # название рабочей группы в сети Windows
netbios name = имя сервера в сети
server string = комментарий, который виден в окне свойств просмотра сети
guest ok = yes # разрешение гостевого входа ( guest ok = no - гостевой вход запрещен)
guest account = nobody # имя под которым разрешен гостевой вход в систему
security = user # Уровень доступа.
user - на уровне пользователя,
security = share - аутентификация на основе имени и пароля.
При хранении базы паролей на другом SMB-сервере используются значения security = server и password server = name_server_NT. В случае если сервер является членом домена используется значение security = domain, пароль для доступа указывается в файле определенном с помощью опции smb passwd file = /path/to/file.
Кроме того, при регистрации могут использоваться шифрованные (encrypted) и незашифрованные (plain-text) пароли. Последние используются в старых Windows (Windows for Workgroups, Windows 95 (OSR2), все версии Windows NT 3.x, Windows NT 4 (до Service Pack 3). Для включения варианта использования шифрованного пароля используется опция encrypt password =yes (по умолчанию используются не шифрованные пароли).
Для правильного отображения русских имен файлов используются следующие опции: client code page = 866 и character set = koi8-r.
Опция interfaces = 192.168.0.1/24 – указывает в какой сети (интерфейсе) должна работать, программа если сервер подключен сразу к нескольким сетям, а при установке параметра bind interfaces only = yes, сервер будет отвечать на запросы только из этих сетей.
hosts allow = 192.168.1. 192.168.2. 127. – определяет клиентов, для которых разрешен доступ к сервису.
В секции 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.
Включение параметров preserve case и short preserve case заставляют сервер сохранять всю вводимую информацию с учетом регистра символов (в Windows регистр не имеет значения, а во всех UNIX это не так).
Раздел [homes] позволяет пользователям подключаться к своим рабочим каталогам без явного их описания. При запросе клиентом своего каталога, например //sambaserver/sergej, система ищет соответствующее описание в файле и, если не находит его, то просматривает наличие этого раздела. Если раздел существует, то просматривается файл паролей для поиска рабочего каталога пользователя, сделавшего запрос и при нахождении делает его доступным для пользователя.
Типичное описание раздела:
[homes]
comment = Home Directories # комментарий который виден в окне свойств сети
browseable = no # определяет выводить ли ресурс в списке просмотра.
writable = yes # разрешает (no - запрещает) запись в домашнюю директорию
create mode = 0750 # права доступа для вновь созданных файлов
directory mode = 0775 # тоже, но только для каталогов
После настройки параметров по умолчанию вы можете создать сетевые ресурсы, доступ к которым может получить определенные пользователь или группа пользователей. Создается такой ресурс из уже существующего каталога, для этого в файле пишем:
[public]
comment = Public Stuff
path = /home/samba
public = yes
writable = no
printable = no
write list = administrator, @sales
Параметр path указывает на каталог, в котором располагается ресурс, параметр public указывает, может ли пользоваться ресурсом гость, а printable – может ли использоваться данный ресурс для печати. Параметр write list позволяет задать пользователей, которым разрешена запись в ресурс независимо от значения writable (в данном примере это пользователь administrator и группа sales). Возможно использование и противоположного списка – read list. Если есть необходимость скрыть некоторые файлы, то в UNIX/Linux для этого имя файла должно начинаться с точки (параметр hide dot files, который регулирует отображение скрытых файлов, по умолчанию = yes). Но кроме этого есть возможность задать шаблоны имен скрытых файлов, для этого используется параметр hide files. Каждый шаблон начинается и заканчивается с символа косой черты «/» и может содержать символы, применяемые в регулярных выражениях. Например: hide files = /*.log/??.tmp/. Но все эти ухищрения обходятся пользователям очень просто – установкой режима «показывать скрытые и системные файлы» проводника Windows. Для уверенного ограничения доступности (возможности удаления) файла (каталога) используйте параметры: veto files и delete veto files. С CD-ROM дисками дело обстоит несколько сложнее.
Все дело в том, что в UNIX-подобных системах понятие диска отсутствует как таковое, и для того чтобы получить доступ к нужному устройству, оно первоначально должно быть смонтировано в дерево каталогов (# mount -t iso9660 /dev/cdrom /mnt/cdrom). А после использования, чтобы не разрушить файловую систему, должно быть размонтировано (# umount /dev/cdrom), иначе устройство просто не отдаст диск. Если у вас на сервере запущен демон autofs, то проблема решается просто. Для того чтобы устройство которое не используется в течении некоторого времени, было автоматически размонтировано, установите нужное значение параметра timeout в файле /etc/auto.master, например:
/mnt /etc/auto.misc --timeout=60
А затем установите параметры для соответствующего устройства в файле /etc/auto.misc:
cdrom fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
После всего прописываем в /etc/smb.conf следующие строки, чтобы сделать доступным данный ресурс:
[cdrom]
path = /mnt/cdrom
writable = no
Второй вариант состоит в использовании директив preexec и postexec, которые указывают какие команды необходимо выполнить при обращении к ресурсу и после отсоединения от него.
[cdrom]
path = /mnt/cdrom
read only = yes
#монтировать ресурса имеет право только root
root preexec = mount /mnt/cdrom
# естественно эти точки монтирования должны быть описаны в файле /etc/fstab, иначе необходимо указать и остальные данные.
root postexec = umount /mnt/cdrom
Теперь при обращении к ресурсу автоматически монтируется CD-ROM. А в идеальных случаях и размонтируется. Вся проблема в том, что решение о закрытии ресурса должен принять сервер и все потому, что клиенты, как правило, не извещают об этом. Но наиболее частой причиной является то, что ресурсом могут одновременно пользоваться сразу несколько пользователей или на одном компьютере оставлен открытый файл на данном ресурсе. Поэтому CD-ROM автоматически не размонтируется, единственный приемлемый способ, чтобы освободить ресурс – посмотреть с помощью утилиты smbstatus номер процесса, использующего данный ресурс, и убить его командой:
# kill pid_number # или kill -s HUP pid_number
Установив необходимую конфигурацию необходимо теперь создать учетные записи пользователей (за исключением гостевого входа с минимальными правами nobody). Для интентификации пользователей SAMBA используется файл /etc/samba/smbpasswd, в котором содержатся имена и зашифрованные пароли пользователей. Так как механизм шифрования в сетях Windows-машин не совместим со стандартными UNIX механизмами, то для заполнения файла паролей используется отдельная утилита – smbpasswd.
# useradd -s /bin/false -d /home/samba/sergej -g sales sergej
# smbpasswd -a sergej
В этом примере добавляется новый пользователь sergej с фиктивной оболочкой, принадлежащий группе sales и домашним каталогом /home/samba/sergej. Затем создается пароль для пользователя sergej.
С помощью SAMBA можно организовать возможность сетевой печати с компьютеров под управлением Windows (если планируется отдельный сервер печати, то для этого бывает достаточно и машины на базе 486 процессора).
Для этого в секции [global] необходимо записать такие строки:
printcap name = /etc/printcap # файл описания принтеров, подключенных к системе
load printers = yes #, указывает на необходимость автоматического включения в список сетевых ресурсов
printing = lprng # система печати (для Linux может еще использоваться bsd)
Далее каждый принтер описывается как дисковый ресурс с единственным исключением, параметр printable = yes. Например:
[printers]
path = /var/spool/samba # указывает на каталог в который помещаются задания на печать
browseable = yes
printable = yes
read only = yes
После создания файла протестируйте его с помощью утилиты testparm, но при помощи данной программы можно обнаружить лишь синтаксические ошибки, а не логические, поэтому нет никакой гарантии, что описанные в файле сервисы будут корректно работать (при тестировании будут выведены все установки – даже те, которые установлены поумолчанию). Но если программа не ругается, можете надеяться, что при запуске файл будет загружен без проблем. А правильность установки принтера можно проверить с помощью утилиты – testprns. Плюс не забывайте о log-файлах – при возникновении проблем там иногда можно найти решение.
Теперь немного о хорошем. Конфигурирование Samba – довольно сложная процедура, но с дистрибутивом поставляется инструмент администрирования на основе Web, который называется swat (Samba Web Administration Tool). Swat запускается в виде сервиса или с помощью сервера Apache, и предназначен для редактирования файла smb.conf, а также для проверки состояния, запуска и остановки демонов Samba. Для работы в виде сервиса в файле /etc/services должна быть обязательно строка swat 901/tcp, а в файле /etc/inetd.conf – swat stream tcp nowait.400 root /usr/local/samba/bin/swat swat. Теперь для запуска Swat в окне браузера введите:
http://localhost:901
После всех изменений в файле smb.conf иногда потребуется перезапустить демон smb: /etc/rc.d/init.d/smb restart.
Если после всех перечисленных действий так и не удалось организовать доступ к ресурсам SAMBA, то в дальнейшей настройке помогут такие утилиты, как ping, nmblookup или на крайний случай tcpdump. Вот и все.