Меня попросили в разделе с заказами написать статью на тему ftp сервера. Я планировал ее написать ранее, но все откладывал, а теперь решил сделать это. В качестве примера я возьму ftp сервер - vsftpd, систему - CentOS 7, 8. Рассмотрю несколько разных вариантов настройки - простой и более сложный.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Введение
По моим наблюдениям, популярность ftp серверов с каждым годом падает. Сам я очень редко им пользуюсь и на свои сервера чаще всего не устанавливаю. Так как я работаю с серверами, к которым имею доступ по ssh, необходимости в ftp нет, использую SFTP.
Серьезную конкуренцию ftp создали облачные сервисы для хранения файлов. Чтобы кому-то передать файл, достаточно его расшарить на облачном хранилище и отправить человеку ссылку.
Тем не менее, в некоторых случаях может понадобиться ftp сервер. Доступ к такому серверу часто дают тогда, когда нужно, чтобы к вам кто-то что-то закачал большого объема. Так же ftp доступ дают некоторые хостинг компании, когда вы у них заказываете сервер для бэкапов. Например, ihor, которым я раньше пользовался, предлагает услугу пространство для бэкапа именно по протоколу ftp.
Так что хоть ftp и потерял популярность, но не перестал быть актуальным. Рассмотрим настройку ftp сервера на примере vsftpd. Сделаем несколько конфигураций:
- Самая быстрая и простая. В качестве пользователей ftp будут системные пользователи.
- Более сложная конфигурация, где пользователи будут виртуальные, хранить их будем в отдельном файле.
- Вариант с виртуальными пользователями, но хранить мы их будем в mysql базе.
Работать будем на следующем сервере:
Настройка 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
Все в порядке, можно подключаться клиентом.
Я зашел пользователем root и смог прогуляться по всей файловой системе.
Пользователь 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 ;
Создадим сразу одного пользователя:
> 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, необходимо выполнить несколько изменений по сравнению с основной статьей:
- Параметр tcp_wrappers необходимо отключить, т.е. указать NO. В Centos 8 нет его поддержки. Это касается всех приведенных в статье конфигов.
- Если вы настраиваете виртуальных пользователей vsftpd в Centos 8, то ставить пакет compat-db нет необходимости. Утилита db_load уже есть в системе.
- Модуль 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
Данные можете любые указывать, это не имеет значения. Добавляете в конфиг 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
Теперь можно подключаться и проверять.
При подключении, должно выйти предупреждение о том, что нет возможности проверить сертификат. Надо вручную подтвердить доверие.
Вот и все. Теперь ftp сервером можно безопасно пользоваться, так как данные не передаются в открытом виде. Так что настоятельно рекомендую ssl в ftp настраивать.
Заключение
Мы подробно рассмотрели вопрос использования vsftpd сервера с различной настройкой учетных записей. По мне удобнее всего работать с виртуальными пользователями в локальной, не mysql, базе. Но если используется какая-нибудь панель управления сервером, то удобно засунуть всех пользователей в базу.
Когда я настраивал публичный хостинг, то использовал самописные скрипты для создания каталогов виртуальных хостов, добавления настроек в apache и создание пользователей ftp с доступом к своим сайтам. Там без ftp не обойтись, так как его постоянно просят веб мастера, даже в наше время.
Помогла статья? Подписывайся на telegram канал автора
Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.Видео
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Мучаюсь с ошибкой при подключении:
pam_listfile(vsftpd:auth): Refused user ftp-user for service vsftpd
Может кто сталкивался?
Помогло вот что:
Изменил параметр sense=deny на sense=allow в файле /etc/pam.d/vsftpd
Добавил в конфиг pasv_promiscuous=yes
И на всякий случай пересоздал пользователя ftp-user
Спасибо за полезную информацию.
Отличный гайд по настройке.
Спасибо за статью, но есть вопрос:
добавил пользователя в список chroot_list, и пользователь из списка может выходить за пределы своей папки, но вот в папки других пользователей заходить не может. Подскажите, пожалуйста, как можно это исправить?
А тут уже вступают в силу непосредственно стандартные права на файлы и папки unix. У пользователя просто нет прав на доступ к каталогам других пользователей. Надо ему их дать тем или иным образом. Например, создать группу, в неё добавить этого пользователя, а на каталоги других пользователей сделать права доступа для этой группы.
Спасибо за ответ.
Я тоже подумал про это и добавил пользователя в группы владельца папки, но это не помогло.
Сделал как Вы посоветовали:
Создал группу
Добавил нужного пользователя в эту группу
Назначил группу владельцем папки, но результата это не дало.
Возможно это из-за того что папки Ftp располагаются в папках пользователей в /home , но почему пользователь тогда не видит даже своей папки?
Автор, забыл добавить, что если выходит ошибка 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
Спасибо, друг!
Не большой вопрос по правам доступа.
Требуется дать доступ по FTP к файлам сайта.
Соответственно если сервер запускается от пользователя к примеру apache, то и у папок и файлов должна быть группа и владелец apache иначе скрипты выдают ошибку и не работают.
Как сделать так что бы пользователь мог работать с файлами в каталоге но при этом имел отдельный логин, но файлы измененные или загруженные им оставались принадлежать Apache?
Обычно это делается так. Под конкретный сайт создается отдельный пользователь. Веб сервер запускается от этого пользователя. И под этим же пользователем идет подключение по ftp.
Если такая схема невозможна, то делается немного по-другому. Обычно самому веб серверу нужны права только на чтение файлов, а писать должен уметь интерпретатор php, например php-fpm. Тогда создается отдельный пользователь и группа под сайт. Веб сервер добавляется в эту группу, чтобы он мог читать файлы. А php-fpm запускается от пользователя для сайта, чтобы он мог писать файлы. По ftp тоже идет подключение под этим пользователем.
Спасибо за инструкцию, кучу руководств перепробовал, только у вас самые рабочие мануалы)
Fedora 33 доустановить - dnf install libdb libdb-devel ещё можно libdb-utill
Федору под сервер используете или на рабочей станции понадобилось?
Федору24 под сервер , ну там астериск 17 ещё и гоип sms server - и это кручу на федоре 33 ещё . В общем по разному . От железа зависит на точках.
А почему Федору, а не Centos?
Федора интереснее - скажем как струна пашет, а сентос как рессора гнётся , тоже пашет + по железу у федоры интерестне с драйверами получается, я там и тв делал всякое на разных картах .
SuiteCRM халявное только на федоре 33 серваке .
Добрый день.
Делал все как в статье, Настройка vsftpd с виртуальными пользователями. Пробую подключаться, логин / пароль пропускает, дальше "500 OOPS" cannot change directory:/ftp/test"
Selinux выключен.
В чем может быть проблема?
Разобрался. Опечатка в имени каталога пользователя стоило мне 2 часа убитого времени...
С опечаток стоит начинать любые поверки :) Такие ошибки больше всего времени забирают, так как не решаются привычным поиском в интернете.
Ребята, кто-нить сталкивался с проблемой кириллицы в логах?
--
vsftpd.log
Mon Oct 5 21:20:22 2020 [pid 23470] [ftps] OK UPLOAD: Client "8.8.8.8", "/pubic/??????????????????/.."
А сам сервер то поддерживает кириллицу? Может на нем нет подходящей локали? Добавить можно вот так - https://serveradmin.ru/centos-8-locale-for-language-ru_ru-is-not-found-on-the-server/
В своей практике тоже начинал с vsFTPd , он хорошо и гибко настраивается как для обычных пользователей системы, так и для виртуальных, но потом не хватило некоторых фич, и перешёл сначала на PureFTPd, а потом на ProFTPd.
Критичной лично для меня оказалась фишка перекодирования "на лету" в UTF-8 и cp1251 (в зависимости от ОС клиента), и с ней без танцев с бубном хорошо справился ProFTPd.
Сделал все точно по инструкции. Фаервол выключен. Получаю ошибку 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 глянуть. А ваш коммент был под носом. )
Здравствуйте!
Сделал все по вышеописанной инструкции для 1го случая. Только имя пользователя поменял.
При попытке зайти на ftp-сервер с другого хоста, авторизация проходит корректно, но процесс «reading remote directory” затягивается и приводит к ошибке: Lost connection. Couldn’t retrieve directory listing. Error listing directory ‘/‘.
*подключаюсь через winscp
По команде “systemctl status vsftpd” пишет:
pam_listfile(vsftpd:auth): Couldn’t open /etc/vsftpd/ftpusers
Эту ошибку получилось убрать - просто добавил файл, но изначальную проблему это не решило.
Если делать по инструкции автора статьи, то пользователя 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 юзеров зайти не получилосьююПришлось добавлять простым способом все заработало
Добрый день.
Спасибо за статью, почти все работает в режиме виртуальных пользователей. Но не получается загружать файлы от имени виртуального пользователя по 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
Добрый день!
Подскажите, можно ли настроить vsftpd на работу как с локальными пользователями там и ещё прикрутить авторизацию по доменным учёткам?
Не знаю, никогда не интересовался этим вопросом. Подозреваю, что как-то можно, но не думаю, что это будет просто. С vsftpd давно не работал.
День добрый, я только начал в этом разбираться и прошу помощи, сегодня настраивал ФТП по методу 1, логинится получалось только через root, через простого пользователя не заходило.
Пошел по 2 методу, все заработало, но сейчас интересный вопрос, чтобы удалить виртуального пользователя, необходимо зайти в файл virt_users и удалить его от туда и удалить папку этого пользователя в /ftp/?
Дальше зачем в скрипте прописана строчка - touch /etc/vsftpd/users/$virtuser ? Я так понял это мы можем для каждого пользователя указать какие либо параметры? к примеру домашний каталог, получается у нас могут быть два пользователя на один и тот же каталог но с разными правами? и если не сложно, напишите пожалуйста, как это сделать (что должно быть прописано в файлах конфигурации)
Ответ: 500 OOPS: cannot read user list file:/etc/vsftpd/user_list
Хотя файлик на месте, пробовал его уже и пересоздавать.
sed -i 's,\r,,;s, *$,,' /etc/vsftpd/vsftpd.conf
Допишите пожалуйста в фак (столкнулся с проблемой):
Если при входе локального пользователя (не root) возникает Access Denied нужно прописать путь /sbin/nologin в файле: /etc/shells
Проблема: при подключении извне не переходит в пассивный режим, порты не заблочены провайдером (проверял ставил на них ссш),
фаервол, селинукс выключены (у меня две сетевухи - первая смотрит в мир с реальным 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
прошу прощения, путь к файлу не верен. ниже правильный
cat >> /etc/shells
не знаю с чем связано. но при попытке подключиться к фтп FAIL LOGIN: Client, пишут о pam, что дело в нем
решение:
cat >> /etc/shell
/sbin/nologin
Ctrl+d
systemctl restart vsftpd
пользователь с запретом на shell сможет подключаться к ftp но по SSH не сможет, проверено.
Отличная статья. Спасибо.
вы забыли написать, что в файле /etc/shells должна быть строка /sbin/nologin
Все сделал по инструкции, работает. Но после обновления до CentOS Linux release 7.6.1810 (Core)
не могу подключиться, ошибка total comand 530, нет такого польз. Но при этом по ssh с этим пользователем работаю. Службу sftpd перегрузил.
Пересоздал ftp-шного пользователя, проблема решена.
такая же проблема, только сей фокус не прокатил.
https://serverfault.com/questions/180778/vsftpd-530-login-incorrect
Ответ тут.
vi /etc/pam.d/vsftp
comment #auth required pam_shells.so
Храни Вас Господь!!! Я уже думал с ума сойду.
Здравствуйте!
Всё сделал по инструкции. При запуске так же, как у некоторых, выбивало ошибку, настроил в итоге файл конфигурации по примеру с другого сайта. Получил в итоге всего 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 смогу настроить без проблем))
tcp_wrappers is set to YES but no tcp wrapper support compiled in
Не работает, все делал по шагам по первому варианту... 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)
Всё сделал по инструкции:
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 и там будут эти же команды для просмотра логов запущенных сервисов.
А вообще, я не настаиваю. Если вам кажется официальная документация более понятной и удобной, используйте ее.
Искать проблему в других, а не в себе - дурная привычка. Статья рабочая и по ней многие настроили, в том числе и я.
Респект, очень помогло!
Однако надо бы добавить про настройку firewalld, например
sudo firewall-cmd --permanent --zone=public --add-port=21/tcp
sudo firewall-cmd --permanent --zone=public --add-port=49000-55000/tcp
Ато пришлось потом гуглить почему не удается получить список каталогов, то ли прав не хватало, то ли из-за simlink
Протестировал виртуальных пользователей. Это так задумано что пользователи созданные с помощью скрипта не могут ничего создать у себя в папке или скрипт недоделанный? Ладно если бы все пользователи юзали один каталог задумка была бы интересной, а так...
Сорян. Сам накосячил)) Все норм!
Спасибо за полезную статью. Конфигурация с виртуальными пользователями понравилась. Как найду "железо", на котором подниматься будет, пойдет в бой!
Тестирую первый способ с системным пользователями. Захотелось мне включит анонимуса и столкнулся с такимответм сервера "500 OOPS: vsftpd: refusing to run with writable root inside chroot() " Пните меня в сторону правильного решения сей задачи!
Эта ошибка неплохо гуглится. Вариантов может быть много. Сходу мне приходит в голову мысль о том, что анонимус чрутится в директорию, к которой у него нет доступа.
Ну, когда я оставляю закоментированой строку "anon_root=/ftp" ошибка исчезает и анонимуса кидает вкаталог "/var/ftp" и он там только гость
А права на папку /ftp какие? Для доступа анонимусов надо сделать ей права 777 и проверить.
Так в том то и дело что проверил и перепроверил права на папку. /то первое что я сделал перед тем как написать. И ls -l показывает что на /ftp стоит "drwxrwxrwx"
Получилось разобраться?
Неужели этот мега безопасный фтпсервер не умеет банить айпи при неверном логине\пароле?
Это не задача ftp сервера. Если нужен бан по ip, то это без проблем настраивается с помощью iptables+fail2ban. Для анализа нужно брать лог файл /var/log/vsftpd.log.
Ага, спасибо, так и сделал. Просто видел возможность банить прямо из фтп на proftd.
Кстати, как насчёт веб морды для vsftpd? Есть что-то вменяемое? Webmin модуль устарел не выйдя из беты. А это баженное весьма https://github.com/Tvel/VsftpdWeb
Может будет кому полезно:
При подключении на клиенте появлялась ошибка "500 OOPS: failed to open vsftpd log file" или что-то похожее. Файл действительно был пуст, права -rw-------., юзер root, группа root.
Остановил vsftpd, удалил лог-файл, запустил vsftpd. После этого подключение прошло успешно. Лог-файл, указанный в конфиге, появился сам, видимых отличий в правах доступа к нему я не нашёл, логи в него пишутся.
Спасибо, было полезно!
помогло спасибо
Здравствуйте, стал поклонником вашего сайта, сначала 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/ и пр. но папки которым сам назначал права и владельца нет
В iptables попробуй добавить правило на открытие 21 порта tcp. Мне помогло =)
Всё сделал копипастом (первую часть, мне больше и не надо для стягивания архива), попробовал зайти рутом через Yummy FTP Pro, пишет неверный пароль... как он может быть неверным еcли я с ним сижу в SSH и делаю FTP? )))
ftp-user тоже на свою папку пишет неверный пароль
Что я не так сделал?
Тоже самое выдал
у меня было тоже самое, но после того как я в ручную сделал copy/paste из предоставленного автором файла в свой файл настроек(через putty), то почти все заработало, а почти потому, что нужно настроить se linux, я его просто отключил
П.С. Автор спасибо за твои работы, не раз выручали
Здравствуйте!
Сделал всё, как написано в первой части статьи - "Простая настройка 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, может там будут подсказки, в чем ошибка.