proftpd Debian - установка и настройка простого ftp-сервера

proftpd Debian - установка

FTP-серверов под Linux есть много. Перепробовал многие, в конце концов остановился на proftpd (хотя сначала он мне не шибко понравился, но в процессе работы с другими, стало ясно, что у всех есть плюсы и минусы). В том числе потому, что proftpd один из лучших, если нужно "просто фтп-сервер".

Установка proftpd (Debian)

Примечание: Далее описываемое подойдёт для любых версий Дебиан — Debian6 Sqeeze, Debian7 Whezee, Debian8 Jessie, а также построенным на Debian дистрибутивам, например, Ubuntu.

apt-get install proftpd

Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'proftpd-basic' instead of 'proftpd'
The following extra packages will be installed:
  libfile-copy-recursive-perl proftpd-basic update-inetd
Suggested packages:
  proftpd-doc proftpd-mod-mysql proftpd-mod-pgsql proftpd-mod-ldap proftpd-mod-odbc
  proftpd-mod-sqlite openbsd-inetd inet-superserver
The following NEW packages will be installed:
  libfile-copy-recursive-perl proftpd-basic update-inetd
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 2,445 kB of archives.
After this operation, 4,176 kB of additional disk space will be used.

Do you want to continue [Y/n]? y
Get:1 http://ftp.us.debian.org/debian/ squeeze/main libfile-copy-recursive-perl all 0.38-1 [20.6 kB]
Get:2 http://ftp.us.debian.org/debian/ squeeze/main update-inetd all 4.38+nmu1+squeeze1 [20.6 kB]
Get:3 http://ftp.us.debian.org/debian/ squeeze/main proftpd-basic amd64 1.3.3a-6squeeze4 [2,404 kB]
Fetched 2,445 kB in 5s (418 kB/s)
Preconfiguring packages ...
Selecting previously deselected package libfile-copy-recursive-perl.
(Reading database ... 26616 files and directories currently installed.)
Unpacking libfile-copy-recursive-perl (from .../libfile-copy-recursive-perl_0.38-1_all.deb) ...
Selecting previously deselected package update-inetd.
Unpacking update-inetd (from .../update-inetd_4.38+nmu1+squeeze1_all.deb) ...
Selecting previously deselected package proftpd-basic.
Unpacking proftpd-basic (from .../proftpd-basic_1.3.3a-6squeeze4_amd64.deb) ...
Processing triggers for man-db ...
Setting up libfile-copy-recursive-perl (0.38-1) ...
Setting up update-inetd (4.38+nmu1+squeeze1) ...
Setting up proftpd-basic (1.3.3a-6squeeze4) ...
grep: /etc/inetd.conf: No such file or directory
Warning: The home dir /var/run/proftpd you specified can't be accessed: No such file or directory
Adding system user `proftpd' (UID 104) ...
Adding new user `proftpd' (UID 104) with group `nogroup' ...
Not creating home directory `/var/run/proftpd'.

Adding system user `ftp' (UID 105) ...
Adding new user `ftp' (UID 105) with group `nogroup' ...
Creating home directory `/home/ftp' ...
`/usr/share/proftpd/templates/welcome.msg' -> `/home/ftp/welcome.msg.proftpd-new'
Starting ftp server: proftpd.
root@debian:/proftpd/install#

В процессе установки будет задан вопрос "Run proftpd: from inetd or standalone?" - выбираем последнее (standalone) - см.картинку.

proftpd conf-настройка

После установки открываем любым редактором конфигурационный файл, который обычно живёт по адресу /etc/proftpd/proftpd.conf и в самый его конец добавляем строчку (выделена жирным):

...
#   #            AllowAll
#   #            </Limit>
#   # </Directory>
#
# </Anonymous>

AuthUserFile    /etc/proftpd/ftpd.passwd

Также я обычно сразу же раскомментирую строчку:

# Use this to jail all users in their homes
DefaultRoot                   ~

# Users require a valid shell listed in /etc/shells to login.
# Use this directive to release that constrain.
# RequireValidShell             off

Строчка "DefaultRoot ~" нужна для того, чтобы FTP-пользователи не шастали по всему серверу (хоть они и не смогут скачать, но смогут увидеть каталоги-имена-файлов, что часто тоже недопустимо).

Сохраняем и выходим из редактора.

proftpd настройка пользователей

Чаще всего требуется настройка пользователей для возможности работы через FTP с каким-то сайтом, обычно живущим в подкаталоге /var/www/. Соответственно, закачанное по фтп должен "мочь" использовать и Apache. Простым решением будет тогда создание пользователя, который будет в группе апача и иметь уид самого фтп-сервера. Группа апача это обычно 33 (gid=33), а группа созданного ftp-юзера (ftp - имя в системе) можно было видеть при установке (см. выше), вот кусок лога из конца:

Adding system user `ftp' (UID 105) ...
Adding new user `ftp' (UID 105) with group `nogroup' ...
Creating home directory `/home/ftp' ...

Теперь у нас есть всё нужное, чтобы не "просто создать ftp-пользователя", который может что-то заливать-скачивать из домашней директории, а такого, который бы мог заливать своё на работающий сайт (домашняя директория - и есть конкретный сайт, его месторасположение).

Выполняем команду:

ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=siteadmin --shell=/bin/false --home=/var/www/linuxcmd.ru --uid=105 --gid=33

ftpasswd: using alternate file: /etc/proftpd/ftpd.passwd
ftpasswd: creating passwd entry for user myftp

ftpasswd: /bin/false is not among the valid system shells.  Use of
ftpasswd: "RequireValidShell off" may be required, and the PAM
ftpasswd: module configuration may need to be adjusted.

Password:
Re-type password:

ftpasswd: entry created
root@debian:/ftp/server#

Вводим-повторяем пароль и пользователь готов.

530 login incorrect и /bin/false

По умолчанию /bin/false отсутствует в /etc/shells дебияна - добавим (иначе профтпд будет колбасить):

530 Login Incorrect

Хотя всё (явки-пароли-доступы) в порядке. По этому поводу, собственно, он ругался в логах выше:

ftpasswd: /bin/false is not among the valid system shells.

Потому в файл /etc/shells дописываем строчку /bin/false:

# /etc/shells: valid login shells
/bin/csh
/bin/sh
/usr/bin/es
/usr/bin/ksh
/bin/ksh
/usr/bin/rc
/usr/bin/tcsh
/bin/tcsh
/usr/bin/esh
/bin/dash
/bin/bash
/bin/rbash

/bin/false

Теперь всё готово, перезагружаем proftpd (обязательно, иначе не пойдёт):

/etc/init.d/proftpd restart

Stopping ftp server: proftpd.
Starting ftp server: proftpd.
root@debian:/server/ftp#

Настройка доступа

Даём соответствующие права ранее упомянутыму ftp-пользователю (созданному при установке proftpd), добавляя его в группу www-data (то бишь Apache):

addgroup ftp www-data

Adding user `ftp' to group `www-data' ...
Adding user ftp to group www-data
Done.
root@debian:/ftp/install#

Всё, теперь пользователь siteadmin, подключаясь по фтп сможет напрямую "заливать на сайт". А если "до этого" там уже были файлы, то, чтобы они также были доступны нашему сайтадмину, просто выполним следующую команду:

chown -R ftp:www-data /var/www

...которую можно-нужно повторять, если после придётся заливать из-под других пользователей (например, рутом) информацию в папку сайта.

Если вам помогла или просто понравилась статья - плюсаните/поделитесь, пожалуйста.

Комментарии

Спасибо.

Сделал все как говорено, записал юзверя в пасс с уид и гид, указал директорию /var/www.

Слово в слово в общем, фтп клиент соединяется, но возврат директории файлится, но тем не менее соединение держит.

Прав 0, ничего не кажет и не может... Понять куда цепляется не могу, я 2 дня отроду, помогите, если не сложно.

  • Проверьте, что UID-ы для ftp в файлах /etc/proftpd/ftpd.passwd и /etc/passwd совпадают.
  • Проверьте, что для /var/www владелец/группа это ftp:www-data (или просто сразу сделайте chown -R ftp:www-data /var/www).

Хотя, конечно, это просто перечисления того, что нужно было сделать изначально. Если такое не помогает, значит какая-то мелочь либо что-то "совсем не так". Посмотрите внимательней, поищите банальные очепятки. Как хороший вариант - сделайте ещё одного юзера, ещё одну папку (например, /var/www/testuser) и проверьте с ними.

Попробуйте просто скопипастить написанное, чтобы избежать ошибок. Если так и не получится - скиньте конфиги, что меняли, сделайте ls -l для /var/www:

root@debian6:/var/www# ls -l
total 20
drwxrwxrwx 3 ftp www-data  4096 Jan  5 11:48 linuxcmd.ru
drwx------ 2 ftp www-data 16384 May  3 03:17 lost+found
root@debian6:/var/www#

Сделал все по описанию, два раза допустил ошибку в создании пользователя - в первый раз ввел ftppasswd, вместо ftpasswd, во второй раз забыл поставить / после etc в строчке "file=/etc/proftpd/ftpd.passwd".

В итоге не заходит под логином siteadmin по ftp. В /etc/passwd следующее:

ftp:x:121:65534::/srv/ftp:/bin/false

В /etc/proftpd/proftpd.passwd:

siteadmin:(куча символов).:105:33::/var/www/linuxcmd.ru:/bin/false

Так, что-то много путаницы в вашем посте. По-порядку.

В /etc/proftpd/proftpd.passwd:

Во-первых, видимо вы имели в виду /etc/proftpd/ftpd.passwd: (без pro), т.к. именно это у вас выше прописано в конфиге:

в строчке "file=/etc/proftpd/ftpd.passwd".

Во-вторых, если у вас:

ftp:x:121:65534::/srv/ftp:/bin/false

То именно это значение (121) и должно использоваться при создании пользователя, потому строчку в ftpd.passwd нужно подправить до вида:

siteadmin:(куча символов).:121:33::/var/www/linuxcmd.ru:/bin/false

В-третьих, надеюсь, вместо linuxcmd.ru (это у меня так - чисто пример с моего сервера) у вас нужная директория (вашего сервера).

В конфиге /etc/proftpd.conf (если при установке выбрал inetd) укажи:

ServerType         standalone

(вместо inetd)

И перезапусти sudo /etc/init.d/proftpd restart

Не совсем ясно, к чему этот коммент, но видимо речь о проблемах, что таки да, можно промахнуться и выбрать inetd-вариант при установке proftpd.

Спасибо, все понятно описано, заработало сразу. )

Создал пользователя:

ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=gena --shell=/bin/false --home=/home/gena/ --uid=105 --gid=33

Всё работает, но не пишет файлы.

Проверьте, что пользователь ftp в файле /etc/password равен 105 (для вашего примера) и что файлы, которые вы хотите прочитать имеют группу ftp:www-data. Или просто ещё раз запустите команду chown -R ftp:www-data /var/www (где вместо /var/www может быть место ваших файлов на диске).

А возможно ли сделать так, чтобы у одного пользователя были различные пароли на FTP и SSH?

Описанный выше способ настройки proftpd для Debian (и других "debian-based" систем, например, Ubuntu) "не связан с SSH", пользователи "не системные", а чисто "профтпд-шные", сохранённые в его файле ftpd.passwd (использование которого мы и задаём строчкой в конфиге "AuthUserFile /etc/proftpd/ftpd.passwd" - брать логин-пароль юзеров из данного файла). Потому в приведенном способе логины-пароли "ssh-ных" юзеров - будут свои, а фтп-шных - свои.

Я всё вроде бы сделал правильно, но через filezilla не подключается, пишет:

Статус: Соединяюсь с 188.120.251.235:21...
Статус: Соединение установлено, ожидание приглашения...
Ответ: 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
Ответ: 220-You are user number 1 of 50 allowed.
Ответ: 220-Local time is now 09:41. Server port: 21.
Ответ: 220-This is a private system - No anonymous login
Ответ: 220-IPv6 connections are also welcome on this server.
Ответ: 220 You will be disconnected after 15 minutes of inactivity.
Команда: USER admin
Ответ: 331 User admin OK. Password required
Команда: PASS ******
Ответ: 530 Login authentication failed
Ошибка: Критическая ошибка
Ошибка: Невозможно подключиться к серверу

Доброго времени суток!

Спасибо за статью, все установилось без проблем, но у меня тоже не пишет файлы в директорию siteadmin-a , когда пробую залить сайт через filezila. ниже листинг ошибки, нет прав:

Соединяюсь с 192.168.1.157:21...
Статус:    Соединение установлено, ожидание приглашения...
Ответ:    220 ProFTPD 1.3.4a Server (Debian) [::ffff:192.168.1.157]
Команда:    USER siteadmin
Ответ:    331 Password required for siteadmin
Команда:    PASS ******************
Ответ:    230 User siteadmin logged in
Команда:    OPTS UTF8 ON
Ответ:    200 UTF8 set to on
Статус:    Соединение установлено
Статус:    Начинаю закачивать D:\wamp\www\index.php
Команда:    CWD /var/www/barnoma
Ответ:    250 CWD command successful
Команда:    TYPE A
Ответ:    200 Type set to A
Команда:    PASV
Ответ:    227 Entering Passive Mode (192,168,1,157,210,251).
Команда:    STOR index.php
Ответ:    550 index.php: Permission denied
Ошибка:    Критическая ошибка при передаче файлов

