Debian.pro

Блог для пользователей и администраторов Debian


Debian, ftpd, vtpd, vsftpd. Very fast way.

Извиняюсь, что давно ничего не писал. Работа и эксперименты с виртуализацией отнимают очень много времени. Пока что ничего нового и особенного не откопал, лишь сделал некоторые выводы, которые напишу в финальной статье про KVM.
А сейчас, пожалуй, напишу как быстро настроить FTP сервер на Debian/Ubuntu. Способ действительно быстрый и не требует особого ковыряния в конфигах и базах.
За основу, как можно догадаться из заголовка, я беру vsftpd. Почему? Ну во-первых его название расшифровывается как very secure ftp daemon. Во-вторых именно его можно установить и настроить максимально быстро.
Что мы получим в итоге:
1) авторизоваться нужно (можно) будет по системным пользователям. То есть список пользователей и их домашние директории будут браться из /etc/passwd. Root в параде не участвует.
2) пользователи не могут выйти выше домашнего каталога в структуре ФС. То есть мы организуем ftp-chroot. Редки случаи, когда он помешает конечным пользователям, а вот безопасность он повышает ощутимо. Рут же может пользоваться sshfs, чтобы работать со всей ФС сразу.
3) Анонимы отключены. В принципе включаются 3мя строчками в конфиге, но в рамках данной статьи они не требуются.
Итак. Проверяем, что у нас не установлено никаких ftpd, если установлены — удаляем. Они нам не понадобятся.
Путь для ленивых:

root@Debian:~# aptitude install vsftpd && wget https://debian.pro/files/anlamp/configs/vsftpd.conf -O /etc/vsftpd.conf && /etc/init.d/vsftpd restart

Путь для пытливых:
Установим vsftpd:

root@Debian:~# aptitude install vsftpd

Скопируем стандартный конфиг на всякий случай (необязательно):

root@Debian:~# cp /etc/vsftpd.conf /etc/vsftpd.conf.default

Почистим стандартный конфиг от флуда разработчиков =) (вообще там интересно, советую почитать как-нибудь. )

root@Debian:~# echo > /etc/vsftpd.conf

И начнём писать новый. Собственно, чтобы следовать заголовку «Very fast way», предлагаю взять мой готовый конфиг.
Открываем /etc/vsftpd.conf нашим любимым редактором, например:

root@Debian:~# nano /etc/vsftpd.conf

и вставим в файл следующее:

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
#ascii_upload_enable=YES
#ascii_download_enable=YES
ftpd_banner=Welcome to debian.pro ftpd!
#banned_email_file=/etc/vsftpd.banned_emails
chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd.chroot_list
ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

В файл /etc/vsftpd.chroot_list мы можем записать пользователей, на которых не распространяется правило chroot. Для того, чтобы эта функция заработала — расскоментируйте строку #chroot_list_file=/etc/vsftpd.chroot_list в vsftpd.conf. Ну и не забудьте создать сам файл:

root@Debian:~# touch /etc/vsftpd.chroot_list

Перезагрузим vsftpd:

root@Debian:~# /etc/init.d/vsftpd restart

Ну и проверим наш ftpd. Много флуда, дальше читать совсем не обязательно) статья, собственно, закончена:
Попробуем зайти под анонимом:

user@desktop:~$ ftp localhost
Connected to localhost.
220 Welcome to debian.pro ftpd!
Name (localhost:inky): anonymous
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

Попробуем зайти под локальным пользователем, немного погулять по хомяку и попробовать выйти из chroot:

user@desktop:~$ ftp localhost
Connected to localhost.
220 Welcome to debian.pro ftpd!
Name (localhost:inky): inky
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rwxrwxrwx 1 1001 1001 316 Feb 26 17:27 diff.sh
-rwxr-xr-x 1 1001 1001 2281 Feb 26 22:35 diff2.sh
-rw-r--r-- 1 1001 1001 1185 Feb 26 20:26 diff2.sh?
-rw-r--r-- 1 1001 1001 357 Feb 07 14:47 examples.desktop
drwxr-xr-x 5 1001 1001 4096 Feb 23 05:06 iMacros
-rwxr-xr-x 1 1001 1001 57 Jun 09 15:53 script100
drwxr-xr-x 3 1001 1001 4096 Jul 25 13:10 scripts
-rw-r--r-- 1 0 0 30888 Dec 13 2006 thunder.au
-rw-r--r-- 1 1001 1001 22626 Feb 26 20:19 thunder2
-rw-r--r-- 1 1001 1001 1642496 Feb 26 20:11 thunder2.au
drwxr-xr-x 2 1001 1001 4096 Feb 26 17:27 tmp
-rwxr-xr-x 1 1001 1001 7422 Jun 09 15:43 urgent
226 Directory send OK.
ftp> cd iMacros
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
drwxr-xr-x 2 1001 1001 4096 Feb 22 01:43 Datasources
drwxr-xr-x 5 1001 1001 4096 Apr 11 16:41 Downloads
drwxr-xr-x 2 1001 1001 4096 Feb 22 01:46 Macros
-rwxr-xr-x 1 1001 1001 188 Feb 27 00:19 iMacros.log
226 Directory send OK.
ftp> cd ../
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rwxrwxrwx 1 1001 1001 316 Feb 26 17:27 diff.sh
-rwxr-xr-x 1 1001 1001 2281 Feb 26 22:35 diff2.sh
-rw-r--r-- 1 1001 1001 1185 Feb 26 20:26 diff2.sh?
-rw-r--r-- 1 1001 1001 357 Feb 07 14:47 examples.desktop
drwxr-xr-x 5 1001 1001 4096 Feb 23 05:06 iMacros
-rwxr-xr-x 1 1001 1001 57 Jun 09 15:53 script100
drwxr-xr-x 3 1001 1001 4096 Jul 25 13:10 scripts
-rw-r--r-- 1 0 0 30888 Dec 13 2006 thunder.au
-rw-r--r-- 1 1001 1001 22626 Feb 26 20:19 thunder2
-rw-r--r-- 1 1001 1001 1642496 Feb 26 20:11 thunder2.au
drwxr-xr-x 2 1001 1001 4096 Feb 26 17:27 tmp
-rwxr-xr-x 1 1001 1001 7422 Jun 09 15:43 urgent
226 Directory send OK.
ftp> cd ../
250 Directory successfully changed.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rwxrwxrwx 1 1001 1001 316 Feb 26 17:27 diff.sh
-rwxr-xr-x 1 1001 1001 2281 Feb 26 22:35 diff2.sh
-rw-r--r-- 1 1001 1001 1185 Feb 26 20:26 diff2.sh?
-rw-r--r-- 1 1001 1001 357 Feb 07 14:47 examples.desktop
drwxr-xr-x 5 1001 1001 4096 Feb 23 05:06 iMacros
-rwxr-xr-x 1 1001 1001 57 Jun 09 15:53 script100
drwxr-xr-x 3 1001 1001 4096 Jul 25 13:10 scripts
-rw-r--r-- 1 0 0 30888 Dec 13 2006 thunder.au
-rw-r--r-- 1 1001 1001 22626 Feb 26 20:19 thunder2
-rw-r--r-- 1 1001 1001 1642496 Feb 26 20:11 thunder2.au
drwxr-xr-x 2 1001 1001 4096 Feb 26 17:27 tmp
-rwxr-xr-x 1 1001 1001 7422 Jun 09 15:43 urgent
226 Directory send OK.

И попробуем зайти под рутом:

user@desktop:~$ ftp localhost
Connected to localhost.
220 Welcome to debian.pro ftpd!
Name (localhost:inky): root
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

Всё работает. Спасибо за внимание, удачного использования =)


