Библиотека сайта rus-linux.net
Безопасность Samba. Часть вторая.
Оригинал: Paranoid Penguin - Samba Security, Part II
Автор: Mick Bauer
Дата: 1 декабря 2008
Перевод: Александр Тарасов aka oioki
Дата перевода: 31 марта 2009
В прошлый раз мы начали рассматривать вопрос, как установить и настроить безопасный файловый сервер на Samba для локального (не-интернет) использования. Был сделан обзор целей построения такого сервера, было объяснено, почему Samba наилучшим образом подходит для настройки "сетевых дисков" для клиентов в локальной сети, определены понятия и концепции Samba, и рассказано, как установить демоны сервера Samba, клиентские утилиты и веб-интерфейс для конфигурирования Samba - SWAT.
В этот раз обзор будет расширен, и будет конкретно показано, что нужно записывать в файл smb.conf, чтобы ресурсы были защищены должным образом. Будут рассмотрены задачи в общем смысле, но отдельное внимание будет уделено безопасности.
Сценарий использования
Итак, мы хотим построить удобный и безопасный файловый сервер, поддерживающий клиентов на платформе как Windows, так и Linux (и другие *nix системы тоже). Конкретно, мы хотим собрать внутри локальной сети файловый сервер на Samba, чтобы он поддерживал разные уровни доступа: гостевой (анонимный), доступ только для чтения для некоторых авторизованных пользователей и доступ на чтение и запись для некоторых других авторизованных пользователей.
Иными словами, наш сервер будет работать в режиме доступа пользователя, причем будет использоваться комбинация локальных пользователей Linux/UNIX и Samba-хэшей паролей этих пользователей. Именно так и будет определяться доступ к общим ресурсам рабочей группы. В рабочей группе, как вы помните, может быть несколько общих ресурсов, предоставляемых разными Samba-серверами, причем каждый сервер хранит свою базу данных пользователей, независимую от других серверов. Вот почему домены и Active Directory являются лучшим решением в больших сетях. В нашей пробной рабочей группе будет всего лишь один сервер.
Предположим, что я сдаю квартиру трем секретным агентам ФСБ: Скиппи, Кнуту и Пепе. Они любят, как я готовлю, и постоянно следят за моим недельным меню, которое я вывешиваю на своем Samba-сервере в ночь с воскресенья на понедельник. Могу поспорить, никто не будет работать по вечерам, когда на ужин подаются картофельные драники. Недельное расписание является публичным документом.
Когда квартиранты помогают мне косить траву, кормить ежиков или настраивать пианино, они могут не платить арендную плату. У меня есть целый список дел по хозяйству, который все могут читать, но, конечно, никто не может изменять - представьте, какой бы начался произвол - например Пепе постоянно бы кормил ежиков!
Но все же эти ребята - секретные агенты, и поэтому им не хотелось бы, чтобы враги знали, что они раскапывали компостную яму. Поэтому список дел может просматриваться лишь нашими секретными агентами, но чтобы изменять его они не могли.
Наконец, без ведома парней, их босс Мик попросил меня вести журнал всей их веб-активности с моего файрволла. Хотя он все равно ничего толком не узнает (они используют TOR), тем не менее эти логи супер-секретны. На самом деле, логи не принадлежат никакому серверу, просто я иногда развлекаюсь и дописываю фиктивные записи в журнал Скиппи ("GET HTTP://thesharperimage.com/expensive_gifts_for_your_boss.html").
Итак, мне нужно создать рабочую группу (назову ее FED-CENTRAL) с четырьмя пользователями (skippy, knute, pepe и mick) и тремя общими ресурсами (SUPPER, CHORES и BUZZ-OFF).
Конфигурация Samba: Глобальные настройки
Теперь мы готовы. Предпологаю, что вы правильно установили пакеты Samba-сервера и клиентских программ. Первым шагом будет установка некоторых глобальных переменных.
Есть два способа настройки Samba. Первый способ - это непосредственное редактирование файла /etc/samba/smb.conf с помощью вашего любимого редактора, после чего ручной перезапуск демонов smbd и nmbd. Вас наверняка станет тянуть к этому способу, когда вы уже немного разберетесь в Samba - это самый быстрый и прямой способ по изменению поведения Samba.
Тем не менее, в последнее время я привык ко второму способу: графический интерфейс SWAT (Samba Web Administration Tool). Если вам не нравится мое позитивное отношение к утилите, которая требует устанавливать пароль пользователя root (который по умолчанию в Ubuntu отключен), тогда прочтите мою предыдущую статью. Наш сервер не смотрит в интернет, и образовательные цели в данном случае для нас важнее, чем проблемы безопасности.
Кстати, Swat не является "костылем"; это на самом деле достаточно продуманный веб-интерфейс для задания значений всем возможным переменным в smb.conf, с удобными ссылками, пройдя по которым можно перейти к соответствующей части man-страницы. Чем больше вы будете работать через Swat, тем менее страшно будет впоследствии редактировать smb.conf напрямую. О многих ли графических интерфейсах можно сказать такое?
На данном этапе предполагается, что у вас не возникло проблем с установкой Samba и Swat (это было описано в предыдущей статье). Вы в том числе сконфигурировали и перезапустили inetd, а также установили пароль пользователю root с помощью команды sudo passwd root. Если же не хотите подвергать риску безопасность своего сервера, либо попросту не хотите пользоваться Swat - все равно дальнейшие рассуждения будут полезны. Ведь то, что отображено на скриншотах Swat и внутри файла smb.conf - по сути одно и то же.
Открыть Swat легко. Запустите свой браузер и идите по адресу http://localhost:901/. Первое, что вы увидите - это домашняя страница Swat, на которой расположен ряд навигационных кнопок (Home, Globals, Shares, Printers и так далее). Они есть на каждой странице Swat, а домашнюю страницу от всех других отличает полный перечень локальных man-страниц, руководств HOWTO и даже целых книг. Вот вам пространство для исследования на любом уровне знакомства с Samba.
Однако перейдем к глобальным настройкам Samba. Они открываются по нажатию кнопки Globals, вы увидите нечто, похожее на рисунок 1.
Рисунок 1. Глобальные настройки
Очевидно, нам сразу нужно изменить имя рабочей группы с WORKGROUP на FED-CENTRAL. NetBIOS-имя по умолчанию берется из файла /etc/hostname, чаще всего его просто нужно оставить как есть. Это то имя компьютера, которое человек увидит, открыв сетевое окружение.
Значение поля security по умолчанию - user, именно это нам и надо. То же самое относится к переменной encrypt password - оставляем значение yes.
Следующие две переменные - client schannel и server schannel, нужно изменить. Schannel означает безопасный метод передачи (secure channel). Этот параметр позволяет клиентам Samba заходить на Samba-сервера под своим именем, и мы не хотим, чтобы это было по выбору. Нужно сделать эту процедуру обязательной. Поэтому обе переменные должны быть установлены в значение yes.
Последняя переменная, показанная на рисунке 1 - map to guest. Это значение говорит Samba о том, в каких случаях клиенту должен быть открыт гостевой доступ, если вход на сервер не был произведен. По умолчанию стоит значение never, что полностью закрывает гостевой доступ. Однако, как можно видеть на рисунке 1, в моей системе Ubuntu установлено значение Bad User. Это означает, что если пользователь введет несуществующее имя пользователя, ему будет дан гостевой доступ.
Прокрутив страницу глобальных настроек дальше, вы увидите подобие рисунка 2.
Рисунок 2. Еще больше глобальных настроек
Продолжаем знакомство с этими глобальными настройками. Параметр obey pam restrictions означает, что Samba будет придерживаться правил, установленных системой PAM (Pluggable Authentication Modules). Однако на практике, когда параметр encrypt passwords установлен в yes, Samba все равно будет игнорировать PAM.
Параметр passdb backend определяет, какого в базе данных какого типа Samba будет хранить зашифрованные пароли. Значение по умолчанию (tbdsam) - это лучший выбор.
guest account - это локальный пользователь Linux, который будет использоваться для клиентов, не прошедших аутентификацию - я писал об этом чуть выше. passwd program, passwd chat и unix password sync определяют каким образом Samba обрабатывает запросы пользователей сменить их пароль через Samba-сессию. Если не хотите, чтобы пользователи могли менять пароли, оставьте все как есть.
Здесь вы можете спросить, какая же разница между базой данных паролей Samba и списком хэшей в файле /etc/shadow, если они все равно соотносятся с одним и тем же набором локальных пользователей? Короткий ответ: Samba (SMB/CIFS) использует протокол аутентификации, который не совместим с хэшами паролей UNIX.
Плохо здесь то, что по этой причине в Linux база данных паролей Samba оказывается избыточной, что приводит к тому, что пользователям приходится помнить два разных пароля. Однако если параметры passwd program и passwd chat установлены правильно (если вы пользуетесь официальными пакетами для вашего дистрибутива, то наверняка все уже в порядке), а unix password sync установлено значение yes, тогда Samba будет автоматически обновлять Linux-пароль пользователя каждый раз, когда он меняет свой Samba-пароль. Поговорим об этом в следующем разделе.
Далее, valid users содержит список пользователей UNIX, который могут получить доступ к Samba-ресурсам. По умолчанию стоит значение "" (пустое) - никто не может получать доступ к ресурсам. Для нашего сценария необходимо, чтобы valid users содержал пользователей mick, knute, pepe, skippy, nobody.
admin users позволяет вам дать права суперпользователя на все ресурсы одному или нескольким локальным пользователям, вне зависимости от того, какие Samba- или Linux-права установлены на этот ресурс. Будьте осторожны с этой настройкой! По эффективности эта настройка близка к выполнению локальных команд от имени root. Как вы видите на рисунке 2, я указал mick как суперпользователя, потому что я пользуюсь этим логином для системного админстрирования.
В списке read list указываются те пользователи, которые по умолчанию обладают правами только для чтения. Как видно на рисунке 2, в этом списке находятся пользователи knute, pepe, skippy.
Аналогично, write list определяет перечень пользователей, обладающих правами как на чтение, так и на запись. У меня это mick.
Рассмотрение параметра printer admin пока останется за пределами этой статьи (возможно, затрону в следующих статьях). Параметры hosts allow и hosts deny, соответственно разрешают и запрещают некоторым хостам работу с нашим сервером. В них позволяется создавать списки контроля доступа наподобие TCP Wrappers. hosts allow - это список белых IP-адресов, имен машин или доменов, которым разрешено подключаться к серверу (при условии успешной аутентификации).
hosts deny - это черный список, также состоящий из IP-адресов, имен и т.д. - этим машинам даж не позволено попытаться пройти аутентификацию. Samba не будет устанавливать соединение с любой машиной, попадающей в этот список. В man-страница hosts_access(5) имеется исчерпывающая информация о синтаксисе этих двух переменных.
Итак, мы разобрались с глобальными переменными. Чтобы применить сделанные изменения, то есть сохранить их в файл /etc/samba/samba.conf, нажмите на кнопке Commit Changes.
Некоторые переменные, значения которых вы поменяли на свои значения (например valid users), могут не отобразиться при обновлении экрана. Чтобы увидеть их, просто нажмите на кнопке Advanced View (следует за надписью Change View To: вверху страницы).
Настройка учетных записей
Последняя задача, которую нужно выполнить в этой статье - настроить пользовательские аккаунта. Этот процесс состоит из четырех этапов:
- Создаем пользователя Linux.
- Задаем ему пароль.
- Для каждого пользователя Linux создаем запись в базе данных паролей Samba.
- Пользователь меняет свой Samba-пароль.
Первый шаг выполняется в разных системах по-разному - через графический интерфейс (например через GNOME-апплет Пользователи и группы) либо с помощью консольных команд useradd, userdel и т.д.
К примеру, чтобы создать аккаунт Pepe в Ubuntu, нужно ввести следующую команду. В других дистрибутивах нужно сначала зайти как root с помощью команды su, а потом делать так же, как написано, только без sudo.
bash-$ sudo useradd -c "Pepe" -m -g users pepe
Будет создан пользовательский аккаунт pepe с коммантарием Pepe, будет автоматически создан домашний каталог (/home/pepe) и Пепе будет включен в группу users. В целях усиления безопасности можно вставить параметр -s /bin/false, который отключит возможность обычного входа Пепе, то есть аккаунт будет использоваться лишь для Samba-доступа.
Вторым шагом устанавливаем пароль свежесозданного пользователя, например так:
bash-$ sudo passwd pepe
Очевидно, после ввода начального пароля (к примеру, 12345) вы должны тайно передать его Пепе, после чего тот сможет изменить этот пароль на собственный вариант (но это произойдет только на четвертом шаге).
Третьим шагом мы воспользуемся командой smbpasswd, таким образом создадим для Linux-пользователя запись в базе данных паролей Samba. Примерно так:
bash-$ sudo smbpasswd -a pepe
Вас попросят ввести пароль Пепе и подтвердить его, после этого новый Samba-аккаунт будет создан. Лучше всего поставить здесь такой же пароль, как и на втором шаге.
Наконец, зайдите в систему от имени Пепе (только если вы не установили параметр его оболочки в /bin/false на первом шаге) и командуйте:
pepe@casademick$ smbpasswd
У Пепе спросят его старый пароль, желаемый новый и его подтверждение во избежания ошибки. Если все в порядке, Samba изменит оба пароля Пепе - Samba-пароль и Linux-пароль. Обратите внимание, что эта синхронизация не происходит, когда вы создаете начальную запись pepe в Samba-базе (на третьем шаге).
Если Пепе не разрешен вход в систему (то есть установлена оболчка-пустышка /bin/false), тогда нужно его посадить за консоль, ввести команду sudo smbpasswd pepe и отвернуться, пока он вводит свой пароль. Вдобавок к этому нужно командовать sudo passwd pepe, и Пепе придется еще раз ввести свой пароль - дело в том, что Samba не синхронизирует пароли, если запускать smbpasswd от имени root.
Восстановление файла smb.conf в Debian/Ubuntu
Весьма вероятна ситуация, когда ковыряясь с настройками Samba, вы полностью потеряетесь и придется попросту начать сначала, вернуться к первоначальному файлу /etc/samba/smb.conf. Что если вы забыли сделать резервную копию?
Swat вам поможет. Рядом с каждым параметром конфигурации есть кнопка Set Default. Нажав ее, вы вернете значение, которое было в момент установки Samba. Однако по своему опыту скажу, что эти кнопки ведут себя непредсказуемо. Иногда некорректно возвращаются нулевые значения, а само по себе нажатие кнопки долго обрабатывается.
Если у вас Debian или его производные (например, Ubuntu), тогда лучше воспользоваться таким способом. Чтобы получить свежий файл smb.conf, нужно полностью удалить пакет samba-common, а затем вновь установить его. При этом будут удалены зависимые от него пакеты, так что отметьте для себя, что вы удаляете, чтобы потом восстановить.
После того, как вы удалили samba-common, но еще не установили его снова, проверьте, чтобы файл smb.conf точно был удален (если что - удалите вручную).
Заключение
Итак, сценарий описан, благодаря Swat установлены базовые параметры, и мы начали добавлять пользователей. В следующей статье мы будем создавать общие ресурсы. Следующие источники информации помогут вам.
Источники информации
1. Christopher R. Hertel's On-Line Book Implementing CIFS. Полноценный источник информации по всему, что связано с CIFS/SMB:
www.ubiqx.org/cifs
2. "The Official Samba 3.2.x HOWTO and Reference Guide": http://us1.samba.org/samba/docs/man/Samba-HOWTO-Collection
Mick Bauer (darth.elmo [at] wiremonkeys [dot] org) - архитектор сетевой безопасности одного из крупнейших банков США. Он является автором книги Linux Server Security, 2nd edition издательства O'Reilly (ранее называлась Building Secure Servers With Linux), иногда выступает на конференциях по информационной безопасности.