Журнал LinuxFormat - перейти на главную

LXF124:Samba

Материал из Linuxformat
Перейти к: навигация, поиск
Samba в домене AD Поможем интегрировать ваши компьютеры в гетерогенной сети

Содержание

Samba: ACL и печать

Часть 2: Иногда общий доступ оказывается слишком уж общим, и возникает желание припасти файлы «для своих». Да и безбумажный оборот пока введен не везде. Алекcандр Фахрутдинов смотрит, чем тут могут помочь Linux и Samba.

Вначале была FAT. Стоящее за ней число со временем увеличивалось, и к моменту выхода Windows 95 OSR2 достигло 32. Тем не менее, даже FAT32 не поддерживала концепцию прав доступа. Обращения к файлам по сети можно было ограничить средствами протокола SMB, локальный же пользователь мог изменять на диске все, что угодно, сводя на нет любую систему безопасности. Поэтому для Windows NT была разработана файловая система NTFS, поддерживающая так называемые списки контроля доступа (ACL). Для управления ими по сети в протокол SMB было добавлено соответствующее расширение.


Вкладка «Безопасность» свойств файла в Проводнике Windows позволяет просматривать и изменять список пользователей и групп, имеющих доступ к конкретному файлу или каталогу. В документации Samba она называется «NT security dialog», т. е. «Диалог безопасности NT», и в дальнейшем мы будем использовать то же имя.

Запускаем Linux

Samba может обеспечить поддержку ACL, если файловая система, на которой расположена общая папка, поддерживает списки контроля доступа. Однако ext3, используемая во многих дистрибутивах Linux по умолчанию, при стандартных опциях монтирования поддерживает только «традиционную» для Unix трехуровневую модель, выделяющую:

  • Владельца файла
  • Группу, к которой принадлежит владелец
  • Прочих пользователей

Отметим, что учетной записи root в такой модели разрешен полный доступ ко всем файлам и каталогам, и лишить root этих прав невозможно. Этим традиционная модель Unix отличается от модели NTFS, в которой можно запретить доступ к файлу для любой учетной записи, в том числе SYSTEM, обладающей в системе наибольшими привилегиями. Для владельца файла, его группы и прочих пользователей можно раздельно задать разрешения на чтение (r), запись (w) и выполнение (x) файла.

Хотя традиционная модель, применяемая в ext3, очевидно лучше, чем полное отсутствие контроля доступа в FAT32, ясно, что она не обеспечивает гибкости ACL. Поэтому в Linux существует своя реализация списков контроля доступа – POSIX ACL. Этот механизм не заменяет традиционную схему полностью, а лишь дополняет ее. В большинстве дистрибутивов POSIX ACL для ext3 по умолчанию выключен, хотя ядро собрано с его поддержкой. Чтобы смонтировать раздел ext3 с поддержкой ACL, нужно явно указать это в файле /etc/fstab, например

/dev/sdb1 /var/shares ext3 auto defaults,acl 0 0

После перемонтирования Samba сможет корректно задавать права доступа к файлам и каталогам через диалог безопасности NT.

Поставим опыт

Создадим в домене учетную запись Admin и добавим ее в группу «Администраторы домена», после чего зайдем под этим пользователем в Windows. Теперь, если открыть диалог безопасности NT для «Общих папок» на компьютере MYHOST, можно увидеть в списке три объекта: пользователя Unix User\root, группу Unix Group\root и группу «Все» (рис. 1). Поскольку мы зашли на Samba-сервер как член группы «Администраторы домена», нам разрешен полный доступ по SMB. Однако, с точки зрения ext3, мы относимся к «прочим пользователям», которым дозволено только чтение каталога. Поэтому мы сможем просмотреть содержимое папки, но создать новый файл у нас не получится.

