Публикация: | Изменение: | Просмотров: 12263

Установка FTP-сервера ProFTPd на Debian/Ubuntu Сегодня я хочу немного рассказать про установку FTP-сервера ProFTPd на Debian/Ubuntu, а точнее полностью процесс установки и настройки. Несмотря на то, что стандарт протокол FTP давно устарел и не очень рекомендуется рекомендуется для использованию в сетях со средним уровнем безопасности, его всё равно юзают многие в особенности на веб-серверах. Ведь так сложно иногда избавиться от архаизмов. Но даже с ним у многих по началу бывают проблемы, хотя есть много различных пакетов упрощающих работу с ним. Не все эти пакеты гибкие, но зато очень просты в использовании. Но сегодня пойдет речь о ProFTPd, который мы будем ставить на Linux Debian. Он не самый простой в использовании, но зато очень гибкий и функциональный, что лично мне очень нравиться, потому обычно я всем рекомендую именно этот пакет. Ну что, приступим к установке и настройке.

Установка ProFTPd

Для того чтобы инсталлировать этот пакет к себе в операционку достаточно в терминале выполнить следующую команду:

1
apt-get install proftpd

Во время установки выскочит синий экран (но не смерти) с предложением двух различных вариантов установки:

  • From inetd — демон ProFTPd будет работать из-под службы inetd.
  • Standalone — ProFTPd будет установлен как самостоятельный демон.

Рекомендую выбрать вариант Standalone, т.к. гораздо удобней работать с ProFTPd, как с отдельной службой.

После установки пакета сразу будет запущен демон proftpd и уже можно подключаться. А для того чтобы проверить работоспособность наберите следующую команду команды:

1
sftp 127.0.0.1

Если демон работает, то произойдет подключение и у вас потребуют имя пользователя под которым инициализировать коннект. Можете ввести любого созданного пользователя у вас в системе. Потом попросят ввести пароль этого пользователя. Если были введены корректные данные, то вы получите доступ к командной строке FTP, где можете выполнять определенные команды. Но всё что нам нужно было это попасть в эту строку, чтобы убедиться в работоспособности демона. Потому набираем команду exit и выходим.

Добавление пользователя ProFTPd

Как уже говорилось ранее, ProFTPd использует учетные записи пользователей самого сервера. Т.е. все пользователи, в принципе, могут иметь доступ по FTP. И например, для добавления пользователя для FTP необходимо просто создать его на самом сервере как обычного пользователя системы. Но при обычно создании у пользователя будет доступ не только по FTP, но по SSH протоколу. Это не всегда подходит под наши задачи, иногда нужно запретить пользователю коннектиться по SSH. Это очень просто, необходимо в качестве командной среды указать /bin/false, что запретит коннект по SSH, но не по FTP. Это можно сделать сразу при создании пользователя в терминале:

1
adduser username --shell /bin/false

Данная команда создаст пользователя с логином username домашней директорией /home/username и доступом по FTP, но ему будет запрещено подключение по SSH.

В том случаи если вам нужно изменить командную среду у уже созданного пользователя, то вам нужно открыть для редактирования файл /etc/passwd, который является обычным текстовым файлом и содержит настройки для каждого пользователя:

1
nano /etc/passwd

Вам выскочит список со всеми пользователями, где каждая строка это один пользователь и в конце строки указанна командная среда. Обычно там /bin/bash, который просто нужно поменять на /bin/false, чтобы запретить пользователю подключаться по SSH. Кстати, перед командной средой стоит дефолтовая домашняя директория для пользователя, которую тоже можно сменить. Поле всех изменений нужно просто выйти из файла и сохранить изменения.

Настройка ProFTPd

Теперь осталось сконфигурировать установленный демон ProFTPd и будет вам счастье. Вообще, ProFTPd сразу после установки готов к использованию пользователям данной операционной системы (как опять же говорилось уже не единожды выше). При коннекте будут запрошены логин и пароль (как выше) пользователя и после успешной авторизации пользователь попадет в свою корневую домашнюю директорию вида /home/username, где username — логин пользователя. Но на самом деле этому пользователю будет доступна вся файловая система машины, т.е. он сможет пойти по иерархии каталогов выше, чем своя домашняя директория, что не есть хорошо и является небезопасной практикой, особенное, если у сервера не один единственный админ.