Комментарии (24):

  1. san4o :

    спасибо, все кратко и понятно. Удобно что список пользователей из /etc/passwd.
    Такой вопрос, а как с извечной проблемой с кодировками, коректно ли отображаяются имена файлов на русском языке в пользователей виндовс (windows-1251) и если все таки придется немного пошаминать то не помешает ли это пользователям с ОС линукс (как это бывает с Proftpd)

  2. от фтп демона кодировка мало зависит) от фс скорее

    если честно — винду я в руки (а тем более чтобы она ещё и в сеть вышла) — года 2-3 не беру… так что и проверить негде.

  3. cru5ade :

    Добрый день. поставил и настроил по вашей инструкции. с локалки все подключает и работает. а с внешки не никак (( типа подключается а потом вылетает с ошибкой

    Ошибка: Превышено время ожидания соединения
    Ошибка: Не могу получить список каталогов!

  4. Поясните разницу между «внешкой» и «локалкой» в вашем случае. Скорее всего, шлюз режет соединения по портам 1024+.

  5. cru5ade :

    хмм, получается надо открыть порты в iptables?
    и какое правило и прописать?

    локалка это 192,168,150,x
    внешка (уже проверяю из дома) 92,x.x.x

    Еще смущает один момент сервер не могу перезагрузить потому как он в работе все время, а вылючить iptables тоже не получается (( недавн она дебиан пересел, до этого центос настраивал, там проще отключался iptables

  6. iptables -F же. А после ребута из конфига всё поднимется.

    Я не спрашивал IP, я не настолько тупой. Как подключена внешка? VPN, шлюз, проброшенные порты с роутера? Ещё один из миллона вариантов?

  7. cru5ade :

    извините я не хотел вас обидеть. просто хотел сказать что комп имеет статический адрес выданный местным провайдером.инет идет через шлюз провайдеровский. после команды iptables -F сервак заглох. придется ждать до понедельника ((

  8. Да ничего, стиль у меня такой вопросов — заставляет людей задуматься )

    Поднимите — пишите в жаббер, будем разбираться что к чему. Как обычно, welcome после 22 00 по мск.

  9. Здесь http://www.artcom-ufa.ru/?posts/2011/05/19/ustanovka-i-nastroika-proftpd я описал как настроить proftpd на debian для небольшого хостинга, думаю во фряхе будет не сильно различаться ;-)

  10. Сергей :

    А как поступить, если нужно создать виртуальных пользователей, привязанных к домашним каталогам (или вложенным в них каталогам) реальных пользователей. Например, есть реальный пользователь user с домашним каталогом /home/user, а нам нужен виртуальный, например user_ftp, «домашним» для которого будет /home/user/www ? Причем, права user_ftp в этом каталоге будут идентичны правам просто user.

  11. Создаете unix пользователя с хомяком /home/user/www, вносите его в группу user. Второй октет chmod становится для них общими правами (umask 002 поставить нужно будет). Шелл — по вкусу, я предпочитаю date.

  12. bbot :

    wget’у не помешает —no-check-certificate

  13. С чего бы он не помешал бы? Сертификат-то валидный.

  14. Mike :

    Уебищный vsftpd, разработчики уроды сраные!!!

  15. Чем они вам не угодили-то ) ?

  16. Vad :

    я новичок в Linuxe, помогите глупому )))
    сделал все как написано, но залогиниться на FTP не получается
    vadim@debian-test1:~$ ftp localhost
    ftp: connect to address ::1: Connection refused
    Trying 127.0.0.1…
    Connected to localhost.
    220 Welcome to debian.pro ftpd!
    Name (localhost:vadim): test
    331 Please specify the password.
    Password:
    500 OOPS: vsftpd: refusing to run with writable root inside chroot()
    Login failed.
    ftp>
    ftp> exit
    421 Service not available, remote server has closed connection
    vadim@debian-test1:~$
    то же самое и из локальной сети происходит.
    подскажите, что я неправильно перепутал??? 8)

  17. chroot_local_user=YES
    Стала работать по другому в последних версиях vsftpd

    Теперь chroot-директория должна принадлежать руту.
    Нужно сделать chown root:root /home/test (или где там у него домашний каталог) и внутри создать каталоги нужные пользователю и на них сказать chown test:test /home/test/*

  18. nurdus :

    Добрый вечер.
    Спасибо за статью, но почему то у меня не хочет ставится:

    root@hs-python:~# aptitude install vsftpd
    The following NEW packages will be installed:
    vsftpd{b}
    0 packages upgraded, 1 newly installed, 0 to remove and 16 not upgraded.
    Need to get 147 kB of archives. After unpacking 385 kB will be used.
    The following packages have unmet dependencies:
    vsftpd: Depends: libssl1.0.0 (>= 1.0.0) which is a virtual package.
    The following actions will resolve these dependencies:

    Keep the following packages at their current version:
    1) vsftpd [Not Installed]

    Accept this solution? [Y/n/q/?] Y
    No packages will be installed, upgraded, or removed.
    0 packages upgraded, 0 newly installed, 0 to remove and 16 not upgraded.
    Need to get 0 B of archives. After unpacking 0 B will be used.

    root@hs-python:~# /etc/init.d/vsftpd restart
    -bash: /etc/init.d/vsftpd: No such file or directory
    root@hs-python:~#

  19. inkvizitor68sl :

    apt-get install libssl1.0.0 , потом снова vsftpd ставьте.

  20. nurdus :

    Не получилось, пишет:
    root@hs-python:~# apt-get install libssl1.0.0
    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    Package libssl1.0.0 is not available, but is referred to by another package.
    This may mean that the package is missing, has been obsoleted, or
    is only available from another source

    E: Package ‘libssl1.0.0′ has no installation candidate
    root@hs-python:~# apt-get install libssl1.0.0
    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    Package libssl1.0.0 is not available, but is referred to by another package.
    This may mean that the package is missing, has been obsoleted, or
    is only available from another source

    E: Package ‘libssl1.0.0′ has no installation candidate

  21. inkvizitor68sl :

    Релиз дебиана то какой?

  22. nurdus :

    root@hs-python:/var/www/webapps/galstuki.biz# lsb_release -a
    No LSB modules are available.
    Distributor ID: Debian
    Description: Debian GNU/Linux 6.0.8 (squeeze)
    Release: 6.0.8
    Codename: squeeze

  23. inkvizitor68sl :

    Выкиньте, репозитории для squeeze с основных зеркал удалили.

    deb http://archive.debian.org/debian/ squeeze main contrib non-free

    вместо всего сорслиста

  24. nurdus :

    Спасибо, вроде получилось =)

Написать комментарий