Проведем небольшой эксперимент. Создадим от имени root файл test.txt в каталоге /var/shares и попробуем просмотреть его ACL через диалог безопасности NT. Как видно, пользователь MYDOMAIN\Admin лишен прав даже на чтение файла, что подтверждается неудачной попыткой открыть text.txt в Блокноте. Поменять ACL файла сразу также не выйдет. Однако группа «Администраторы домена» перечислена в списке write list конфигурационного файла Samba, поэтому в качестве владельца в диалоге безопасности NT можно выставить MYDOMAIN\Admin. Затем можно дать себе право на запись в файл. После этого мы получим почти полный доступ к text.txt. Почти – потому что изменить файл нам удастся, а вот удалить или переименовать его – нет. Дело здесь в разной семантике прав доступа к каталогам в Linux и Windows. Если на Windows-компьютере пользователь не имеет права записи в каталог, но имеет полные права на файл в нем, то система позволит ему удалить этот файл. В Linux, как известно, каталог – это специальный файл, содержащий список имен других файлов. Право записи в каталог – это, фактически, право на изменение содержимого такого файла, в том числе – право на удаление записей из списка. Поэтому, если у Linux-пользователя нет прав на запись в каталог, то удалить файл в нем он не сможет. Итак, чтобы получить полный доступ к общей папке, нам надо зайти в диалог безопасности NT, назначить себя ее владельцем, а затем – добавить себя в ACL и разрешить полный доступ.

Управлять ACL можно и с помощью утилит, входящих в пакет acl. Команда getfacl позволяет посмотреть эффективные разрешения на доступ к файлу или каталогу, а setfacl – изменить эти атрибуты. Создадим файл test2.txt, разрешим группе «Пользователи домена» доступ на чтение, а затем выведем ACL файла.


>touch /var/shares/test2.txt
>setfacl -m g:”Пользователи домена”:r---- /var/shares/test.txt
>getfacl /var/shares/test.txt
getfacl: Removing leading '/' from absolute path names
# file: var/shares/test.txt
# owner: root
# group: root
user::rw-
group::---------
group:\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\321\202\320\265\320
      \273\320\270\040\320\264\320\276\320\274\320\265\320\275\320\260:r----
mask::r----
other::---

Как видно, у getfacl есть проблемы с отображением кириллицы: привычные нам русские буквы показаны в виде восьмеричных кодов. Впрочем, если Samba установлена на рабочей станции с графическим окружением, то можно попробовать утилиту Eiciel – она справляется с кириллицей куда лучше getfacl (рис. 2).

Права на наследство

Осталась еще одна функция Samba, необходимая для правильной работы с NTFS ACL: наследование атрибутов. Используя наследование, администратор может задать права для родительского каталога, и они будут установлены для всех дочерних объектов. Таким образом, объекты NTFS содержат два набора ACL – собственный и унаследованный. Реализовать эту особенность на базе только POSIX ACL не получится – для второго набора прав доступа здесь места нет. Поэтому Samba эмулирует наследование через расширенные атрибуты файловой системы, для поддержки которых нужно смонтировать ее с use_xattr:

/dev/sdb1 /var/shares ext3 auto defaults,acl,user_xattr 0 0

а затем добавить в секцию [global] файла smb.conf строку map acl inherit = Yes. После перезагрузки параметров Samba позволит устанавливать флажок «Разрешить наследование разрешений...» в диалоге безопасности NT.

Работать с расширенными атрибутами в Linux можно через утилиты geffattr и setfattr. С помощью Проводника Windows, создадим в общей папке каталог Тест и назначим наследование ACL через диалог безопасности. Теперь посмотрим на результат в Linux:

>getfattr -d /var/shares/Тест
getfattr: Removing leading '/' from absolute path names
# file: var/shares/\320\242\320\265\321\201\321\202
user.SAMBA_PAI=0sAQAAAAEAABAnAAA=

Не заостряя внимания на проблеме с кириллицей, взглянем на атрибут user.SAMBA_PAI. Именно здесь Samba хранит второй набор прав доступа, причем в двоичном виде. Так что если изменить POSIX ACL вручную, с помощью setfattr, мы все-таки можем, то с информацией о наследовании дела обстоят не так хорошо.

Изощренность, с которой Samba отображает свойства NTFS на POSIX-совместимую файловую систему, наводит на мысль: редактировать Windows-атрибуты файла нужно при помощи Windows-инструментов. Несмотря на то, что Linux предоставляет для управления POSIX ACL достаточно средств, назначать права доступа к общим папкам Samba лучше всего через диалог безопасности NT.

Теперь функциональность Samba-сервера почти полностью соответствует файл-серверу на основе Winodws 2000 и выше. Дело в том, что NTFS имеет еще одну документированную, но малоизвестную особенность – потоки (streams). Файл представляет собой основной (нулевой) поток, который приложения могут читать при помощи стандартных функций доступа к файлам, а также несколько дополнительных потоков, содержащих информацию, например о версии файла, авторе, комментариях и т. п. Поддержка альтернативных потоков была реализована в Samba 3.2 через модули streams_xattr и streams_depot, но (судя по всему) разработчики планируют переработать данную функцию.

В очередь, ...

Системы печати Windows и Linux настолько различны, что полной совместимости между ними добиться практически невозможно. Сравнивая их, принято говорить, что Windows выполняет драйвер принтера на клиентском компьютере. Клиент производит отрисовку задания на печать и пересылает его на сервер. Сервер же передает полученное задание на принтер в неизменном виде.


Система печати в Winodws реализована через службу «Диспетчер очереди печати». Драйверы представляют собой динамические библиотеки, загружаемые в адресное пространство диспетчера. Основной недостаток такой архитектуры в том, что некорректно написанный драйвер принтера способен привести к остановке диспетчера и отказу сервера печати.

Система печати Linux работает прямо противоположным образом. Клиентский компьютер посылает задание серверу в стандартном формате, как правило, PostScript. Сервер производит отрисовку задания и отправляет его на принтер. В Linux обычно используется система печати CUPS, основанная на концепции фильтров – отдельных утилит, вызываемых для обработки задания. После этого данные передаются на принтер через драйвер-процесс (backend). Поскольку каждый фильтр выполняется в отдельном адресном пространстве, его отказ приведет только к остановке текущего принтера, но не всей системы. В простейшем случае Windows-клиент достаточно легко настраивается для взаимодействия с Samba-сервером. Однако система печати Windows может функционировать в нескольких режимах, и не все они совместимы с Samba. Давайте рассмотрим их подробнее:

  • Стандартный режим Отрисовка задания производится на стороне клиента, а затем сервер передает его на принтер без изменений. Это единственный режим, поддерживаемый Samba полностью.
  • Режим EMF Клиент передает серверу изображение в векторном формате EMF, сервер отрисовывает его и передает на принтер. Именно таким способом в Windows реализуется функция «Дополнительные возможности печати».
  • Режим мониторинга Клиент передает задание в формате EMF, при этом драйвер принтера на сервере в процессе печати поддерживает связь с клиентом, сообщая ему, к примеру, данные о количестве оставшихся чернил. В режиме мониторинга работают, в основном, драйверы струйных принтеров, однако мне известна как минимум одна линейка лазерных принтеров, которая функционирует так же. Речь идет о серии Canon LBP, а в частности – о Canon LBP-810 и LBP-1120, которые одно время были весьма популярны. В указанных моделях объем памяти столь мал, что не вмещает образ отрисованной страницы целиком, поэтому драйвер вынужден передавать его по частям.

Два последних режима создают больше всего проблем с точки зрения совместимости, поскольку требуют, чтобы драйвер выполнялся не только на стороне клиента, но и на сервере. В нашем случае сервер управляется Linux, и запуск на нем Windows-приложений затруднен. Впрочем, есть надежда, что EMF-режим все же будет реализован: некоторые наработки были созданы в рамках Google Summer of Code 2005. Основная проблема на данный момент – отсутствие в Linux качественного конвертора из EMF в PDF, который мог бы стать основой для соответствующего фильтра CUPS, а также спецификации на формат SPL, используемый диспетчером печати Windows.

Итак, Samba поддерживает печать только в стандартном режиме. При этом у нас есть два варианта. Первый – отрисовка производится силами клиента, после чего задание в неизменном (RAW) виде передается через сервер Samba на принтер. Преимущество этого метода – поддержка даже тех принтеров, для которых нет драйверов CUPS, недостаток – необходимость установки на Windows-клиентах драйверов для всех типов принтеров, имеющихся в организации.

Второй вариант – клиент производит печать с помощью стандартного драйвера PostScript. Задание в этом формате отправляется на сервер, где производится преобразование PostScript в язык, понятный принтеру, а затем – распечатка. Данный метод требует поддержки принтера со стороны CUPS, зато клиент сможет использовать любой PostScript-совместимый драйвер (рис. 3). С точки зрения стабильности работы, а также простоты настройки клиента второй способ намного предпочтительнее.


Настроим Samba-принтер

Допустим, у вас уже есть зарегистрированный в CUPS принтер с именем Printer_IT, и печать на него из Linux проходит без проблем. В файле smb.conf он описывается как любой другой общий ресурс:

[Принтер ИТ-отдела]
printer=Printer_IT
printeble=yes
read list=@«Пользователи домена»

Параметр printer указывает на CUPS-имя принтера, printable определяет, что он будет доступен пользователям, а параметр read list задает список пользователей, имеющих возможность печати. Кроме того, в секции [global] нужно указать путь к каталогу, в котором будет располагаться очередь печати:

path = /var/spool/samba

Командой /etc/init.d/samba reload заставим Samba перечитать конфигурацию – и в общих ресурсах нашего сервера должен появиться «Принтер ИТ-отдела».

Чтобы не регистрировать каждый принтер сначала в CUPS, а затем – в Samba, можно воспользоваться параметром printcap в файле smb.conf. Он задает метод автоматического получения сведений о принтерах. Например, указав printcap = /etc/printcap, мы заставим Samba опубликовать принтеры, описанные в /etc/printcap. Если же написать printcap=cups, то Samba будет извлекать имена принтеров из CUPS. Чтобы принтеры, добавленные с помощью printcap, можно было использовать, необходимо дописать в smb.conf:

[printers]
printable = yes

Но если вы хотите, чтобы имя принтера содержало пробелы, путь у вас один – ручное редактирование smb.conf.

Печать Windows-клиента

Казалось бы, все очень просто, но есть один нюанс: вместо того, чтобы без лишних вопросов установить наш Samba-принтер, Windows покажет окно с предложением указать для него драйвер. Для одного принтера его вполне можно установить и вручную – ну, а если их в нашей организации больше сотни?

Samba позволяет автоматически устанавливать драйвер принтера на клиенте, как это делают серверы печати Windows. В момент установки драйвера Windows-клиент через службу RPC запрашивает у сервера список файлов, которые входят в состав драйвера, а затем копирует их из скрытого общего ресурса print$ сервера (рис. 4). Samba умеет корректно обрабатывать RPC-вызовы клиента, так что нам необходимо решить всего три задачи – создать на сервере Samba общий ресурс print$, скопировать туда любой PostScript-совместимый драйвер, взятый с Windows-компьютера, и ассоциировать его с Samba-принтером.


Первая задача решается проще всего – добавьте в файл smb.conf строки

[print$]
 path = /var/lib/samba/printers
 comment = Printer drivers

перечитайте конфигурацию – и общий ресурс готов. Осталось найти для него PS-совместимый драйвер.

Допустим, у нас есть Windows-компьютер с NetBIOS-именем WINPC. Через «Мастер установки принтеров» создадим на нем общий принтер «PrinterHP» и сопоставим ему драйвер “HP LaserJet 4/4M PS (300 dpi)”.