Давайте же сконфигурируем демона так, чтобы обезопасить наш сервер. Для этого откроем конфигурационный файл ProFTPd /etc/proftpd/proftpd.conf:

1
nano /etc/proftpd/proftpd.conf

И с помощью сочетания клавиш Ctrl-W будем искать ниже приведенные опции и изменять их или просто контролировать:

  • UseIPv6 — включить ли поддержку IPv6 или оставить только IPv4. Я рекомендую включить поддержку, а то малоли что — хуже не будет.
  • ServerName — имя сервера, которое будет отображаться при коннекте с помощью ProFTPd. Установите для красоты, хотя в дальнейшем, когда у вас будет много серверов это может носить и полезный характер.
  • DefaultRoot — опция, которая устанавливает домашнюю директорию пользователя выше, которой он не сможет подняться. Подробней об этой возможности пойдет речь ниже, так что пока особо не парьтесь.
  • RequireValidShell — опция запрета коннекта для пользователей, у которых не указана рабочая командная среда, т.е. пользователи с /bin/false не будут иметь доступ через FTP. Думаю эта опция нужна только в особенных случая, но на всякий случай я вам о ней сказал.
  • Port — стандартный порт подключения, который будет слушать ProFTPd. Для повышения безопасности рекомендую его изменить.
  • MaxInstances — максимальное количество одновременных подключений. Будьте внимательны, это именно количество одновременных соединений, а не пользователей, т.е. для каждого пользователя может быть по несколько соединений. Установите ту цифру, которую считает оправданной в вашем случаи, например, если вы единственный администратор сервера, то думаю 5 коннектов вам хватит за глаза.
  • Umask — маска создаваемых пользователем файлов. Т.е. в зависимости от маски создаваемым файлам и папкам будут присвоены определенные права доступа. По-умолчанию стоит маска 022, что значит что директории будут создаваться с chmod 755, а файлы — 644, что разрешает полный доступ только для пользователя FTP, который создал файлы, а остальные смогут только открывать на чтение.
  • AllowOverwrite — опция разрешающая перезапись файлов, т.е. в том случаи если опция в off, то пользователь не сможет заменить одноименный файл. Рекомендую установить в on, чтобы иметь возможность перезаписи, если ваша задача не требует иного.

Это основные опции для настройки демона, которые позволят немного обезопасить ваш сервер и сделать его использование более гибким. Хотя это далеко не все опции, их там гораздо больше, но на мой взгляд, это самые необходимые. Если вам интересно, то вы можете почитать официальную документацию этой утилитки и узнать побольше интересностей о настройках.

Кстати, для того чтобы любые изменения вступили в силу необходимо перезапустить демон proftpd:

1
/etc/init.d/proftpd restart

Запрещаем подниматься выше домашней директории

В этом нам поможет стандартная утилитка Unix-систем chroot. В общем-то, с помощью неё можно установить домашнюю директорию пользователю, вышей которой он уже не сможет подняться, что порой и требуется сделать на серверах, где обитают множество пользователей. Но напрямую с этой утилиткой нам работать не надо, за это отвечает опция DefaultRoot, описанная мной выше. Ниже я покажу два различных варианта ограничения пользователей FTP с помощью DefaultRoot:

  • Для всех пользователей FTP создана одна папка, к которой они могут иметь доступ. Для этого создадим такую папку, например, /var/ftp и установим опцию следующим образом:
    1
    DefaultRoot /var/ftp
  • Другой вариант использования этой опции это если все пользователи будет попадать только в свою домашнюю директорию, чего обычно бывает достаточно для мелких задач. В этом случаи опция будет выглядеть так:
    1
    DefaultRoot ~

В большинстве случаях этого будет достаточно, но иногда бывают задачи, которые не решить данным подходом. Давайте рассмотрим такие задачи отдельно.

Chroot для одного пользователя

