Home » Linux » CentOS » Установка и настройка vsftpd на CentOS

Установка и настройка vsftpd на CentOS

Меня попросили в разделе с заказами написать статью на тему ftp сервера. Я планировал ее написать ранее, но все откладывал, а теперь решил сделать это. В качестве примера я возьму ftp сервер - vsftpd, систему - CentOS 7, 8. Рассмотрю несколько разных вариантов настройки - простой и более сложный.

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Введение

По моим наблюдениям, популярность ftp серверов с каждым годом падает. Сам я очень редко им пользуюсь и на свои сервера чаще всего не устанавливаю. Так как я работаю с серверами, к которым имею доступ по ssh, необходимости в ftp нет, использую SFTP.

Серьезную конкуренцию ftp создали облачные сервисы для хранения файлов. Чтобы кому-то передать файл, достаточно его расшарить на облачном хранилище и отправить человеку ссылку.

Тем не менее, в некоторых случаях может понадобиться ftp сервер. Доступ к такому серверу часто дают тогда, когда нужно, чтобы к вам кто-то что-то закачал большого объема. Так же ftp доступ дают некоторые хостинг компании, когда вы у них заказываете сервер для бэкапов. Например, ihor, которым я раньше пользовался, предлагает услугу пространство для бэкапа именно по протоколу ftp.

Так что хоть ftp и потерял популярность, но не перестал быть актуальным. Рассмотрим настройку ftp сервера на примере vsftpd. Сделаем несколько конфигураций:

  1. Самая быстрая и простая. В качестве пользователей ftp будут системные пользователи.
  2. Более сложная конфигурация, где пользователи будут виртуальные, хранить их будем в отдельном файле.
  3. Вариант с виртуальными пользователями, но хранить мы их будем в mysql базе.

Работать будем на следующем сервере:

Настройка ftp на Centos 7

Настройка vsftpd для Centos 8 будет немного отличаться, но в целом, все то же самое. Я не буду дублировать информацию, просто прочитайте отдельный раздел в самом конце, где указаны замечания именно для 8-й версии.

Простая настройка ftp в CentOS 7

Если у вас уже есть готовый сервер, то сразу приступайте к установке vsftpd. Если нет, то рекомендую две подходящие статьи для предварительной подготовки: подробная установка centos 7 и базовая настройка сервера.

Начинаем традиционно с обновления системы:

# yum update

Устанавливаем vsftpd:

# yum install vsftpd

Переходим к настройке. Я использую следующую схему работы ftp сервера с системными пользователями. Пользователю root разрешаю ходить по всему серверу. Всем остальным пользователям только в свои домашние директории. Анонимных пользователей отключаю.

Очистим каталог /etc/vsftpd, нам ничего не нужно из того, что там есть по-умолчанию. Можете сохранить куда-нибудь оригинальный конфиг, нам он не понадобится.

# rm -rf /etc/vsftpd/*

Открываем конфиг сервера /etc/vsftpd/vsftpd.conf

# mcedit /etc/vsftpd/vsftpd.conf

и приводим его к следующему виду vsftpd.conf. Не вывожу файл сюда, чтобы не растягивать страницу, конфигов в статье будет много. В файле даны подробные комментарии к каждому параметру.

Создаем необходимых пользователей, файлы и каталоги для установленной конфигурации. Добавим тестового пользователя ftp в систему:

# useradd -s /sbin/nologin ftp-user
# passwd ftp-user

Пользователя создаем без оболочки. Тут сразу можно указать в качестве домашней директории необходимый каталог, в котором будет работать пользователь. Я специально этого не делаю, чтобы продемонстрировать работу пользовательских настроек в отдельном файле. Пользователь будет создан со стандартным домашним каталогом в /home, но при работе по ftp он будет направлен в другой каталог, который мы ему укажем через файл пользовательских настроек vsftpd.

Здесь стоит обратить внимание на один момент. Начиная с какой-то версии то ли vsftpd, то ли это касается самой системы Centos, но пользователь с оболочкой /sbin/nologin не может подключаться по ftp. Связано это с тем, что идет проверка оболочки, а ее нет в файле /etc/shells. Я не пробовал ее туда добавлять, так как не понимаю до конца назначение этого файла. Я предлагаю просто отключить проверку оболочки в настройках pam для vsftpd. Делается это в файле /etc/pam.d/vsftpd. Нужно закомментировать следующую строку:

#auth required pam_shells.so

Продолжаем настройку ftp сервера. Создаем каталог для персональных настроек пользователей:

# mkdir /etc/vsftpd/users

В каталоге можно будет создать отдельно файлы с именами пользователей и передать им персональные параметры. Для примера создадим файл с именем пользователя ftp-user и укажем его домашний каталог:

# touch /etc/vsftpd/users/ftp-user
# echo 'local_root=/ftp/ftp-user/' >> /etc/vsftpd/users/ftp-user

Не забываем создать этот каталог и назначить ему владельца:

# mkdir /ftp && chmod 0777 /ftp
# mkdir /ftp/ftp-user && chown ftp-user. /ftp/ftp-user/

Создаем файл c пользователями, которым можно выходить за пределы домашнего каталога:

# touch /etc/vsftpd/chroot_list

Добавляем туда рута:

# echo 'root' >> /etc/vsftpd/chroot_list

Создаем файл со списком пользователей ftp, которым разрешен доступ к серверу:

# touch /etc/vsftpd/user_list
# echo 'root' >> /etc/vsftpd/user_list && echo 'ftp-user' >> /etc/vsftpd/user_list