Проверьте права на каталог /var/www/barnoma - должен быть пользователь ftp. Или, если делали по рекомендациям статьи - www-data:ftp. Или просто выполните:

chown -R ftp:www-data /var/www/barnoma

Почему-то нет /etc/shells, как быть?

debian-6.0-i386-minimal

chown -R ftp:www-data /var/www

Лучше сделать так:

1. Поставить acl:

  • aptitude install acl

2. В /etc/fstab добавить запись acl:

  • /dev/sdb1 /mnt/data     xfs     defaults,acl 1 1

3. Сделать mount -o remount /dev/sdb1

Добавить к каталогу права через setfacl,  например, так:

  • setfacl -R -m "u:proftpd:rwx" /mnt/data/userdir
  • setfacl -R -m "g:www-data:rwx" /mnt/data/userdir

Всё, польуземся. :-)

Спасибо за статью!!!

Сначала ставил VSFTPD - ничего с ним не получилось, а потом нашел эту статью и все получилось ПОЧТИ сразу. Почему "почти"? Да потому, что сайт у меня был в другой папке ( /home/название_сервера/домен.ру/ ). :))

 

Сделал все по инструкции, но при подключении пишет не верный логин / пароль. Ubuntu 14.04

То, что надо!

Спасибо, всё по делу и аккуратно написано. Сразу понятно и работает.

С уважением,
Олег Смолий

Здравствуйте.Всё работает спасибо.Только вот приходится через консоль менять права на папку(www) иначе ftp не чего не записывает и не стирает. Даже через ftp невозможно поменять права на файлы или папки в директории(www).Но держать права на папку(www) для ftp 777 опасно.Как быть?

Чуть выше i2ks дал отличный совет на счёт использования ACL и я теперь делаю также, потому вскоре обновлю статью по этому поводу. Не всегда работает на ура, к сожалению, как оказалось, но, в принципе - очень удобно.

Здравствуйте, подскажите, пожалуйста, всё сделал по инструкции, но редактировать файлы нельзя — как поправить? Как удалить/переустановить proftpd, удалить не только пакет, но и конфиги?

Зачем создавать пользователя с uid ftp, если можно дать ему uid www-data? При этом не нужно ручками править владельца директории на ftp (апач создает директории для вирт. хостов от имени www-data) и не нужно давать домашней директории права 775 по той же причине.

Здравствуйте, подскажите как удалить пользователя? Создавал пользователя test

ftpasswd --passwd --file=/etc/proftpd/ftpd.passwd --name=test --shell=/bin/false --home=/var/www --uid=105 --gid=33

# userdel -r test
userdel: user 'test' does not exist (такого пользователя не существует)

Вы пытаетесь удалить "реального" пользователя (который есть в ОС - со своей home-directory и т.д.), в то время как плюс вышеизложенного варианта настройки FTP-сервера как раз в том, что он предусматривает "виртуальных" пользователей, которые создаются с помощью ftpasswd (что есть чисто скрипт) и помещаются в файл /etc/proftpd/ftpd.passwd (что и видно из командной строки).

Соответственно для удаления нужно просто отредактировать файл /etc/proftpd/ftpd.passwd, удалив ненужные строчки с пользователем.

  • nano /etc/proftpd/ftpd.passwd

ftpadmin:$1$kGQHG4Ud$..Rjhj1risBEVMGbs2ekq0:110:110::/var/www/html:/bin/false
linuxcmd:$1$Z1SCfHfn$csqJRT.TrxHGne2e76LId1:110:33::/home/admin/www/linuxcmd.ru/public_html:/bin/false
test:$1$j3Me51Ks$5Xl/bu4aO28Wg5s4u1XeR0:110:33::/var/www/test.com/public_htm:/bin/false
fsftp:$1$t9yfNwJU$pIbWBdE0asWbs/4pXwViQ.:33:33::/usr/local/freeswitch/scripts:/bin/false

 

п.с. Добавлю, что "плюс" виртуальных пользователей в том, что для "реальных" враги могут после получить доступ через SSH, в то время как при такой схеме Proftpd запускает фтп-юзера под "реальным" пользователем, но используя логин-пароль из файла ftpd.passwd.

Здравствуйте. Нужна помощь, не могу понять почему после установки ProFTPD (при вводе любой команды с ftpasswd)
Выбивает ошибку: -bash: ftpasswd: command not found
Как решить данную проблему и как узнать в чем она?

Видимо у вас не Debian. Набросал министатейку для ответа на вопрос про "ошибку ftpasswd: command not found", т.к. ответ не очевиден, хотя решение проблемы ftpasswd простое.

Добавить комментарий