Иногда необходимо сделать так, чтобы все пользователи сервера работали по заданному сценарию, все кроме одного (или двух, трех…). Например, так может случиться, если сервер имеет одного веб-мастера, который отвечает за изменение файлов сайта и больше ему ничего показывать не надо. Понятно дело, что в то время как все остальные пользователи могут быть за’chroot’ены в свои домашние директории, для веб-мастера своя домашняя директория никак не подойдет, потому что вряд ли именно там находятся файлы сайта. Давайте же уже созданного пользователя (webmaster) за’chroot’им его в папке с файлами сайта (/var/www). Для этого добавим его, для начала, в группу www-data, в которой по-умолчанию работает сервер Apache и запретим коннект по SSH:

1
addgroup webmaster --ingroup www-data --shell /etc/false

Теперь в конфигурационный файл /etc/proftpd/proftpd.conf добавим следующий блок:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Anonymous /var/www>
    User webmaster # имя пользователя и группа, под которыми будет происходить работа данной сессии
    Group www-data

    RequireValidShell off # позволяем логинить пользователя без командной строки
    AnonRequirePassword on # запрещаем вход анонимам, которые не знают пароля

    <Directory /var/www> # описание директории доступа и ограничений
        AllowOverwrite on
        <Limit ALL>
            AllowALL on
        </Limit>
    </Directory>
</Anonymous>

В комментариях блока я описал основные параметры, так что вопросов не должно особо возникнуть. Теперь перезагружаем демон и всё готово. Теперь пользователь webmaster после авторизации будет попадать сразу в директорию /var/www, выше которой он подняться не сможет. В то время как остальные пользователи будут работать по другому основному сценарию, например, будут chroot’иться в свои домашние директории.

Виртуальный хост

Бывает необходимо на одной физической машине поднять несколько виртуальных FTP-серверов со своими настройками каждый. Например машина может иметь несколько IP-адресов, каждый из которых указывают на неё. С помощью ProFTPd можно на каждый IP поднять отдельный FTP-сервер со своими пользователями, т.е. пользователям будет казаться что это два разных сервера и две разные машины, а на самом деле это будет все на одно физическом сервере.

Делается это с помощью следующих настроек в  конфигурационном файле:

1
2
3
<VirtualHost 123.45.67.89>
    # конкретные настройки сервера
</VirtualHost>

Соответственно внутри блока пишутся конкретные настройки для сервера, как и в обычном случаи.

Но это не единственный вариант, также разделять виртуальные сервера можно и по портам. Если указать в настройках виртуальных серверов с одни IP-адресом различные порты, то они будут разными хостами со своими уникальными настройками:

1
2
3
4
5
6
7
8
9
<VirtualHost 123.45.67.89>
    Port 7895
    # остальные настройки сервера
</VirtualHost>

<VirtualHost 123.45.67.89>
    Port 5678
    # остальные настройки сервера
</VirtualHost>

В этом случаи пользователи смогут подключаться по одному и тому же IP адресу, но к разным портам, что позволит на одном физическом сервер поднять разные FTP-сервера.

Возможная проблема

При запуске (перезапуске) proftpd может выскачать следующая ошибка

1
2
3
4
5
6
$ /etc/init.d/proftpd restart
Stopping ftp server: proftpd.
Starting ftp server: proftpd - warning: unable to determine IP address of 'blah-blah.xen.vps.blah.ru'
 - error: no valid servers configured
 - Fatal: error processing configuration file '/etc/proftpd/proftpd.conf'
 failed!

Это означает, что скорее всего у вас не в файлах /etc/hosts и /etc/hostname есть небольшие расхождения в именовании сервера. Необходимо чтобы имя сервера написанное в /etc/hosts было точно таким же как в /etc/hostname (притом /etc/hostname как бы первоисточник). Например:

1
2
3
4
5
# /etc/hostname
blah-blah.xen.vps.blah.ru

# /etc/hosts
127.0.0.1 blah-blah.xen.vps.blah.ru

Не допускайте расхождений!

Думаю этого вам хватит для любой настройки FTP-севера под свои задачи. А на этому у меня всё. Если у кого возникли какие вопросы, пожелания или замечания, то прошу в комментарии. Всем удачного администрирования!

Похожие статьи

Понравился пост? подпишись на RSS

Комментарии 15 комментариев

http://www.youtube.com/watch?v=pIauzX8OM70
тут более наглядно !

Правильнее будет так
неправильно addgroup webmaster --ingroup www-data --shell /etc/false
правильно adduser webmaster --ingroup www-data --shell /bin/false

Спасибо большое за данную статью, получилось все настроить с 1 раза!

Добрый день!
Сделал все как написано, устанавливал на вируальную машину virtualbox.
Все заработало, но только локально (в вируалке когда заходишь на ftp://localhost, либо по IP с локальной машины).
А вот если попробовать через интернет зайти ftp://имя_сайта.ru запрашивает логин и пароль, а дальше ничего. Проброс 21 порта сделан на роутере и в виндовсе настроен.
Сам сайт по имени открывается, аналогично настроен проброс порта 80.
Но и логин пароль ftp запрашивает, а дальше тишина.
Подскажите в чем может быть беда.
Спасибо!

Так так. Ну то что браузер запрашивает логин и пароль это нормально. Есть режим работы нормальный (логин и пароль), а есть анонимный. По умолчанию анонимный режим отключен. Для включения этого режима в файл proftpd.conf нужно раскомментировать и настроить секцию Anonimous.

Или я чего-то не до конца понял?

У меня раскоментированна эта секция, и вот что там:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Anonymous /home/"имя_моего_пользователя"/www>
    User "имя_моего_пользователя" # имя пользователя и группа, под которыми будет происходить работа данной сессии
    Group www-data

    RequireValidShell off # позволяем логинить пользователя без командной строки
    AnonRequirePassword on # запрещаем вход анонимам, которые не знают пароля

    <Directory /home/"имя_моего_пользователя"/www> # описание директории доступа и ограничений
        AllowOverwrite on
        <Limit ALL>
            AllowALL on
        </Limit>
    </Directory>
</Anonymous>

Так вот, мне не понятно почему локально (на виртуальном сервере) через браузер по ftp://localhost, так же запрашивает логин пароль и входит, и с локальной машины по ftp://192.168.137.3 (IP виртуалки) тоже логинится и показывает содержимое.
А вот по внешнему ftp://внешний_статический_IP или по имени домена ftp://mysite.ru только запрос учетных данных и тишина.

WinSCP пишет вот что при подключении через него:

1
2
3
4
Timeout detected.
Could not retrieve directory listing
Entering Passive Mode (111,222,88,111,211,65)
Error listing directory '/'.

что-то он на "direktory listing" подвисает, и пишет ошибку.
В Entering Passive Mode первые 4 числа мой IP (я его тут изменил =) ), а последние два постоянно меняются.

Ого, сегодня написал ответ.
От тут появился и теперь куда-то пропал.

Прошу прощения, браузер заглючил.

Все замутил. Заработало.
Все-таки как я и думал что проблема между интернетом и виртуалкой, т.е. в локальном компе.
В сетевых подключениях, в свойствах интернет подключения на вкладке доступ, нажимаем кнопку настройка и там ставим галку FTP-сервер, и вводим IP-адрес сервера ftp. И все заработало!!!
Спасибо за уделенное внимание!

О! Отлично! С виртуалками всегда так. Надо где-то галку поставить чтобы она с внешним миром общаться начала. А ответ не сразу появился потому что ушёл на модерацию поскольку там были "ссылки" =)

Как настроить на одну директорию несколько пользователей, если я для троих пользователей указываю одну и ту же папку, например

1
<Anonymous /var/www>

. то ftp валится, и никто не может подключиться

Если я ничего не путаю, то это можно сделать указав троим пользователям одну и ту же домашнюю директорию в /etc/passwd или при создании пользователя. И конечно же всех зачрутить DefaultRoot ~

в Anonymous /var/www указывается папка, выше которой пользователь не сможет выйти, если я укажу домашнюю папку, то он свободно сможет передвигаться по серверу, так как при создании юзера я создал ему домашнюю папку в home

по сравнению с Vsftpd который написан рукожопами ,профтп и вправду ангельское творение.
Спасибо за статью.

Здравствуйте, хорошая статья спасибо! Подскажите пж как администратору дать полные права
DefaultRoot ~ - активна.