unix 2014-01-07 22-48-04
Школа самбы для админов
Сергей «grinder» Яремчук
Хакер, номер #101, стр. 150
(grinder@ua.fm)
Samba: инструмент для работы в сетях Windows
Администрирование сравнительно небольшой сети, настроенной как рабочая группа, может замотать даже самого трудолюбивого администратора. Постоянно возникающие проблемы с доступом, пропавшими файлами и сетевыми ресурсами, бесконтрольность и некомпетентность пользователей, способные обесценить любую систему безопасности, и прочие хлопоты. Выход из такой ситуации только один - взять все под свой контроль, установив контроллер домена. Решить эту задачу с минимальными финансовыми вложениями можно, используя Linux с пакетом Samba.
Установка Samba
Пакет Samba (www.samba.org) позволяет *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». Вот, собственно, и все премудрости.
Конфигурационный файл Samba
Конфигурационный файл сервера (и частично клиента) - традиционный для *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 быть time-сервером для 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 = 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. Успехов.
Переменные в Samba
В секции 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.
http://www.xakep.ru/magazine/xa/101/150/1.asp