Для связи с Windows-компьютерами через службу RPC в состав Samba входит утилита rpcclient. Она позволяет выполнять множество RPC-команд, но нас будут интересовать всего три – getdriver, adddriver и setdriver.

Запросим с WINPC список файлов драйвера, указав после имени принтера тип драйвера ‘3’ (драйвер пользовательского режима).

>rpcclient winpc -c 'getdriver “Printer_IT” 3' -U=Администратор [Windows NT x86]
Printer Driver Info 3:
Version: [3]
Driver Name: [HP LaserJet 4/4M PS (300 dpi)]
Architecture: [Windows NT x86]
Driver Path: [\\WINPC\print$\W32X86\3\PSCRIPT5.DLL]
Datafile: [\\WINPC\print$\W32X86\3\HP4M3_V1.PPD]
Configfile: [\\WINPC\print$\W32X86\3\PS5UI.DLL]
Helpfile: [\\WINPC\print$\W32X86\3\PSCRIPT.HLP]
Dependentfiles: [\\WINPC\print$\W32X86\3\PSCRIPT.NTF]
Monitorname: []
Defaultdatatype: []


Результат выполнения команды – список файлов, составляющих искомый драйвер. Их нужно скопировать из папки \\winpc\print$\\W32X86\3\ в каталог /var/lib/samba/printers/W32X86 на Linux-сервере. Создавать подкаталог 3 не нужно – утилита rpcclient сделает это сама в момент регистрации драйвера.

>rpcclient localhost -c ‘adddriver “Windows NT x86”
“Generic PS Driver (HP):
PSCRIPT5.DLL:HP4M6_V1.PPD:
PS5UI.DLL:PSCRIPT.HLP:NULL:
RAW:PSCRIPT.NTF” 3’ -U=Администратор

Осталось только сопоставить драйвер и Samba-принтер:

>rpcclient localhost -c ‘setdriver “Принтер IT-отдела” “Generic PS driver (HP)”’ -U=Администратор

Теперь при установке сетевого принтера на Windows-клиенте будет автоматически устанавливаться и его драйвер (рис. 5).

В заключение добавим, что Samba хранит данные о драйверах и принтерах, а также некоторые другие настройки в файлах с расширением .tdb, расположенных в каталоге /var/lib/samba. При обновлении Samba они могут быть изменены, после чего печать придется настраивать заново. Поэтому рекомендуется время от времени копировать TDB-файлы в надежное место с помощью утилиты tdbbackup.

И напоследок...

Подробно рассмотрев способы подключения к принт-серверу клиентов, мы совсем забыли о другой стороне вопроса – о самих принтерах. Если все они имеют Ethernet-интерфейсы или же подключены к «тонким клиентам», то проблем, как правило, не возникает – принтеры настраиваются в CUPS как AppSocket/JetDirect. Если же они подключены к компьютерам под управлением Windows, то есть возможность заставить их печатать не через протокол SMB, а через сетевой интерфейс LPD, в обход драйвера принтера.

Для этого в «Мастере установки компонентов Windows» зайдем в раздел «Другие службы доступа к файлам и принтерам в сети» и установим компонент «Службы печати для Unix». Теперь переименуем уже настроенный в Windows принтер так, чтобы имя не содержало пробелы и кириллицу. После этого через «Мастер установки принтеров» добавим новый локальный LPR-порт, причем в поле «Имя или адрес LPD-сервера» введем имя Windows-компьютера, а в поле «Имя принтера или очереди печати на сервере» – новое имя установленного принтера. Наконец, удалим группу «Все» из настроек безопасности принтера, закрыв тем самым доступ к принтеру локально – и можно считать, что настройка Windows-принтера для печати через интерфейс LPD закончена. LXF

Персональные инструменты
купить
подписаться
Яндекс.Метрика