Когда-то давно поднимал вопрос создания простенького FTP-сервера для домашнего и мелкоофисного использования на Puppy Linux Slacko. Как-то незаметно настало время улучшить и углУбить мануал, и сделать такой же сервер, но на Slackware. Собственно программное обеспечение сервера решено оставить то же — PureFTPd. Ибо уже и какой-никакой опыт в настройке есть, и мануалов в сети много. Тут такая мини-инструкция, больше для себя, где я попытался воедино свести информацию из различных источников. К сожалению, не во всех все подробно описано, посему сперва столкнулся с некоторыми неочевидными глюками, и чтоб не гуглить потом все в разных местах, сам решил свести воедино все свои пометки в рабочем блокноте в данной заметке.
Сразу говорю, вопрос шифрования трафика, FTP через SSL в данной заметке благополучно упущен по причине ненадобности. Для общего доступа из Интернета данный сервер и не планировался, а для того, чтобы не бегать с флешками между десятком-другим компов, хранить бэкапы, дистрибьютивы софта, его как раз должно хватить.
Почему FTP, а не Samba? Не знаю, но FTP мне показался более простым в настройке, плюс универсальней — клиент FTP есть из коробки во всех «больших» ОС, начиная от Windows XP и кончая почти всеми Линуксами и MacOS, плюс FTP-клиент достаточно быстро прикручивается и к мобильным системам. Во всяком случае, подружить Android и iOS с FTP оказалось менее муторно, чем заставить нормально работать мобильные девайсы с расшаренными директориями в Samba на Linux, или с расшаренными папками в Windows.
/etc/shells
и проверяем в нем наличие строки /bin/false
Если ее нет — смело дописываем.Если данной строки нет, то при настройке могут проявиться всякие странные глюки. Например, на одном из дистрибьютивов пользователя для FTP-сервера удалось создать только с помощью скрипта-обертки
adduser
, а пользователи, созданные командой useradd
, почему-то получали отлуп при входе на FTP, несмотря на верное имя пользователя и пароль (и прочих верных параметрах). Хотя и adduser
(хоть и переспрашивая) и useradd
(ничего не спрашивая) позволяли отключить пользователю FTP оболочку, задав вместо нее /bin/false
. Так и не понял, какую магию добавлял скрипт-обертка, хотя параметры утилиты useradd
были идентичными
Примечание. Забегая вперед, скажу, что у PureFTPd есть замечательный механизм виртуальных пользователей. Он позволяет не плодить в системе кучу Linux-пользователей, которым нужно обеспечить доступ к FTP, а вместо этого создать всего одного, из-под которого будет работать сколь угодно виртуальных. Необходимые параметры виртуальным пользователям (имя, пароль, рабочий каталог FTP, объем выделенного дискового пространства, скорость закачки файлов) задаются с помощью утилиты pure-pw
, входящей в пакет PureFTPd, ею виртуальные пользователи также добавляются и удаляются.
ВАЖНО! Далее приводится инструкция по минимальной настройке FTP-сервера для дома или малого офиса. Настоятельно рекомендуется ознакомиться с полной версией инструкции к PureFTPd, если вы хотите открыть доступ к нему в Интернет и других общедоступных сетях, а также с инструкцией, как обеспечить работу FTP с шифрованием трафика (FTP через SSL).
Итак, приступим. Естественно, все делается через консоль под
root
1. Проверяем наличие строки /bin/false
в файле /etc/shells
2. Устанавливаем PureFTPd. Лично я установил его с помощью sbopkg, без дополнительных параметров при сборке пакета. Все заработало.
3. Создаем группу для пользователей FTP:
groupadd ftpgroup
где:
ftpgroup
— название группы для пользователей FTP, можете вместо ftpgroup
вписать любое уникальное название группы. Уникальное — значит, такой группы в системе не должно быть.
4. Создаем Linux- (системного, реального) пользователя для FTP. Этому пользователю для пущей безопасности (и корректной работы с виртуальными пользователями FTP) следует отключить командную оболочку и задать несуществующий домашний каталог. Добавляем нового пользователя в систему командой useradd
:
useradd -g ftpgroup -d /dev/null -s /bin/false ftpuser
где:
-g ftpgroup
— указывается группа пользователя, необходимо вместо ftpgroup
подставить ту, которую вы задали для пользователей FTP-сервера.
-d
— указание домашнего каталога, данному пользователю он не нужен, посему указываем /dev/null
— указание командной оболочки, используемой данным пользователем. Пользователь сам входить в систему не должен (и не будет для пущей безопасности), посему отключим ему доступ к командной оболочке, указав в данном параметре
-s/bin/false
ftpuser
— имя пользователя, можете выбрать любое по зову сердца, почек и печени.
Если что-то сделано неверно, всегда можно удалить пользователя в системе командой userdel имя_пользователя,
а группу командой groupdel название_группы
. Сведения об этих командах являются общими для всех дистрибьютьвов Линукс, кроме специальных, посему не буду останавливаться на них подробнее.
Сам демон FTP-сервера, будучи довольно универсальным для любых Linux- и даже Windows-based операционных систем сделан по принципу максимальной переносимости, посему он не признает as is конфигурационных файлов или конфигурационных каталогов. Для удобства пользователей разработчики (или сборщики) пакетов предусмотрели, что демон будет запускаться не напрямую, а через инициализационный скрипт, различный для конкретной ОС или ее дистрибьютива. Поэтому, если вы пользуетесь инициализационным скриптом, то способ конфигурирования будет различен для, например, Debian/Ubuntu или Slackware. Вы всегда можете обойти эти ограничения, запустив демон напрямую, и передав ему конфигурацию в соответствующих параметрах командной строки. НО в данной заметке такой способ не рассматривается, для управления (запуска, проверки статуса, остановки) демона, используется поставляемый в пакете для Slackware инициализационный скрипт, анализирующий соответствующий конфигурационный файл, разбирающий его и передающий конфигурацию демону.
Скрипт запуска: /etc/rc.d/rc.pure-ftpd
Его параметры: /etc/rc.d/rc.pure-ftpd start
запуск FTP-сервера
/etc/rc.d/rc.pure-ftpd stop
остановка FTP-сервера
/etc/rc.d/rc.pure-ftpd restart
перезапуск FTP-сервера
Файл конфигурации: /etc/pure-ftpd/pure-ftpd.conf
Можно много чего отконфигурировать, подключить базы MySQL или Постгресс, устроить аутентификацию через LDAP, установить квоты, но всего этого я делать не буду, если кому надо — конфигурационные файлы замечательно откомментированы, а подробных мануалов в сети есть. Комментарии в оригинале на буржуйской мове, но там даже ребенок через гугль-транслейт переведет. Я буду делать, повторяюсь, домашний сервер с виртуальными FTP-пользователями.
В файле конфигурации, раскомментируя соответствующие строчки, или заменяя yes
на no
(или наоборот), настраиваем следующие параметры:
#Не позволять пользователю выходить за пределы домашнего каталога
ChrootEveryone yes
#Отключить режим совместимости с "неправильными клиентами". Мне такие не попадались.
BrokenClientsCompatibility no
#запускать в режиме демона
Daemonize yes
#подробный LOG, можно поставить в no, если все работает, а FTP сильно загаживает логи
VerboseLog yes
#Анонимы дома не нужны (установка в yes включает полностью анонимный доступ к FTP)
AnonymousOnly no
#Отключаем возможность соединяться анонимно
NoAnonymous yes
#ОБЯЗАТЕЛЬНО раскомментируем эту строчку, задаем путь к базе данных виртуальных пользователей (можно путь не задавать, оставив, как есть)
PureDB /etc/pure-ftpd/pureftpd.pdb
#Обязательно комментируем эту строчку (или ставим соответствующее значение в no)
# PAMAuthentication yes
# и эту тоже комментируем, нефиг FTP соваться в системный файл аутентификации - пусть сам рулит виртуальными пользователями, которые специально для FTP
# UnixAuthentication yes
#автоматическое создание домашней директории для пользователя (при первом заходе на сервер)
CreateHomeDir yes
#использовать только IPv4, вряд ли в домашней или сети мелкого офиса нужен IPv6
IPV4Only yes
Готовый конфиг можно скачать здесь . Или посмотреть на PasteBin
Делается это следующей командой:
pure-pw useradd miguel -u ftpuser -g ftpgroup -d /home/ftp/files
где:
useradd
— команда добавления виртуального пользователя
miguel
— имя виртуального пользователя, будет использоваться FTP-клиентом для подключения к FTP-серверу. Естественно, можно придумать свое.
-u ftpuser
— реальный linux-пользователь, под которым будет работать данный виртуальный (см. выше).
-g ftpgroup
— группа пользователей FTP-сервера (см. выше)
-d /home/ftp/files
— директория для создаваемого виртуального пользователя. Если параметр CreateHomeDir
в конфигурационном файле сервера не закомментирован и установлен в yes
, то директория будет создана автоматически при первом входе данного пользователя через FTP-клиент.
После выполнения команды будет предложено ввести пароль для виртуального пользователя.
Можно создать неограниченное количество виртуальных пользователей, работающих из под одного реального с разными каталогами. Если установлен в yes
параметр ChrootEveryone
, то виртуальные пользователи не смогут перейти в каталоги других виртуальных пользователей, соответственно, мы можем наделать персональных директорий в FTP хоть для каждого устройства/конкретного пользователя, меняя только имена, пароли и домашние каталоги.
Примечание: Когда нужно дать доступ к одному и тому же каталогу нескольким пользователям, то просто в команде создания пользователя, после параметра -d
указывается одинаковый путь.
ВАЖНО! После любых изменений (добавления, удаления, смены пароля, и т.д.) виртуальных пользователей, необходимо выполнить команду обновления/создания базы виртуальных пользователей:
pure-pw mkdb
Иногда полезно иметь пользователя, способного только читать что-либо с FTP-сервера, но не имеющего возможности на него что-нибудь писать. Представим себе такую гипотетическую ситуацию, есть Миша, который завел себе домашний FTP-сервер, на нем виртуального пользователя под именем
miguel
, но к нему домой приходит множество друзей с ноутбуками, планшетами и прочими устройствами. На FTP-сервере хранятся фотографии Миши, но он не хочет, чтобы друзья пририсовали ему усы на этих фото. Как же быть?
1. Предположим, что пользователь для чтения-записи (в нашем случае miguel
) уже создан, и он уже совершил вход и загрузку хотя бы одного файла через FTP-клиент, соответственно каталог создан, и права на него уже установлены в 755, иначе потом вручную придется переставлять права.
2. Создаем второго реального пользователя в группе ftpgroup
:
useradd -g ftpgroup -d /dev/null -s /etc ftpuserread
3. Создаем виртуального пользователя, имеющего права только на чтение общего каталога с пользователем ftpuser
(и соответственно, с виртуальным пользователем miguel
, работающим в реальной системе из под соответствующего реального пользователя):
pure-pw useradd friends -u ftpuserread -g ftpgroup -d /home/ftp/files
4. После изменения виртуальных пользователей не забудьте выполнить команду
pure-pw mkdb
В процессе создания пользователя friends
можно задать для него пустой пароль, тогда получится псевдо-анонимный доступ. Друзьям можно дать имя пользователя, и они на FTP-сервер смогут войти без пароля (введя в своих FTP-клиентах пустую строку), а враги, гады, ведьма-соседка и рептилоиды из SCP будут долго подбирать имя пользователя, или же гоняться за всей вашей компанией с паяльниками. 🙂
Для смены пароля используем следующую последовательность команд:
pure-pw passwd miquel
pure-pw mkdb
где:
pure-pw passwd miquel
— команда смены пароля, вместо miquel
необходимо подставить имя нужного виртуального пользователя FTP, пароль будет предложено вести, символы не отображаются.
pure-pw mkdb
— обновляем базу данных.
pure-pw list
— список виртуальных пользователей
pure-pw show username
— подробная информация о пользователе, вместо username подставить существующее имя виртуального пользователя
pure-pw userdel username
— удаление виртуального пользователя, вместо username подставить существующее имя виртуального пользователя
Краткую инструкцию по командам можно получить, запустив утилиту управления пользователями (pure-pw
) с ключом --help
После каждой операции с виртуальными пользователями не забываем выполнить команду обновления базы:
pure-pw mkdb
1. Установка и настройка Pure-FTPD (Pure FTP) [Копия в PDF]
2. Официальный мануал PureFTPd
3. Slackbook
4. Не помню.
Pingback: Домашний сервер на базе Slackware Linux | Персональный блог Толика Панкова