Воздвигнем NAS на раз! Создаем мультипротокольный NAS из старого компаЕвгений Зобнин (j1m@synack.ru) Сегодня множество компаний предлагают железные решения для создания NAS самых разных уровней, от устройств для организации домашней файлопомойки до корпоративных стоечных серверов. Но зачем тратить деньги на дорогостоящие железки, когда любой из пылящихся в серверной системных блоков можно превратить в настоящий мультипротокольный NAS с разделением доступа? Аббревиатура NAS расшифровывается как Network Attached Storage (хранилище, подключаемое по Cети). Принадлежащее к этому классу устройство обычно представляет собой небольшой маломощный сервер (возможно на процессоре VIA), построенный на чипсете с многоканальным IDE/SATA-контроллером. Его основная задача - хранить данные и предоставлять к ним доступ по множеству протоколов (CIFS, NFS, FTP/FTPS, HTTP/HTTPS и т.д.) Причем вторая задача решается с помощью прошитой во флеш-память операционной системы, в качестве которой в последнее время все чаще выступает Linux. Казалось бы, Linux сейчас используется везде, и нет ничего удивительного в том, что производители различных устройств подгоняют пингвина под свои нужды и строят поверх него целую систему из проприетарных компонентов. Но NAS не тот случай, обычно в нем установлен самый обычный дистрибутив Linux со стандартным набором заранее сконфигурированных сетевых сервисов, а единственный закрытый компонент - это веб-интерфейс и система уведомлений. Именно поэтому самую настоящую NAS-систему можно собрать в буквальном смысле на коленке, взяв один из простаивающих компов и установив на него Linux-дистрибутив. Анатомия ОС, используемой в NAS-устройствеКаким же образом настроить операционную систему, чтобы она стала пригодной для использования на NAS-устройствах? Во-первых, она должна быть лишена всего, что не является важным для хранения данных, предоставления удаленного доступа к ним и администрирования. Этого легко добиться, отправив все пакеты, содержащие систему X Window, пользовательские программы и высокоуровневые библиотеки в /dev/null. В результате в системе должно остаться ядро, шелл, набор инструментов командной строки и стандартные библиотеки (glibc, ncurses и т.д.). Во-вторых, система должна содержать все необходимое для организации удаленного доступа к данным: samba (протокол CIFS), nfs-kernel-server (протокол NFS), vsftpd (FTP/FTPS), lighttpd (HTTP/HTTPS), ssh (SFTP) и rsync (для бэкапа данных). В-третьих, система должна уметь загружаться с USB-брелка или LiveCD (нельзя допустить, чтобы ОС обрушилась вместе с отказом одного из жестких дисков). В идеале ОС должна уметь аутентифицировать пользователей, используя Active Directory или LDAP, но мы ограничимся стандартным файлом /etc/passwd для хранения учетных записей. Подготовка Flash-брелкаУстановить Linux на USB-flash очень просто. Для этого достаточно взять установочный дистрибутивный диск, скормить его приводу, выключить комп, отключить все жесткие диски, включить комп и приступить к установке. Инсталлятор ОС примет USB-флешку за HDD и благополучно установит на нее систему. Но существует еще более простой способ - вставить флешку в гнездо и указать ассоциированное с ней устройство в качестве жесткого диска эмулятору qemu:
После этого следует установить дистрибутив, указав инсталлятору использовать всю флешку для создания единого раздела ОС (без свопа и прочих ухищрений). Причем в качестве файловой системы лучше выбрать ext2, так как журналируемость и flash-накопители - вещи несовместимые (виной тому низкая скорость работы + износ накопителя). После завершения процедуры следует загрузиться с flash-накопителя (хотя бы используя все тот же qemu) и приступить к зачистке дистрибутива от ненужного хлама: X Window, оконные менеджеры и среды, пользовательский софт и т.д. А освободившееся место использовать для установки samba, nfs-kernel-server, nfs-common, portmap, vsftpd, rsync, lighttpd, openssh-server (названия приведены для дистрибутива Ubuntu 9.04). Создание хранилища и привязка к нему пользователейРазобравшись с установкой, приступаем к организации хранилища и настройке сетевых служб. Для этого нам надо создать два подкаталога в каталоге /mnt: share (в нем будет храниться информация, доступная всем) и private (личные каталоги пользователей). Ты можешь сразу подключить к компу все жесткие диски, создать из них RAID и примонтировать его к /mnt (не забыв добавить соответствующую запись в /etc/fstab) или же наращивать дисковый массив постепенно, подключая все новые диски для отдельных пользователей. В конце концов, смысл в том, что каталоги /mnt/share и /mnt/private и будут нашим хранилищем, а что и к чему подключено на более низком уровне, – значения не имеет. Далее установим права на созданные каталоги:
С помощью этих трех команд мы сделали так, чтобы:
Теперь ты можешь завести в системе пользователей, которые должны иметь доступ к серверу (например, director, buhgalter, admin и т.д.) и создать соответствующие каталоги внутри /mnt/private. Пример:
Протокол CIFSОбычные пользователи обращаются к NAS-серверу через сетевое окружение Windows, поэтому настройке доступа по протоколу CIFS необходимо уделить особое внимание. Мы воспользуемся вполне стандартной конфигурацией smb.conf, которая выставляет в локальную сеть два ресурса: наш каталог /mnt/share и личный каталог пользователя (/mnt/private/пользователь), куда последний будет попадать после ввода имени и пароля.
После этого открываем файл /etc/samba/smb.conf и пишем в него:
Добавляем в самбу всех пользователей, которых мы завели в локальной системе, с помощью команды:
Запускаем службу:
Протокол NFSIT-отдел предпочитает использовать сетевую файловую систему для доступа к своим данным. Что ж, желание легко удовлетворить с помощью ядерного NFS-сервера:
Открываем файл /etc/exports и добавляем в него строку:
192.168.1.1/24 - это сеть, которой разрешен доступ на монтирование ресурса. Пользователи будут видеть как каталог /mnt/share, так и /mnt/private, но доступ к последнему будут иметь только владельцы соответствующих домашних каталогов.
Протокол FTPДля полноты картины мы должны организовать доступ к NAS с помощью протокола FTP. Но здесь сразу сталкиваемся с проблемой - протокол FTP не позволяет клиенту указывать собственную кодировку, и пользователям Windows имена файлов будут видны только в случае использования кодировки cp1251, а пользователям UNIX - koi8-r или utf-8. Прибавь к этому неумение сервера vsftpd перекодировать имена из локальной кодировки и получишь полный бардак. Выход из ситуации – в использовании костылей, а именно установке модифицированной версии vsftpd, скачанной с сайта vsftpd.devnet.ru, и указании серверу перекодировать имена файлов в кодировку cp1251. Это автоматически решит проблему Windows-пользователей. Всех остальных можно занести в специальный список IP-адресов и назначить им другую кодировку, например utf-8. Итак, скачиваем vsftpd-2.1.2-ext1.tgz, распаковываем, собираем и устанавливаем:
Добавляем пользователя nobody (с правами которого будет работать сервер) и пользователя ftp (к которому будут приравнены анонимные пользователи):
И создаем каталог /usr/share/empty, в который сервер будет делать chroot:
Добавляем строку «/usr/local/sbin/vsftpd» в файл /etc/rc.local (перед строкой «exit 0»). Открываем /etc/vsftpd.conf и пишем в него строки:
Открываем файл /etc/vsftpd/pasv_rules и записываем в него IP-адреса всех, кто не использует кодировку cp1251, в следующей форме: IP-сервера IP-клиента/маска IP-сервера кодировка yes yes yes yes no Пример:
Запускаем сервер:
Вход на сервер под именем anonymous или ftp позволит пользователю получить доступ к любым каталогам внутри /mnt/share, с возможностью создавать подкаталоги и заливать файлы. Если же пользователь введет имя и пароль, то попадет в свой каталог внутри /mnt/private с полными правами на чтение, запись и удаление файлов. По умолчанию имена файлов закодированы в cp1251, но те, кто заходит с IP-адресов, перечисленных в /etc/vsftpd/pasv_rules, получат особые настройки (например, перекодировку в utf-8). Протокол HTTPНа всякий случай мы должны настроить доступ и по протоколу HTTP, который в отдельных случаях оказывается единственным способом обращения к сервису. Для этого лучше всего подойдет легкий и производительный web-сервер lighttpd, который будет генерировать список файлов каталога /mnt/share (делать корнем каталог /mnt бессмысленно – просто потому что web-сервер не сможет получить доступ к содержимому каталога /mnt/private). Устанавливаем web-сервер:
Открываем конфигурационный файл /etc/lighttpd/lighttpd.conf, затираем прежнее содержимое и добавляем новое:
Подключаем модуль userdir, предназначенный для генерирования листинга файлов:
После этого в файле /etc/lighttpd/lighttpd.conf появятся строки:
Запускаем сервер:
Протоколы SFTP и RSYNCПоследний, очень короткий, раздел посвящен настройке доступа к NAS по протоколу SFTP и реализации системы бэкапа. Для начала установим пакеты openssh-server и rsync:
Вместе с первым мы автоматически получили SFTP-сервер, уже полностью настроенный и запущенный системой установки пакетов. Во втором содержится утилита rsync, которую мы будем использовать для бэкапа данных. Rsync не требует настройки, сервера или плясок с бубном. Главное, произвести обмен ssh-ключами между пользователем root NAS-сервера и пользователем, производящим бэкап на машине-приемнике. Затем достаточно выполнить следующую команду, и ты получишь бэкап всех данных каталога /mnt (повторное выполнение команды приведет к копированию только изменившихся данных):
В качестве источника предпочтительно указать каталог /mnt/private, чтобы не копировать множество бесполезных данных, которые пользователи могут складировать в общую шару, а саму команду добавить в задания cron (советуем настроить ежедневное копирование). Ограничение доступаВо избежание захламления открытого для всех подряд каталога /mnt/share, некоторых пользователей лучше отрезать от NAS-сервера с помощью TCP-Wrappers. Для этого устанавливаем пакеты xinetd и tcpd:
И вписываем IP-адреса неугодных в файл /etc/hosts.deny:
Это автоматически обезопасит NAS-сервер при доступе по протоколам NFS и SFTP. Чтобы vsftpd научился пропускать свои соединения через tcpd, добавим в его конфиг строку «tcp_wrappers=YES» и перезапустим:
Samba не умеет работать с tcpd, но ее можно запустить под его управлением с помощью xinetd. Остановим samba-демон:
Добавим следующую строку в /etc/inetd.conf:
И – перезапустим xinetd:
Ограничивать доступ по протоколу HTTP не имеет смысла, ведь он работает только в режиме чтения. ЗаключениеСоздание собственного NAS-сервера из подручных материалов – не такая уж и сложная задача. Конечно, наш NAS не обладает web-интерфейсом, не умеет шифровать передаваемые данные (за исключением протокола SFTP) и не накладывает квоты на пользователей и группы. Но нужно ли все это? Для большинства админов с руками доступ по протоколу SSH гораздо предпочтительнее даже самого гибкого web-интерфейса, шифрование данных совершенно бесполезно в офисных локальных сетях, а квоты рождают больше неудобств, чем приносят пользы (уж лучше время от времени просматривать содержимое хранилища в поисках тех, кто использует NAS не по назначению, и бить по рукам провинившихся, чем включить квотирование и дожидаться момента, когда хранилище забьется). WARNINGСтарые материнские платы могут отказаться грузить ОС с флешки, отформатированной в ФС, отличную от FAT16. В этом случае придется устанавливать ОС на FAT16 или создать отдельный раздел для загрузчика. Команда lighty-enable-mod присутствует только в дистрибутивах Debian/Ubuntu и производных. Во всех остальных для активации модуля необходимо добавить его имя в переменную server.modules конфигурационного файла lighttpd.conf (не забыв указать префикс mod_). В Ubuntu xinetd по умолчанию запускается в режиме совместимости с inetd (то есть, читает файл /etc/inetd.conf). В других дистрибутивах, возможно, придется подправлять скрипты инициализации, чтобы указать xinetd флаг '-inetd_compat'. |