Этим списком мы можем ограничить доступ к ftp серверу системных пользователей, которым туда ходить не нужно. Осталось только создать файл для логов:

# touch /var/log/vsftpd.log && chmod 600 /var/log/vsftpd.log

Все готово для работы. Добавляем vsftpd в автозагрузку и запускаем:

# systemctl enable vsftpd
# systemctl start vsftpd

Проверяем, запустился ли он:

# netstat -tulnp | grep vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 19505/vsftpd

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

Прежде чем начнете проверять подключение, убедитесь, что у вас настроен firewall. Либо выключите его, либо настройте для разрешения подключений по ftp. Узнать как правильно настроить iptables для работы ftp сервера можно в отдельной статье, посвященной настройке iptables. Там есть все необходимые пояснения и примеры.

Я зашел пользователем root и смог прогуляться по всей файловой системе.

Подключение к vsftpd серверу

Пользователь ftp-user ограничен своим домашним каталогом, указанном в индивидуальном файле с параметрами. Выйти за его пределы он не может. В лог файле отражены все действия пользователей на сервере: загрузка и скачивание файлов.

Обращаю внимание, что это мой опыт работы с vsftpd. Давать доступ системному руту по ftp ко всей файловой системе весьма опасно, нужно пользоваться осторожно. Я уже точно не помню, зачем я так делал, остались заметки с давних времен. Рассматривайте это просто как демонстрацию возможностей и используйте эти функции так, как вам нужно.

Настройка vsftpd с виртуальными пользователями

Рассмотрим вариант, когда пользователи ftp сервера не должны пересекаться с локальными. В данном примере будут работать только виртуальные пользователи. Я мельком проверил, можно ли настроить и тех и других, оказалось, что можно. Но там надо аккуратно с правами разбираться и со списками разрешенных пользователей. Я решил, что не буду описывать эту ситуацию, так как не очень представлю, когда она может пригодиться. Если кому-то надо, то на базе этой статьи он сам сможет разобраться.

Чтобы авторизовать виртуальных пользователей, установим дополнительный пакет compat-db:

# yum install compat-db

На всякий случай сохраните оригинальный pam.d файл, если захотите снова вернуться к системным пользователям:

# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.orig

Нужно изменить pam файл /etc/pam.d/vsftpd, приведя его к следующему виду:

# mcedit /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/virt_users
account required pam_userdb.so db=/etc/vsftpd/virt_users
session required pam_loginuid.so
# mcedit /etc/vsftpd/vsftpd.conf

Рисуем следующий конфиг для vsftpd vsftpd.conf Создаем файл с виртуальными пользователями:

# touch /etc/vsftpd/virt_users

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

ftp-virt1
password1
ftp-virt2
password2

Сохраняем файл и генерируем локальное хранилище учеток:

# db_load -T -t hash -f /etc/vsftpd/virt_users /etc/vsftpd/virt_users.db

У вас должен появиться файл virt_users.db.

Нужно создать каталоги для этих пользователей:

# mkdir /ftp/ftp-virt1 /ftp/ftp-virt2

Для папки /ftp надо назначить соответствующего владельца, от которого ftp сервер будет пускать виртуальных пользователей:

# chown -R ftp. /ftp

На этом настройка виртуальных пользователей ftp закончена. Перезапускаем vsftpd и пробуем залогиниться:

# systemctl restart vsftpd

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

# mcedit /etc/vsftpd/add_virt_user.sh
#!/bin/sh

echo -n "Enter name of virtual user: "
read virtuser

echo -n "Enter password: "
read virtpass

mkdir /ftp/$virtuser
chown ftp. /ftp/$virtuser
touch /etc/vsftpd/users/$virtuser

echo "$virtuser" >> /etc/vsftpd/virt_users
echo "$virtpass" >> /etc/vsftpd/virt_users

db_load -T -t hash -f /etc/vsftpd/virt_users /etc/vsftpd/virt_users.db

Делаете файл исполняемым и запускаете:

# chmod 0700 /etc/vsftpd/add_virt_user.sh
# /etc/vsftpd/add_virt_user.sh
Enter name of virtual user: ftp-virt2
Enter password: 123456

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

Хранение vsftpd пользователей в mysql

Настройка не отличается от предыдущего раздела. Конфиг один в один совпадает. Изменится только файл в pam.d. Но перед тем, как его изменить, выполним подготовительные настройки. Первым делом нам понадобится mariadb, устанавливаем ее:

# yum install mariadb mariadb-server

Запускаем и добавляем ее в автозагрузку:

# systemctl start mariadb
# systemctl enable mariadb.service

Выполняем скрипт первоначальной настройки mysql:

# /usr/bin/mysql_secure_installation

Подробнее о настройке mysql рассказано в статье про настройку web сервера на centos. Если вам в будущем понадобится веб сервер, можете сразу его настроить, а заодно поставить phpmyadmin, дальнейшие действия проще будет выполнить там. Но я сейчас не буду на этом останавливаться, сделаем все в консоли.

Подключаемся к mysql:

# mysql -u root -p

Создаем пользователя и базу данных для хранения учетных записей пользователей ftp:

> CREATE DATABASE vsftpd;
> GRANT SELECT ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY '12345';
> FLUSH PRIVILEGES;
vsftpd имя пользователя и базы
12345 пароль пользователя

Создаем таблицу учеток:

> USE vsftpd;
> CREATE TABLE `accounts` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) NOT NULL ,
`pass` VARCHAR( 50 ) NOT NULL ,
UNIQUE (`username`)
) ENGINE = MYISAM ;
Обратите внимание на кавычки при копировании. Если будут ошибки в синтаксисе mysql, вам нужно будет их удалить и проставить заново.

Создадим сразу одного пользователя:

> INSERT INTO accounts (username, pass) VALUES('ftp-mysql', md5('123'));
ftp-mysql имя пользователя
123 пароль

Список пользователей можно посмотреть с помощью команды:

> select * from accounts;
+----+-----------+----------------------------------+
| id | username | pass |
+----+-----------+----------------------------------+
| 1 | ftp-mysql | 202cb962ac59075b964b07152d234b70 |
+----+-----------+----------------------------------+
1 row in set (0.01 sec)

Выходим из консоли mysql и создаем каталог для нового пользователя:

# mkdir /ftp/ftp-mysql && chown ftp. /ftp/ftp-mysql

Для авторизации пользователей vsftpd через mysql нам необходимо установить pam_mysql. Тут я столкнулся серьезной проблемой. Во-первых, в стандартном репозитории его нет. Раньше он был в репозитории epel, но начиная с 7-й версии его оттуда убрали. Причина в том, что он очень старый, 2008-го года или еще раньше, если я не ошибаюсь. С тех пор он не обновляется. В centos решили, что этот модуль уже не нужен, он морально устарел, а хранить учетные записи в mysql плохая идея. Сейчас в тренде ldap, надо там хранить учетки. В принципе, это разумно. Но отказываться от привычной mysql все равно не хочется.

Мне пришлось прилично загуглиться в буржунет и найти там информацию. Я узнал, что для CentOS 7 подойдет вот эта версия pam_mysql-0.7-0.16.rc1.fc20.x86_64.rpm. Было очень много битых ссылок, но все же я нашел рабочую. На всякий случай сохраняю ее у себя. Так что ставим модуль pam_mysql для centos 7 с моего сайта:

# rpm -Uvh https://serveradmin.ru/files/pam_mysql-0.7-0.16.rc1.fc20.x86_64.rpm

Теперь редактируем файл /etc/pam.d/vsftpd. В интернете много примеров конфигурации. Опытным путем собрал рабочий вариант:

# mcedit /etc/pam.d/vsftpd

session optional pam_keyinit.so force revoke
auth required pam_mysql.so user=vsftpd passwd=12345 host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3
account required pam_mysql.so user=vsftpd passwd=12345 host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=3

Сохраняем файл, перезапускаем на всякий случай vsftpd и пробуем зайти свежесозданным пользователем.

# systemctl restart vsftpd

У меня все получилось. Если будут какие-то проблемы, то смотрите в первую очередь на работу mysql_pam в логе /var/log/audit/auditlog. У меня были такие ошибки, когда я настраивал авторизацию и она не работала:

type=USER_AUTH msg=audit(1459442408.756:724): pid=21483 uid=0 auid=4294967295 ses=4294967295 msg='op=PAM:authentication grantors=? acct="ftp-mysql" exe="/usr/sbin/vsftpd" hostname=192.168.1.100 addr=192.168.1.100 terminal=ftp res=failed'

После правильной настройки, появились такие записи:

type=CRED_ACQ msg=audit(1459442810.698:735): pid=21564 uid=0 auid=4294967295 ses=4294967295 msg='op=PAM:setcred grantors=pam_mysql acct="ftp-mysql" exe="/usr/sbin/vsftpd" hostname=192.168.1.100 addr=192.168.1.100 terminal=ftp res=success'

В логе /var/log/secure тоже может быть полезная информация. У меня было так:

Mar 31 19:39:44 vsftpd[21475]: pam_mysql - MySQL error(Unknown column 'passwd' in 'field list')

С пробелами в строках была путаница, пока не исправил, не работало ничего. Но потом все заработало. Если ошибетесь с пользователем mysql, от которого подключается vsftpd, получите ошибку:

pam_mysql - MySQL error (Access denied for user 'vsftpd'@'localhost' (using password: YES))

Проверяйте логин с паролем в pam файле. На этом у меня сегодня все. Можно скрипт набросать для удобного добавления пользователей в базу, но мне уже лениво. Может кто-нибудь другой в комментариях поделится.

Настройка vsftpd в Centos 8

Для настройки ftp сервера в Centos 8, необходимо выполнить несколько изменений по сравнению с основной статьей:

  1. Параметр tcp_wrappers необходимо отключить, т.е. указать NO. В Centos 8 нет его поддержки. Это касается всех приведенных в статье конфигов.
  2. Если вы настраиваете виртуальных пользователей vsftpd в Centos 8, то ставить пакет compat-db нет необходимости. Утилита db_load уже есть в системе.
  3. Модуль pam_mysql для Centos 8 брать по ссылке - https://serveradmin.ru/files/pam_mysql-0.8.1-0.6.el8.x86_64.rpm.

Все остальное настраивается точно так же, как и в предыдущей версии системы.

Настройка SSL / TLS

Для того, чтобы ваши пароли и данные, которые ftp сервер передает в открытом виде, не стали легкой добычей снифферов, рекомендую настроить ssl или tls сертификаты для работы ftp через ssl (ftps, не путать с sftp). Сделать это не сложно. Настройка одинаковая для обоих систем.

Генерируем самоподписный сертификат. Если есть валидный, или есть возможность получить бесплатный сертификат от let's encrypt, можно использовать их.

# openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem

Генерация самоподписного сертификата в Centos

Данные можете любые указывать, это не имеет значения. Добавляете в конфиг vsfptd.conf дополнительные параметры:

rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
ssl_enable=YES

И перезапускаете ftp сервер, чтобы проверить работу по ftps.

# systemctl restart vsftpd

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

Настройка ssl подключения по ftp

При подключении, должно выйти предупреждение о том, что нет возможности проверить сертификат. Надо вручную подтвердить доверие.

Проверка работы ftps

Вот и все. Теперь ftp сервером можно безопасно пользоваться, так как данные не передаются в открытом виде. Так что настоятельно рекомендую ssl в ftp настраивать.

Заключение

Мы подробно рассмотрели вопрос использования vsftpd сервера с различной настройкой учетных записей. По мне удобнее всего работать с виртуальными пользователями в локальной, не mysql, базе. Но если используется какая-нибудь панель управления сервером, то удобно засунуть всех пользователей в базу.

Когда я настраивал публичный хостинг, то использовал самописные скрипты для создания каталогов виртуальных хостов, добавления настроек в apache и создание пользователей ftp с доступом к своим сайтам.  Там без ftp не обойтись, так как его постоянно просят веб мастера, даже в наше время.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Видео

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

90 комментариев

  1. Мучаюсь с ошибкой при подключении:
    pam_listfile(vsftpd:auth): Refused user ftp-user for service vsftpd
    Может кто сталкивался?

    • Помогло вот что:
      Изменил параметр sense=deny на sense=allow в файле /etc/pam.d/vsftpd
      Добавил в конфиг pasv_promiscuous=yes
      И на всякий случай пересоздал пользователя ftp-user

  2. Виталий

    Отличный гайд по настройке.

  3. Дмитрий

    Спасибо за статью, но есть вопрос:
    добавил пользователя в список chroot_list, и пользователь из списка может выходить за пределы своей папки, но вот в папки других пользователей заходить не может. Подскажите, пожалуйста, как можно это исправить?

    • А тут уже вступают в силу непосредственно стандартные права на файлы и папки unix. У пользователя просто нет прав на доступ к каталогам других пользователей. Надо ему их дать тем или иным образом. Например, создать группу, в неё добавить этого пользователя, а на каталоги других пользователей сделать права доступа для этой группы.

      • Дмитрий

        Спасибо за ответ.
        Я тоже подумал про это и добавил пользователя в группы владельца папки, но это не помогло.
        Сделал как Вы посоветовали:
        Создал группу
        Добавил нужного пользователя в эту группу
        Назначил группу владельцем папки, но результата это не дало.

        Возможно это из-за того что папки Ftp располагаются в папках пользователей в /home , но почему пользователь тогда не видит даже своей папки?

  4. Автор, забыл добавить, что если выходит ошибка 522 (как у меня вышло после настройки SSL по твоей статье) - 522 SSL connection failed; session reuse required: see require_ssl_reuse option in vsftpd.conf man page,
    то нужно в файл vsftpd.conf вписать следующую строку:
    require_ssl_reuse=NO

  5. Спасибо, друг!

  6. Не большой вопрос по правам доступа.
    Требуется дать доступ по FTP к файлам сайта.
    Соответственно если сервер запускается от пользователя к примеру apache, то и у папок и файлов должна быть группа и владелец apache иначе скрипты выдают ошибку и не работают.
    Как сделать так что бы пользователь мог работать с файлами в каталоге но при этом имел отдельный логин, но файлы измененные или загруженные им оставались принадлежать Apache?

    • Обычно это делается так. Под конкретный сайт создается отдельный пользователь. Веб сервер запускается от этого пользователя. И под этим же пользователем идет подключение по ftp.

      Если такая схема невозможна, то делается немного по-другому. Обычно самому веб серверу нужны права только на чтение файлов, а писать должен уметь интерпретатор php, например php-fpm. Тогда создается отдельный пользователь и группа под сайт. Веб сервер добавляется в эту группу, чтобы он мог читать файлы. А php-fpm запускается от пользователя для сайта, чтобы он мог писать файлы. По ftp тоже идет подключение под этим пользователем.

  7. Спасибо за инструкцию, кучу руководств перепробовал, только у вас самые рабочие мануалы)

  8. Fedora 33 доустановить - dnf install libdb libdb-devel ещё можно libdb-utill

    • Федору под сервер используете или на рабочей станции понадобилось?

      • Федору24 под сервер , ну там астериск 17 ещё и гоип sms server - и это кручу на федоре 33 ещё . В общем по разному . От железа зависит на точках.

        • А почему Федору, а не Centos?

          • Федора интереснее - скажем как струна пашет, а сентос как рессора гнётся , тоже пашет + по железу у федоры интерестне с драйверами получается, я там и тв делал всякое на разных картах .

        • SuiteCRM халявное только на федоре 33 серваке .

  9. Сергей

    Добрый день.
    Делал все как в статье, Настройка vsftpd с виртуальными пользователями. Пробую подключаться, логин / пароль пропускает, дальше "500 OOPS" cannot change directory:/ftp/test"
    Selinux выключен.
    В чем может быть проблема?

    • Сергей

      Разобрался. Опечатка в имени каталога пользователя стоило мне 2 часа убитого времени...

      • С опечаток стоит начинать любые поверки :) Такие ошибки больше всего времени забирают, так как не решаются привычным поиском в интернете.

  10. Ребята, кто-нить сталкивался с проблемой кириллицы в логах?
    --
    vsftpd.log
    Mon Oct 5 21:20:22 2020 [pid 23470] [ftps] OK UPLOAD: Client "8.8.8.8", "/pubic/??????????????????/.."

  11. В своей практике тоже начинал с vsFTPd , он хорошо и гибко настраивается как для обычных пользователей системы, так и для виртуальных, но потом не хватило некоторых фич, и перешёл сначала на PureFTPd, а потом на ProFTPd.

    Критичной лично для меня оказалась фишка перекодирования "на лету" в UTF-8 и cp1251 (в зависимости от ОС клиента), и с ней без танцев с бубном хорошо справился ProFTPd.

  12. Сделал все точно по инструкции. Фаервол выключен. Получаю ошибку 500 OOPS: tcp_wrappers is set to YES but no tcp wrapper support compiled in. Что уже только не делал. В инете эта ошибка крайне редкая. Ставил NO, вместо YES, не помогло. Может есть какие-то мысли, хоть у кого-то?

    • Алексей

      sed -i 's,\r,,;s, *$,,' /etc/vsftpd/vsftpd.conf

    • Замена TCP Wrappers в RHEL 8
      Пакет TCP Wrappers устарел в RHEL 7, и поэтому он не будет доступен в RHEL 8 или более поздних версиях RHEL.
      https://access.redhat.com/solutions/3906701

      Перетащил конфиги на восьмерку и убил пол дня, пока не догадался в tcpdump глянуть. А ваш коммент был под носом. )

  13. tqmxqqqusggm

    Здравствуйте!

    Сделал все по вышеописанной инструкции для 1го случая. Только имя пользователя поменял.
    При попытке зайти на ftp-сервер с другого хоста, авторизация проходит корректно, но процесс «reading remote directory” затягивается и приводит к ошибке: Lost connection. Couldn’t retrieve directory listing. Error listing directory ‘/‘.
    *подключаюсь через winscp

    • tqmxqqqusggm

      По команде “systemctl status vsftpd” пишет:
      pam_listfile(vsftpd:auth): Couldn’t open /etc/vsftpd/ftpusers

      • tqmxqqqusggm

        Эту ошибку получилось убрать - просто добавил файл, но изначальную проблему это не решило.

  14. Если делать по инструкции автора статьи, то пользователя ftp-user не авторизуется. В итоге нашел на другом сайте решение проблемы:
    У автора зачем-то для пользователя ftp-user командой useradd -s /sbin/nologin ftp-user выставляется шелл - /sbin/nologin, но в файле /etc/shells нет такого шела. Если выставить в файле /etc/passwd правильный шелл для пользователя ftp-user - я сделал так ftp-user:x:1001:1001::/home/ftp-user:/bin/bash то все сразу начинает работать.
    И еще момент... Если вы хотите получать нормальные полноценные ftp логи, а не только информацию какой файл был загружен-выгружен, то в файле /etc/vsftpd.conf делаем так:
    log_ftp_protocol=YES
    xferlog_enable=YES
    xferlog_file=/var/log/vsftpd.log
    xferlog_std_format=NO

    • Изменения для нормальных логов вносить в файле /etc/vsftpd/vsftpd.conf конечно же :)

    • Вообще-то /sbin/nologin указан для того, чтобы у пользователя не было шелла и соответственно доступа по ssh. Вы же, указав bash, его разрешили. Если вас это устраивает, то нормально. Но в общем случае, ftp пользователям не желательно давать доступ по ssh, если это явно не нужно.

      • Так авторизация у пользователя ftp-user в случае /sbin/nologin не работает от слова совсем. То есть если четко следовать по командам в статье то это приводит к невозможности авторизоваться никому кроме рута. Может предварительно нужно было какие-то действия сделать чтобы это заработало?

        • Возможно так и есть, я давно не проверял статью. Написал, просто чтобы вы понимали, что такое nologin и зачем использовалось.

          • Суть происходящего и зачем это я понял. Все что удалось узнать про nologin, говорит о том, что должно работать, но почему-то не работает. Хотя и файл этот есть в наличии вроде... Буду еще экспериментировать :) Отпишусь если получится что-то. Спасибо за отклик!

    • Владислав

      Ну shell "ftp" пользователю включать такое себе. Но я пока закомvентировал строчку "auth required pam_shells.so" в файле /etc/pam.d/vsftpd и он перестал делать проверку на наличие оболочки у пользователя.

    • Да ты прав.Все сделал по правилам но через nologin юзеров зайти не получилосьююПришлось добавлять простым способом все заработало

  15. Добрый день.
    Спасибо за статью, почти все работает в режиме виртуальных пользователей. Но не получается загружать файлы от имени виртуального пользователя по ftp. vsftp.conf из статьи. Другие ресурсы указывают на оцпию virtual_use_local_privs=YES, но она и так стоит в Yes.
    В PAM файле должно быть всего три строки? или эти 3 строки нужно добавить к имеющимся?

    • Вопрос снимается, отключил SELINUX - всё заработало нормлаьно.

      • Работа за натом (порты должны быть проброшены на шлюзе + порт 21 tcp):

        ## Adding passive ports
        pasv_enable=YES
        pasv_min_port=50000
        pasv_max_port=50100
        pasv_address={Public IP}
        listen_port=21
        pasv_addr_resolve=YES

  16. Станислав

    Добрый день!
    Подскажите, можно ли настроить vsftpd на работу как с локальными пользователями там и ещё прикрутить авторизацию по доменным учёткам?

    • Не знаю, никогда не интересовался этим вопросом. Подозреваю, что как-то можно, но не думаю, что это будет просто. С vsftpd давно не работал.

  17. Владимир

    День добрый, я только начал в этом разбираться и прошу помощи, сегодня настраивал ФТП по методу 1, логинится получалось только через root, через простого пользователя не заходило.
    Пошел по 2 методу, все заработало, но сейчас интересный вопрос, чтобы удалить виртуального пользователя, необходимо зайти в файл virt_users и удалить его от туда и удалить папку этого пользователя в /ftp/?
    Дальше зачем в скрипте прописана строчка - touch /etc/vsftpd/users/$virtuser ? Я так понял это мы можем для каждого пользователя указать какие либо параметры? к примеру домашний каталог, получается у нас могут быть два пользователя на один и тот же каталог но с разными правами? и если не сложно, напишите пожалуйста, как это сделать (что должно быть прописано в файлах конфигурации)

  18. Ответ: 500 OOPS: cannot read user list file:/etc/vsftpd/user_list

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

  19. Алексей

    Допишите пожалуйста в фак (столкнулся с проблемой):
    Если при входе локального пользователя (не root) возникает Access Denied нужно прописать путь /sbin/nologin в файле: /etc/shells

  20. Проблема: при подключении извне не переходит в пассивный режим, порты не заблочены провайдером (проверял ставил на них ссш),
    фаервол, селинукс выключены (у меня две сетевухи - первая смотрит в мир с реальным ip, вторая в локалку):
    netstat -tulnp | grep vsftpd
    tcp 0 0 IP:IP:IP:IP:10096 0.0.0.0:* LISTEN 16222/vsftpd
    tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 14722/vsftpd
    происходит подключение, имя пользователя принимает и ошибка на этапе перехода в пасив
    public (active)
    target: default
    icmp-block-inversion: no
    interfaces: ens192 ens224
    sources:
    services: ssh dhcpv6-client http https ftp
    ports: 21/tcp 20/tcp 10090/tcp 10090-10100/tcp 10090-10100/udp

  21. прошу прощения, путь к файлу не верен. ниже правильный
    cat >> /etc/shells

  22. не знаю с чем связано. но при попытке подключиться к фтп FAIL LOGIN: Client, пишут о pam, что дело в нем
    решение:
    cat >> /etc/shell
    /sbin/nologin
    Ctrl+d
    systemctl restart vsftpd
    пользователь с запретом на shell сможет подключаться к ftp но по SSH не сможет, проверено.

  23. Кирилл

    Отличная статья. Спасибо.

  24. Аноним

    вы забыли написать, что в файле /etc/shells должна быть строка /sbin/nologin

  25. Все сделал по инструкции, работает. Но после обновления до CentOS Linux release 7.6.1810 (Core)
    не могу подключиться, ошибка total comand 530, нет такого польз. Но при этом по ssh с этим пользователем работаю. Службу sftpd перегрузил.

  26. Здравствуйте!

    Всё сделал по инструкции. При запуске так же, как у некоторых, выбивало ошибку, настроил в итоге файл конфигурации по примеру с другого сайта. Получил в итоге всего 5 строк, но всё запустилось без ошибок.
    Но появилась другая проблема: не могу через Total Commander подключиться к серверу - ошибка 530. Пытался её решить, но так и не получилось.
    Вообще, стоит задача иметь доступ к виртуальному серверу на хостинге для редактирования файлов сайта и заливки на него кучи фото для товаров, которые я подключаю с CSV-файла. Подключать фотки для каждого товара в отдельности, когда я эти товары могу сотнями заливать, не комильфо. Как мне через TC получить доступ к серверу?

    • Какую ошибку выдает при запуске? Вообще, ftp давно уже не рекомендуется использовать, так как он передает логин и пароль в открытом виде по инету. Лючшу использовать для этих целей sftp. Пример того, как это настраивается, есть здесь - https://serveradmin.ru/ustanovka-i-nastroyka-nginx-php-fpm-php7-1-na-centos-7/#__sftp

      • ___
        [root@localhost vsftpd]# service vsftpd start
        Redirecting to /bin/systemctl start vsftpd.service
        Job for vsftpd.service failed because the control process exited with error code. See «systemctl status vsftpd.service» and «journalctl -xe» for details.
        [root@localhost vsftpd]# systemctl status vsftpd.service
        ● vsftpd.service — Vsftpd ftp daemon
        Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
        Active: failed (Result: exit-code) since Thu 2016-06-16 23:51:06 EEST; 53s ago
        Process: 2176 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=2)

        Jun 16 23:51:06 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon…
        Jun 16 23:51:06 localhost.localdomain systemd[1]: vsftpd.service: control process exited, code=exited status=2
        Jun 16 23:51:06 localhost.localdomain systemd[1]: Failed to start Vsftpd ftp daemon.
        Jun 16 23:51:06 localhost.localdomain systemd[1]: Unit vsftpd.service entered failed state.
        Jun 16 23:51:06 localhost.localdomain systemd[1]: vsftpd.service failed.
        ___

        В логи вдаваться я не стал, просто в комментах почитал примерную причину ошибки и отредактировал файл конфигурации vsftpd, после чего старт прошёл успешно.

        А за совет спасибо, надеюсь хоть sftp смогу настроить без проблем))

  27. tcp_wrappers is set to YES but no tcp wrapper support compiled in

  28. Не работает, все делал по шагам по первому варианту... service start не работает...
    Подскажите, что не так?

    vsftpd.service - Vsftpd ftp daemon
    Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
    Active: failed (Result: exit-code) since Mon 2018-02-12 12:44:30 CET; 1min 39s ago
    Process: 1265 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=1/FAILURE)

  29. Александр

    Всё сделал по инструкции:
    Job for vsftpd.service failed because the control process exited with error code. See "systemctl status vsftpd.service" and "journalctl -xe" for details.

    Где смотреть эти логи? Где находятся эти файлы?
    Не работает....

    • Написано же где смотреть:
      systemctl status vsftpd.service
      journalctl -xe

      • Александр

        Пояснение классное! Нет слов просто....
        Пользуйтесь лучше офф. документацией, а не подобными "записками", тогда всё будет работать!

        • Не понял, в чем проблема? Эти команды и выводят логи, где можно увидеть проблему. Откройте документацию по systemd и там будут эти же команды для просмотра логов запущенных сервисов.

          А вообще, я не настаиваю. Если вам кажется официальная документация более понятной и удобной, используйте ее.

          Искать проблему в других, а не в себе - дурная привычка. Статья рабочая и по ней многие настроили, в том числе и я.

  30. Респект, очень помогло!

    Однако надо бы добавить про настройку firewalld, например
    sudo firewall-cmd --permanent --zone=public --add-port=21/tcp
    sudo firewall-cmd --permanent --zone=public --add-port=49000-55000/tcp

    Ато пришлось потом гуглить почему не удается получить список каталогов, то ли прав не хватало, то ли из-за simlink

  31. Владимир

    Протестировал виртуальных пользователей. Это так задумано что пользователи созданные с помощью скрипта не могут ничего создать у себя в папке или скрипт недоделанный? Ладно если бы все пользователи юзали один каталог задумка была бы интересной, а так...

    • Владимир

      Сорян. Сам накосячил)) Все норм!

    • Владимир

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

  32. Владимир

    Тестирую первый способ с системным пользователями. Захотелось мне включит анонимуса и столкнулся с такимответм сервера "500 OOPS: vsftpd: refusing to run with writable root inside chroot() " Пните меня в сторону правильного решения сей задачи!

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

      • Владимир

        Ну, когда я оставляю закоментированой строку "anon_root=/ftp" ошибка исчезает и анонимуса кидает вкаталог "/var/ftp" и он там только гость

        • А права на папку /ftp какие? Для доступа анонимусов надо сделать ей права 777 и проверить.

          • Владимир

            Так в том то и дело что проверил и перепроверил права на папку. /то первое что я сделал перед тем как написать. И ls -l показывает что на /ftp стоит "drwxrwxrwx"

    • Михаил

      Получилось разобраться?

  33. Никита

    Неужели этот мега безопасный фтпсервер не умеет банить айпи при неверном логине\пароле?

    • Это не задача ftp сервера. Если нужен бан по ip, то это без проблем настраивается с помощью iptables+fail2ban. Для анализа нужно брать лог файл /var/log/vsftpd.log.

      • Никита

        Ага, спасибо, так и сделал. Просто видел возможность банить прямо из фтп на proftd.
        Кстати, как насчёт веб морды для vsftpd? Есть что-то вменяемое? Webmin модуль устарел не выйдя из беты. А это баженное весьма https://github.com/Tvel/VsftpdWeb

  34. Может будет кому полезно:
    При подключении на клиенте появлялась ошибка "500 OOPS: failed to open vsftpd log file" или что-то похожее. Файл действительно был пуст, права -rw-------., юзер root, группа root.
    Остановил vsftpd, удалил лог-файл, запустил vsftpd. После этого подключение прошло успешно. Лог-файл, указанный в конфиге, появился сам, видимых отличий в правах доступа к нему я не нашёл, логи в него пишутся.

  35. Здравствуйте, стал поклонником вашего сайта, сначала rsync'у у Вас учился, теперь FTP. Вроде все просто, главная проблема в том что если указываю домашний каталог пользователя "от имени которого подключается виртуальный пользователь" - вижу структуру папок, могу удалять, создавать, копировать и пр... Если указываю другую папку в файле /etc/vsftpd/users/ftproot то подключаюсь, а структуры нет, и ничего скопировать не могу, хотя вижу что папка подключилась та.
    Все конфиги копировать не буду чтобы не растягивать.
    /etc/vsftpd/vsftpd.conf

    # Разрешить подключаться виртуальным пользователям
    guest_enable=YES

    # Системный пользователь от имени котрого подключаются виртуальные
    guest_username=admroot

    # Виртуальные пользователи имеют те же привелегии, что и локальные
    virtual_use_local_privs=YES

    # Автоматическое назначение домашнего каталога для виртуальных пользователей
    #user_sub_token=$USER
    #local_root=/ftp/$USER
    # Запрещает подключение анонимных пользователей
    anonymous_enable=NO

    # Каталог, куда будут попадать анонимные пользователи, если они разрешены
    #anon_root=/ftp

    # Разрешает вход для локальных пользователей
    local_enable=YES

    # Разрешены команды на запись и изменение
    write_enable=YES
    # Включение специальных ftp команд, некоторые клиенты без этого могут зависать
    async_abor_enable=YES

    # Локальные пользователи по-умолчанию не могут выходить за пределы своего домашнего каталога
    chroot_local_user=YES

    # Разрешить список пользователей, которые могут выходить за пределы домашнего каталога
    chroot_list_enable=YES

    # Список пользователей, которым разрешен выход из домашнего каталога
    chroot_list_file=/etc/vsftpd/chroot_list

    # Разрешить запись в корень chroot каталога пользователя
    allow_writeable_chroot=YES

    # Директория с настройками пользователей
    user_config_dir=/etc/vsftpd/users

    # Маска прав доступа к создаваемым файлам
    local_umask=022

    # Порты для пассивного режима работы
    pasv_min_port=54988
    pasv_max_port=55000

    /etc/vsftpd/users/admroot
    local_root=/media/CentOS7_Disk2/BackUp/
    /etc/vsftpd/users/ftproot
    local_root=/media/CentOS7_Disk2/BackUp/

    /etc/vsftpd/chroot_list
    ftproot
    admroot

    Подключаюсь под пользователем ftproot, если в файле /etc/vsftpd/users/ftproot - /home/admroot/ - все видится, если /media/CentOS7_Disk2/BackUp/ - пустая папка.
    разрешения вроде похожи:
    /home/admroot/
    total 60
    drwx------. 15 admroot admroot 4096 May 31 08:19 .
    drwxr-xr-x. 3 root root 21 Jun 5 06:16 ..
    -rw-------. 1 admroot admroot 22685 Jun 5 12:20 .bash_history
    -rw-r--r--. 1 admroot admroot 18 Dec 6 23:19 .bash_logout
    -rw-r--r--. 1 admroot admroot 193 Dec 6 23:19 .bash_profile
    -rw-r--r--. 1 admroot admroot 231 Dec 6 23:19 .bashrc
    drwxrwxr-x. 10 admroot admroot 193 May 23 04:16 .cache
    drwxrwxr-x. 17 admroot admroot 4096 May 25 11:42 .config
    drwxr-xr-x. 2 admroot admroot 6 Jun 6 03:12 Desktop
    drwxr-xr-x. 2 admroot admroot 6 May 23 03:33 Documents
    drwxr-xr-x. 2 admroot admroot 6 May 23 03:33 Downloads
    -rw-------. 1 admroot admroot 16 May 23 03:33 .esd_auth
    -rw-------. 1 admroot admroot 2178 May 31 03:03 .ICEauthority
    -rw-------. 1 admroot admroot 35 May 26 11:25 .lesshst
    drwx------. 3 admroot admroot 19 May 23 03:33 .local
    drwxr-xr-x. 2 admroot admroot 6 May 23 03:33 Music
    drwxr-xr-x. 2 admroot admroot 6 May 23 03:33 Pictures
    drwxr-xr-x. 3 admroot admroot 39 Jun 5 11:08 Public
    drwx------. 2 admroot admroot 125 Jun 1 10:10 .ssh
    drwxr-xr-x. 2 admroot admroot 6 May 23 03:33 Templates
    drwxr-xr-x. 2 admroot admroot 6 May 23 03:33 Videos
    -rw-------. 1 admroot admroot 573 May 31 08:19 .viminfo
    drwx------. 2 admroot admroot 35 May 23 03:33 .vnc

    /media/CentOS7_Disk2/BackUp/
    total 16
    drwxrwxrwx. 3 admroot admroot 4096 Jun 5 11:34 .
    drwxr-xr-x. 7 root root 4096 Jun 5 05:21 ..
    drwxrwxrwx. 3 admroot admroot 4096 Jun 5 11:37 df
    -rwxrwxrwx. 1 admroot admroot 5 Jun 5 11:34 er.conf

    Подскажите пожалуйста.

    • При этом я вижу структуру файлов, могу зайти даже в корневые каталоги /etc/ /dev/ и пр. но папки которым сам назначал права и владельца нет

  36. Карен Григорьевич

    В iptables попробуй добавить правило на открытие 21 порта tcp. Мне помогло =)

  37. Всё сделал копипастом (первую часть, мне больше и не надо для стягивания архива), попробовал зайти рутом через Yummy FTP Pro, пишет неверный пароль... как он может быть неверным еcли я с ним сижу в SSH и делаю FTP? )))
    ftp-user тоже на свою папку пишет неверный пароль
    Что я не так сделал?

  38. Виктор

    Тоже самое выдал

    • у меня было тоже самое, но после того как я в ручную сделал copy/paste из предоставленного автором файла в свой файл настроек(через putty), то почти все заработало, а почти потому, что нужно настроить se linux, я его просто отключил
      П.С. Автор спасибо за твои работы, не раз выручали

  39. Здравствуйте!
    Сделал всё, как написано в первой части статьи - "Простая настройка ftp в CentOS 7"
    Вот что выдаёт:
    --------------------------------------------------------------------
    [root@localhost vsftpd]# service vsftpd start
    Redirecting to /bin/systemctl start vsftpd.service
    Job for vsftpd.service failed because the control process exited with error code. See "systemctl status vsftpd.service" and "journalctl -xe" for details.
    [root@localhost vsftpd]# systemctl status vsftpd.service
    ● vsftpd.service - Vsftpd ftp daemon
    Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
    Active: failed (Result: exit-code) since Thu 2016-06-16 23:51:06 EEST; 53s ago
    Process: 2176 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=2)

    Jun 16 23:51:06 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon...
    Jun 16 23:51:06 localhost.localdomain systemd[1]: vsftpd.service: control process exited, code=exited status=2
    Jun 16 23:51:06 localhost.localdomain systemd[1]: Failed to start Vsftpd ftp daemon.
    Jun 16 23:51:06 localhost.localdomain systemd[1]: Unit vsftpd.service entered failed state.
    Jun 16 23:51:06 localhost.localdomain systemd[1]: vsftpd.service failed.
    --------------------------------------------------------------------

    Подскажите, в какую сторону копать...

    • Надо лог посмотреть системный и vsftpd, может там будут подсказки, в чем ошибка.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar