Пример начальной настройки vsftpd в Ubuntu 9.10
Так получилось, что выбирая из двух ftp-серверов (proftpd и vsftpd) я выбрал последний, и по руководству на официальном сайте настроил на работе ftp-сервер с анонимным доступом. Сегодня решил настроить этот ftp-сервер на домашнем компьютере. Только уже не с анонимным доступом, а с доступом по паролю. Для этого в vsftpd можно использовать “виртуальные учетные записи”. Настройку vsftpd выполнял по руководству с официального сайта. Дальше собственно и будет это самое руководство в упрощенном виде, в моем вольном пересказе и с некоторыми дополнениями, касающимися Ubuntu 9.10.
Еще раз о задаче: настраиваю ftp-сервер, который будет доступен из сети Интернет на чтение. Для доступа к серверу необходимо ввести логин и пароль. Все действия выполнялись удаленно через ssh.
Сначала установим ftp-сервер vsftpd:
1 | $ sudo apt-get install vsftpd |
Теперь приступим к настройке.
Шаг первый. Создаем учетную запись виртуального пользователя (пользователей).
Для аутентификации виртуального пользователя будет использована подсистема PAM и ее модуль pam_userdb. Для модуля pam_userdb необходимо создать файл db-формата в котором будет содержаться учетная запись виртуального пользователя и пароль. Сначала необходимо создать обычный текстовый файл в котором будет логин и пароль, а затем на его основе сконвертировать db-файл.
Для генерации пароля использовал программу pwgen. Если pwgen не установлена, устанавливаем:
1 | $ sudo apt-get install pwgen |
Создаем файл login.txt, в котором будет логин - userftp и пароль:
1 2 | $ echo userftp > login.txt $ pwgen -N 1 >> login.txt |
Проверяем файл login.txt:
1 2 3 | $ cat login.txt userftp rekhahra |
Далее генерируем db-файл - vsftpd_login.db с помощью утилиты db_load. Но сначала установим пакет в который входит данная программа:
1 | $ sudo apt-get install db4.7-util |
Теперь выполняем команду которая создаст db-файл:
1 | $ sudo db4.7_load -T -t hash -f login.txt /etc/vsftpd_login.db |
Устанавливаем разрешения на файл /etc/vsftpd_login.db:
1 | $ sudo chmod 600 /etc/vsftpd_login.db |
Шаг второй. Создаем PAM-файл в котором пропишем правила аутентификации. Для этого открываем в текстовом редакторе файл /etc/pam.d/vsftpd:
1 | $ sudo nano /etc/pam.d/vsftpd |
и в конце файла дописываем следующие две строки:
1 2 | auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login account required /lib/security/pam_userdb.so db=/etc/vsftpd_login |
Остальные строки нужно закомментировать. В этом файле мы указываем подсистеме PAM выполнять аутентификацию на основе учетных записей, которые содержаться в созданном db-файле.
Шаг третий. Создаем локального пользователя и каталог для ftp-сервера. Локальный пользователь нужен, чтобы задать права для ftp-каталога. Этот пользователь не будет иметь пароля, и зарегистрироваться локально в системе используя эту учетную запись будет нельзя. Назовем учетную запись virtualftp, а каталог для ftp-сервера - /home/vsftp/. Создаем пользователя:
1 | $ sudo useradd -d /home/vsftp -s /sbin/false virtualftp |
Далее создаем каталог /home/vsftp/ и выставляем разрешения:
1 2 3 | $ sudo mkdir /home/vsftp $ sudo chown virtualftp:virtualftp /home/vsftp/ $ sudo chmod 700 /home/vsftp/ |
Проверяем разрешения:
1 2 | $ sudo ls -l /home/ drwx------ 2 virtualftp virtualftp 4096 2010-03-30 21:21 vsftp |
Шаг четвертый. Создаем конфигурационный файл vsftpd.conf. Переместим существующий файл в домашний каталог:
1 | $ sudo mv /etc/vsftpd.conf ~ |
а на его месте создадим новый (sudo nano /etc/vsftpd.conf) следующего содержания:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | anonymous_enable=NO local_enable=YES write_enable=NO anon_upload_enable=NO anon_mkdir_write_enable=NO anon_other_write_enable=NO anon_world_readable_only=NO guest_enable=YES guest_username=virtualftp chroot_local_user=YES listen=YES listen_port=10021 pasv_min_port=30000 pasv_max_port=30999 |
Пояснения к параметрам пока писать не буду так как они хорошо описаны в оригинальном руководстве.
На этом настройка vsftpd закончена. Скопируем в каталог /home/vsftp/ какой-нибудь файл для проверки:
1 | $ sudo cp hello.txt /home/vsftp/ |
Выставим разрешения для пользователя virtualftp:
1 2 | $ sudo chown virtualftp:virtualftp /home/vsftp/hello.txt $ sudo chmod 700 /home/vsftp/hello.txt |
Теперь выполним рестарт ftp-сервера:
1 2 3 | $ sudo /etc/init.d/vsftpd restart * Stopping FTP server: vsftpd [ OK ] * Starting FTP server: vsftpd [ OK ] |
Проверяем работу ftp-сервера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ ftp localhost 10021 Connected to localhost. 220 (vsFTPd 2.2.0) Name (localhost:igor): userftp 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. -rwx------ 1 1003 1004 8 Mar 30 18:37 hello.txt 226 Directory send OK. |
ftp-сервер vsftpd - работает. Обращаю также внимание на, что в качестве логина используется не локальная учетная запись (virtualftp), а виртуальная учетная запись userftp, которая создавалась на первом шаге.
Если необходимо вести лог-файл, то в конфигурационный файл /etc/vsftp.conf нужно добавить строчку:
1 | xferlog_enable=YES |
В этом случае информация о работе ftp-сервера будет записываться по умолчанию в файл /var/log/vsftpd.log.
Для того чтобы ftp-сервер был доступен из сети Интернет, пробросил на своем модеме D-Link 2640 необходимые порты. Описывать здесь эту процедуру не буду, чтобы не перегружать статью. Скорее всего напишу об этом отдельно.
В завершении темы о настройке vsftpd рекомендую перевод man vsftpd.conf в котором расписаны значения каждого параметра файла vsftpd.conf.
sergkarpenko:
мдя, как оно все устроено по хитрому
а я просто использую пароль юзера в системе :(
а если по ссх заходить из под такого юзера без пароля - совсем не пустит в систему? или выбросит назад в консоль?
Ответить
Igorka Reply:
апреля 1, 2010 at 19:54
Из под любого юзера не пустит. Виртуальных - так как они виртуальные, а virtualftp не пустит, так как у него ни пароля нет ни шелла.
Ответить
sergkarpenko Reply:
апреля 1, 2010 at 20:31
а под pam-mysql не пробовал? что то мне беркли дб не сильно нравится
если получится pam-mysql я себе сделаю через pam-mysql
и напишу пару скриптов и будет у мну вхост с фтп создаваться через веб-морду :)
Ответить
Igorka Reply:
апреля 1, 2010 at 20:39
Не пробовал. Я делал по конкретному руководству. И для конкретной задачи. Просто я сейчас так и на работе сделал. А с mysql все получится, так как когда количество пользователей большое и они постоянно добавляются, то именно mysql и используют. Не будешь же под каждого пользователя заново базу создавать. Там в примере berkeley db, для простоты была указана, чтобы было проще разобраться в самом механизме. Это я так думаю :)
Ответить
sergkarpenko Reply:
апреля 1, 2010 at 20:47
ясно, я когда настраивал видимо не читал особо, вариант с pam мне сейчас очень нравится, а юзеров уже у меня уже около 10-ка, хотя это совсем немного
Ответить
Igorka Reply:
апреля 1, 2010 at 20:51
Кстати на работе сделал для двух виртуальных пользователей и с разными каталогами. Например, есть два виртуальных пользователя: user1 и user2. Создаем два каталога: /home/vsftp/user1 и /home/vsftp/user2. В файл vsftpd.conf добавляем еще две строки:
2
user_sub_token=$USER
Теперь если зайти на фтп под учетной записью user1, то попадаем в в каталог /home/vsftp/user1, видим файлы только этого каталога и он же является корневым, если заходим под учеткой user2, то соответственно попадаем в каталог /home/vsftp/user2. Думаю принцип понятен.
Ответить
sergkarpenko Reply:
апреля 1, 2010 at 21:15
у меня чуть более сложный случай,
у меня есть случаи, когда папка и юзер называются по разному :)
нужно конечно переделать, но там сайтов уже порядка 15 висит и не сильно хочется
Ответить
sergkarpenko Reply:
апреля 1, 2010 at 21:15
сейчас читаю про pam-mysql
Ответить
sergkarpenko Reply:
апреля 1, 2010 at 21:20
и еще хочу настроить FTPS навсякий, не знаю только насколько сильно оно проц грузит
Ответить
L1kbezZz Reply:
июня 9, 2010 at 18:08
Помогите плз! У меня такая проблема: я все настроил, все работает, только вот никак не хочет разрешать записывать файлы на сервер, что только не пробовал… Есть какие-нибудь идеи?((
Ответить
Igorka Reply:
июня 10, 2010 at 19:54
Что “все настроил”? Что “все работает”? Что “не хочет записывать файлы” и куда? Согласитесь на такой вопрос трудно, что либо ответить… Разве, что-нибудь из области “посмотрите там, исправьте здесь и все начнет записывать” :) Конкретней пожалуйста.
Ответить
L1kbezZz Reply:
июня 19, 2010 at 19:51
Извиняюсь за такой неконкретный вопрос=)
Но, оказалось все в порядке, помог reboot =)
п.с. За статью спасибо.
Ответить
sergkarpenko:
еще недавно прочитал, что автор vsftpd добавил в сервер поддержку http ;)
http://www.opennet.ru/opennews/art.shtml?num=25883
читая там комменты застрял в них на пару часов. там такой срач устроили :)
Ответить
1 апреля 2010, 19:29Александр:
Спасибо тебе добрый человек, просто и понятно с пояснениями, отличный пример быстрого старта.
Кстати, все тоже актуально и для 10.04.
Ответить
Igorka Reply:
июня 20, 2010 at 7:58
Пожалуйста! И спасибо за отзыв.
Ответить
andor:
День добрый всем!
Есть задача выпустить в инет фтп сервер который находится за шлюзом (нат).
Уже кучу вариантов перебрал.
Результат - не отрабатывает команда LIST. Тоесть все перенаправляется кроме того что папка юзверя получается пустой.
Сейчас пользуюсь tcpproxy.
Чего порекомендуете?
Ответить
Igorka Reply:
июня 22, 2010 at 17:25
Добрый день,
Мой домашний ftp (настроенный по описанному выше варианту) тоже находится за натом (ADSL модем в режиме роутера). Все работает корректно. А права на просмотр каталога у юзера есть?
Ответить
andor:
Если цепляюсь CuteFTP то пишет в логах:
КОМАНДА:> [22.06.2010 17:36:47] USER qwe
[22.06.2010 17:36:47] 331 Please specify the password.
КОМАНДА:> [22.06.2010 17:36:47] PASS *****
[22.06.2010 17:36:47] 230 Login successful.
СОСТОЯНИЕ:> [22.06.2010 17:36:47] Вход выполнен.
КОМАНДА:> [22.06.2010 17:36:47] PWD
[22.06.2010 17:36:47] 257 “/”
СОСТОЯНИЕ:> [22.06.2010 17:36:47] Домашний каталог:/
СОСТОЯНИЕ:> [22.06.2010 17:36:47] Данный узел поддерживает функции.
СОСТОЯНИЕ:> [22.06.2010 17:36:47] Данный узел поддерживает SIZE.
СОСТОЯНИЕ:> [22.06.2010 17:36:47] Данный узел может возобновить прерванные загрузки.
КОМАНДА:> [22.06.2010 17:36:47] REST 0
[22.06.2010 17:36:47] 350 Restart position accepted (0).
КОМАНДА:> [22.06.2010 17:36:47] PORT 192,168,0,152,11,221
[22.06.2010 17:36:48] 500 Illegal PORT command.
ОШИБКА:> [22.06.2010 17:36:48] Синтаксическая ошибка: команда не распознана.
ОШИБКА:> [22.06.2010 17:36:48] Не удалось установить сокет данных.
Ответить
22 июня 2010, 17:38setler:
Настраиваю vsftpd под ubuntu 8.04. Всё получается, только есть пару вопросов.
1. Не получается запереть пользователя в свой домашней папке. Заходит в неё нормально, а потом может выйти на уровень выше и гулять где угодно. Какой параметр нужно добавить.
2. При входе пользователем на FTP в свою папку кирилица показывает абракадаброй. Как настроить чтобы нормально русские имена отображало?
Спасибо.
Ответить
Igorka Reply:
июля 22, 2010 at 13:58
1. Смотрите в сторону параметра chroot_local_user.
2. Официальный релиз vsftpd с кириллицей не очень дружит. Поэтому рекомендуют использовать неофициальную версию, которую можно найти на сайте http://vsftpd.devnet.ru/ Сам не использовал пока.
Ответить
Денис:
А есть способы добавления пользователей в уже существующую ив?
Ответить
21 июля 2010, 16:41Сергей:
сделал все так же как у автора, прям все команды копировал и у себя в консоле вставлял, все прошло хорошо…но никак не могу зайти на ФТП, пишет,что не правильно указан логин или пароль…в чем проблема ? логин и пароль ввожу те что у меня в login.txt
Ответить
Сергей Reply:
августа 31, 2010 at 15:27
проблему решил - забыл закомментировать ненужные строки в /etc/pam.d/vsftpd , теперь другая проблема - нету доступа на запись, как решить ?
Ответить
Igorka Reply:
августа 31, 2010 at 15:39
Хорошо, что решили проблему самостоятельно. Нужно будет выделить в статье слово “закомментировать”. А то, что нет записи - это не проблема данной статьи. Читайте начало: “Еще раз о задаче: настраиваю ftp-сервер, который будет доступен из сети Интернет на чтение”. На чтение, подчеркиваю. О записи здесь речь не идет. Если нужна запись - смотрите параметры vsftp сервера: http://www.opennet.ru/man.shtml?topic=vsftpd.conf&category=5&russian=0 . Пробуйте, экспериментируйте. Если не получится - пишите, будем вместе решать.
Ответить
Сергей Reply:
сентября 1, 2010 at 8:23
проблему с записью решил так - добавил в конфиг строки virtual_use_local_privs=YES и local_umask=700 т.е. виртуальный пользователь наследует права реального.Но появилась другая проблема - файлы, закачанные на фтп не имею никаких прав, в конфиг добавил параметры - local_umask=0700 и file_open_mode=0700, судя по мануалу они дают права на закачанные файлы..но почему то не работает это, а следовательно я немогу перезаписать уже закачанный файл. ((((
Ответить
Сергей Reply:
сентября 1, 2010 at 8:39
и эту проблему решил…. вообщем удалил из конфига local_umask и file_open_mode, перезагрузился и вроде как все хорошо стало
Ответить
Igorka Reply:
сентября 1, 2010 at 10:49
“Перезагрузился” имеется ввиду выполнил команду sudo /etc/init.d/vsftpd reload ?
Ответить
Igorka Reply:
сентября 1, 2010 at 10:48
А изменить опцию write_enable на YES ?
Ответить
Сергей Reply:
сентября 1, 2010 at 11:48
проблема решена именно удалением local_umask и file_open_mode из конфига.Write_enable стоит YES.
Ответить
Igorka Reply:
сентября 1, 2010 at 11:56
В статье эта опция установлена в NO (write_enable=NO)
Вы писали, что сделали все как у автора, а затем написали какие параметры меняли, чтобы разрешить запись. write_enable среди этих параметров не было. Поэтому и возникает естественный вопрос о нем. Другие читатели прочитав ваш комментарий и выполнив те же действия не получат запись, так как вы ничего не cказали о том, что параметр write_enable также нужно установить в YES.
Ответить
Сергей Reply:
сентября 1, 2010 at 13:16
извеняюсь, этот параметр я изменил на YES, но не он отвечает за запись т.к. что с ним что без него у меня не получалось все равно записать.Помогло добавление virtual_use_local_privs=YES … без этого параметра виртуальные пользователи наследуют права анонимов, которые имеют ограничения на запись.
Ответить
Igorka Reply:
сентября 1, 2010 at 13:26
Извинения приняты. Подытожу для посетителей: чтобы разрешить виртуальному пользователю запись, нужно в конфигурационный файл представленный в статье, добавить строчку virtual_use_local_privs=YES и изменить значение параметра write_enable с NO на YES.
Ответить
Сергей:
есть другая задача, немогу решить…как сделать, чтобы
к примеру 1user мог зайти в главную папку к примеру /home/vsftpd , в ней мог читать и писать а затем в этой папке мог переместиться в свою личную папку - /home/vsftpd/1user и из нее только читать, т.к. в папке vsftpd будут папки других пользователей (/home/vsftpd/1user….2user…3user и т.д.) то он не должен иметь доступ к ним, только на свою! ..вот такая задачка %)
Ответить
Igorka Reply:
сентября 1, 2010 at 11:17
Как сделать точно так как вы хотите пока не знаю. Если я правильно понял идею, то нужен каталог общий для всех где все пользователи могут читать и писать, а также индивидуальный каталог для каждого, в котором только один пользователь имеет доступ на чтение.
Тогда можно создать подкаталог /home/vsftpd/pub - общий для всех и личные подкаталоги /home/vsftpd/1user….2user…3user. Если нужно записать информацию подключаемся под пользователем pub (пароль которой известен всем) и записывает или читает информацию из каталога. Если нужно в свой, то подключается под своей учетной записью.
Правда эта схема не очень удобна когда нужно часто копировать файлы из своего каталога в каталог pub
Ответить
Ilya Reply:
сентября 14, 2010 at 17:20
То что вы описываете это очень просто реалезуеться с помощью apparmor + pam.
Ответить
Ilya:
Есть другая задача: разрешить вход в систему пользователю B без пароля в случае если пользователь A уже в системе.
Ответить
14 сентября 2010, 17:21max:
Спасибо тебе добрый человек всё гуд!! заработало на раз !!!
Ответить
Igorka Reply:
октября 29, 2010 at 23:10
Пожалуйста. Заходите еще!
Ответить
Konstantin:
Спасибо единственный нормальный мануал так сказать для начинающих..
Ответить
Igorka Reply:
ноября 4, 2010 at 23:16
Не за что. Спасибо за высокую оценку.
Ответить
Konstantin:
Если можно хотелось бы поподробней узнать про добавление в файл базы данных логина и пароля новых виртуальных пользователей. Иными словами просто как добавить несколько пользователей со своими папками для доступа?
Ответить
Igorka Reply:
ноября 5, 2010 at 16:26
В комментариях я упоминал об этом - http://igorka.com.ua/2010-03-31/primer-nachalnoj-nastrojki-vsftpd-v-ubuntu-910/comment-page-1/#comment-2767 Там все достаточно просто.
Ответить
foxlis Reply:
октября 8, 2013 at 13:11
Добрый день, не могу понять как добавлять несколько пользователей с именами схожими со своими каталогами
Ответить
Konstantin Reply:
ноября 5, 2010 at 17:39
Да но тут http://igorka.com.ua/2010-03-31/primer-nachalnoj-nastrojki-vsftpd-v-ubuntu-910/comment-page-1/#comment-2767 не написано как конкретно в файл базы данных добавить двух юзеров, так как у меня получается ошибка при добавлении и к тому же про различные имена катологов тоже нет информации.
Спасибо заранее.
Ответить
Юрий:
Здравствуйте, уважаемый автор!
А не приходилось ли вам ставить из исходников пропатченный vsftpd отсюда: http://vsftpd.devnet.ru/
Мне необходимо, чтобы русские названия файлов и каталогов были читаемы, но поставить из этих сырцов никак не получается. Если поставите и напишете мануал, как это грамотно сделать, будет вам респект от многих граждан!
Да, чуть не забыл, ставлю на сервер ubuntu 10.04
Ответить
Igorka Reply:
ноября 13, 2010 at 23:25
Юрий, здравствуйте.
О пропатченном vsftpd читал, но не ставил. Как только появится свободное время, обязательно попробую и отпишу.
Ответить
Женя:
Здравствуйте, у меня проблема, заключается она в том что после настройки с localhost заходит без проблем, с внешнего ип доходит до пароля, и после его ввода выдает ошибку типа неудачная авторизация…комп стоит за роутером…порт ставил стандартный 21-й, на роутере он открытый (та если бы был закрытый, то и до авторизации бы не дошло, если я правильно понимаю)…подскажите, пожалуйста, где искать решение проблемы
Ответить
Igorka Reply:
января 2, 2012 at 21:28
Добрый день,
Здесь нужно разбираться. Возможно вы подключаетесь к самому роутеру. Так как к роутеру есть возможность подключится по FTP протоколу. Попробуйте набрать логин и пароль роутера когда подключаетесь на внешний адрес, если подойдет значит подключаетесь к роутеру, а не фтп-серверу. Для того чтобы подключатся к фтп-серверу за роутером, нужно на роутере пробросить фтп-порты, плюс не забывать, что если фтп-сервер работает в пассивном режиме то нужно еще пробросить и диапазон портов для пассивного режима.
Ответить
Egor:
Приветствую. Спасибо за статью http://igorka.com.ua/2010-03-31/primer-nachalnoj-nastrojki-vsftpd-v-ubuntu-910 , очень помогла.
Игорь, помогите мне пожалуйста.
Мне нужно реализовать в vsftp команду REIN
Всё делал по мануалу.
Конфиг прилагаю.
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
anon_world_readable_only=NO
guest_enable=YES
guest_username=virtualftp
chroot_local_user=YES
chroot_list_enable=YES
listen=YES
listen_port=21
pasv_min_port=30000
pasv_max_port=30999
virtual_use_local_privs=YES
xferlog_enable=YES
пишет REIN not implemented.
Добавление строки cmds_allowed=ABOR,ACCT,ALLO,APPE,CDUP,CWD,DELE,EPRT,EPSV,FEAT,HELP,LIST,MDTM,MKD,MODE,NLST,NOOP,OPTS,PASS,PASV,PORT,PWD,QUIT,REIN,REST,RETR,RMD,RNFR,RNTO,SITE
не помогает.
Заранее спасибо
Ответить
1 июня 2012, 16:04Andrey:
Приветствую.
Делаю все как описано в статье, но не пускает меня на фтп, причем даже на стадии локального входа. Пароль ввожу верно.
root@ip:/etc# ftp localhost 10021
Connected to localhost.
220 (vsFTPd 3.0.2)
Name (localhost:ubuntu): userftp
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.
вот что в vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
anon_world_readable_only=NO
guest_enable=YES
guest_username=unityftp
chroot_local_user=YES
listen=YES
listen_port=10021
pasv_min_port=30000
pasv_max_port=30999
Ответить
22 ноября 2014, 13:55