Настроим VsFTPd на авторизацию не системных пользователей.
Устанавливаем Berkeley DB и utils:
yum install bd4-utils db4
У меня выдало… что пакета нет и где его брать неизвестно
Нужное нам (Если ссылки не будут работать уточните их по адресу http://mirror.centos.org )
для 6.3 i386
rpm -Uvh http://mirror.centos.org/centos/6.3/os/i386/Packages/db4-utils-4.7.25-17.el6.i686.rpm
для 6.3 x86_64
rpm -Uvh http://mirror.centos.org/centos/6.3/os/x86_64/Packages/db4-utils-4.7.25-17.el6.x86_64.rpm
для 6.0 — 6.2 i386
rpm -Uvh http://mirror.centos.org/centos/6/os/i386/Packages/db4-utils-4.7.25-16.el6.i686.rpm
для 6.0 — 6.2 x86_64
rpm -Uvh http://mirror.centos.org/centos/6/os/x86_64/Packages/db4-utils-4.7.25-16.el6.x86_64.rpm
для 5.6 i386
rpm -Uvh http://mirror.centos.org/centos/5.6/os/i386/CentOS/db4-utils-4.3.29-10.el5_5.2.i386.rpm
для 5.6 x86_64
rpm -Uvh http://mirror.centos.org/centos/5.6/os/x86_64/CentOS/db4-utils-4.3.29-10.el5_5.2.x86_64.rpm
Для 5.5 i386
rpm -Uvh http://vault.centos.org/5.5/os/i386/CentOS/db4-utils-4.3.29-10.el5.i386.rpm
Для 5.5 x86_64
rpm -Uvh http://vault.centos.org/5.5/os/x86_64/CentOS/db4-utils-4.3.29-10.el5.x86_64.rpm
Выбираем из списка db4-utils подходящий для вашей системы и устанавливаем. Если все правильно, то увидите:
[root@localhost ~]# rpm -Uvh http://mirror.centos.org/centos/5.6/os/i386/CentOS/db4-utils-4.3.29-10.el5_5.2.i386.rpm Retrieving http://mirror.centos.org/centos/5.6/os/i386/CentOS/db4-utils-4.3.29-10.el5_5.2.i386.rpm warning: /var/tmp/rpm-xfer.45mmxC: Header V3 DSA signature: NOKEY, key ID e8562897 Preparing... ########################################### [100%] 1:db4-utils ########################################### [100%] [root@localhost ~]#
Устанавливаем vsftpd
yum install vsftpd
Создаем файл где будем хранить пароли пользователей
vi /etc/vsftpd/users.txt
У меня получилось так
test pass test1 pass1
Переконвертируем в базу Беркли ваши логины и пароли
db_load -T -t hash -f /etc/vsftpd/users.txt /etc/vsftpd/users.db
Установим необходимые права на файл
chmod 0600 /etc/vsftpd/users.db
Удалим исходный файл с паролями, НО МЫ ЕГО ПОКА ОСТАВИМ!!!
rm /etc/vsftpd/users.txt
Копируем vsftpd.conf с настройками по умолчанию.
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.default
Редактируем vsftpd.conf
vi /etc/vsftpd/vsftpd.conf
У меня он выглядит так:
# Отключаем анонимных пользователей anonymous_enable=NO # Разрешаем работу локальным юпользователям local_enable=YES write_enable=YES download_enable=YES # папка по умолчанию local_root=/ftp anon_root=/ftp #Делаем chroot для всех локальных пользователей chroot_local_user=YES # список пользователей, которым нельзя на FTP userlist_enable=YES userlist_file=/etc/vsftpd/ftpusers # guest_enable=YES guest_username=ftp # папка для хранения дополнительных конфигов user_config_dir=/etc/vsftpd/users/ virtual_use_local_privs=NO # выставим нужные права chmod_enable=YES nopriv_user=ftp # маска создание и чтение файлов local_umask=022 anon_umask=022 file_open_mode=0777 listen=YES listen_port=21 max_clients=100 max_per_ip=100 max_login_fails=2 pasv_min_port=64000 pasv_max_port=65535 data_connection_timeout=400 idle_session_timeout=400 setproctitle_enable=YES tcp_wrappers=YES force_dot_files=YES ls_recurse_enable=NO pam_service_name=vsftpd.virtual xferlog_enable=YES xferlog_std_format=YES dual_log_enable=YES xferlog_file=/var/log/xferlog vsftpd_log_file=/var/log/vsftpd.log log_ftp_protocol=YES use_localtime=YES ftpd_banner=Wellcome!!!
Создадим PAM файл, который будет использовать нашу базу
vi /etc/pam.d/vsftpd.virtual
И добавим в него следующее:
#%PAM-1.0 auth required /lib/security/pam_userdb.so db=/etc/vsftpd/users account required /lib/security/pam_userdb.so db=/etc/vsftpd/users
Настроим расположение файлов и каталогов для виртуальных пользователей.
mkdir /ftp/
Создадим каталоги для пользователей (берем из /etc/vsftpd/users)
mkdir -p /ftp/{test,test1}
Назначим необходимые права
chown -R ftp:ftp /ftp
Создадим папку для дополнительных конфигов пользователей
mkdir /etc/vsftpd/users
Создадим дополнительный конфиг пользователя(пример на одном, остальные по аналогии):
vi /etc/vsftpd/users/test
Содержимое файла
local_root=/ftp/test anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES chroot_local_user=YES
Делаем ссылку на логи
ln -s /var/log/ /etc/vsftpd/
Добавим запуск сервера при старте системы:
chkconfig vsftpd on
Для интереса проверим теперь уровни запуска:
chkconfig --list vsftpd
Если все правильно, то получаем:
chkconfig --list vsftpd vsftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Запустим
service vsftpd start
Создадим файл
vi /etc/vsftpd/useradd.sh
С содержимым
#! /bin/sh rm -f /etc/vsftpd/users.db db_load -T -t hash -f /etc/vsftpd/users.txt /etc/vsftpd/users.db service vsftpd restart
Назначим права
chmod 775 /etc/vsftpd/useradd.sh
Переходим в папку
cd /etc/vsftpd/
Запускаем скрипт
./useradd.sh
При запуске, получаем
[root@localhost vsftpd]# ./useradd.sh Shutting down vsftpd: [ OK ] Starting vsftpd for vsftpd: [ OK ] [root@localhost vsftpd]#
В итоге мы получаем обновление базы пользователей и перезапуск фтп сервера
Возможные ошибки
Ошибка 1
500 OOPS: cannot change directory:/home/user
Решение
setsebool ftpd_disable_trans 1
Ошибка 2
OOPS: Cannot change directory
Решается одной строкой в «vsftpd.conf»: session_support=«YES»
Ошибка 3
[root@localhost vsftpd]# service vsftpd restart Shutting down vsftpd: [ OK ] Starting vsftpd for vsftpd: 500 OOPS: missing value in config file for: # [FAILED]
Ищите ответ в vsftpd.conf
Ошибка 4
Отсутствует доступ к папке. Убедитесь, что имя заданно правильно, и у вас имеется разрешения на доступ к папке. Подробности: Не удается установить связь с сервером
В ходе создания новой папки на FTP-сервере произошла ошибка. Подробности: 550 Create directory operation failed.
Ошибка 6
В ходе создания новой папки на FTP-сервере произошла ошибка. Подробности: 550 Permission denied.
Ошибки с 4 по 5 решил добавлением правила в iptables и отключением SElinux
Ошибка 7
Starting vsftpd for vsftpd: 500 OOPS: unrecognised variable in config file: convert_charset_enable
Решение:
уберите или настройте следующие параметры
convert_charset_enable=1 local_charset=CP remote_charset=CP
Отключение SElinux
system-config-securitylevel-tui
Выбираем все как на рисунке и нажимаем ОК

Добавляем правила в iptables
Создаем файл
vi /etc/rc.d/rc.firewall
С содержимым
#!/bin/sh WAN_1_IF="eth0" LO_IF="lo" LO_IP="127.0.0.1" # ------- IPT="/sbin/iptables" MODPROBE="/sbin/modprobe" /sbin/depmod -a /sbin/modprobe ip_conntrack_ftp /sbin/modprobe ip_nat_ftp $IPT -F $IPT -t nat -F $IPT -t mangle -F $IPT -X $IPT -P INPUT DROP $IPT -P OUTPUT ACCEPT $IPT -A INPUT -i $LO_IF -j ACCEPT $IPT -A OUTPUT -o $LO_IF -j ACCEPT $IPT -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT $IPT -A INPUT -p TCP --dport 21 -j ACCEPT $IPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT $IPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 64000:65535 -j ACCEPT
Если вы управляете серверов удаленно, то незабываем еще и добавить доступ по SSH
$IPT -A INPUT -p TCP --dport 22 -j ACCEPT
Назначаем права
chmod 775 /etc/rc.d/rc.firewall
Переходим в папку
cd /etc/rc.d/
Запускаем
./rc.firewall
Для автоматического выполнения при запуске добавляем
./etc/rc.d/rc.firewall
в /etc/rc.d/rc.local
Скажите, сделал все как и написано, только пути папок поменял с /ftp/ на /data/ftp
захожу с компа из под винды — не принимает логины и пароли, даже root
mkdir
-p /
ftp
/{buh
,root,fas}
вот что в логах:
Wed Jul 18 15:19:52 2012 [pid 22429] [buh] FTP response: Client «192.168.0.240», «331 Please specify the password.»
Wed Jul 18 15:19:52 2012 [pid 22429] [buh] FTP command: Client «192.168.0.240», «PASS <password>»
Wed Jul 18 15:19:52 2012 [pid 22428] [buh] FAIL LOGIN: Client «192.168.0.240»
Wed Jul 18 15:19:53 2012 [pid 22429] [buh] FTP response: Client «192.168.0.240», «530 Login incorrect.»
firewall не использую. selinux = disabled в конфиге
проверь пути в конфигах пользователей
local_root=data/ftp/test
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
chroot_local_user=YES
local_root=data/ftp/buh
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
chroot_local_user=YES
или где то еще надо проверить?
а надо добавлять этих юзеров в сам centos?
типа add user или как там?
Совсем нет идей? как же так. ваш же конфиг получается не работает…
После написания, не раз возвращался к статье и согласно неё ставил сервер.
Скорее всего проблема в руках
1. под рутом тебя не пустит для этого в конфиге есть
userlist_enable=YES
userlist_file=/etc/vsftpd/ftpusers
2. попробуй ещё раз создать базу пользователей
db_load -T -t hash -f /etc/vsftpd/users.txt /etc/vsftpd/users.db
3. придерживайся строго статье и всё будет работать.
Все строго по статье…
листы ftpusers и user_list — пустые.
базы не раз переделывал. все заново не рас проходил.
есть мысль что у тебя есть пакеты. которых нет у меня. например db4.6-util или что нить подобное, но дял CENTOS я не знаю что за пакет и где его взять.
http://www.ashep.org/2011/vsftpd-i-virtualnye-polzovateli/
No package bd4-utils available.
Package db4-4.7.25-17.el6.x86_64 already installed and latest version
У автора нет ошибки в написании пакета?
Вместо bd4-utils необходимо db4-utils
Будь внимательнее
на пакет db-util в начале статьи есть ссылки
А это нормально?
[root@rusmskfps01 vsftpd]# ./useradd.sh
db_load: unexpected end of input data or key/data pair
db_load: odd number of key/data pairs
Останавливается vsftpd: [ OK ]
Запускается vsftpd для vsftpd: [ OK ]
1.17, 3JIODEU, 12:27, 10/08/2009 [ответить] [смотреть все]
+/–
Теперь в последующих дистрибутивах как ОС так и vsftpd при исполнении скрипта будем видеть ошибку
db46_load: unexpected end of input data or key/data pair
db46_load: odd number of key/data pairs
решение: заменяем в скрипте useradd.sh строки db42_load -T -t hash -f /etc/vsftpd/logins.txt /etc/vsftpd/login.db где db42-не обязательно 42 в зависимости от версии берклея, на
awk -F: ‘{print}’ < /etc/vsftpd/logins.txt | db46_load -T -t hash /etc/vsftpd/login.db как видем тут уже берклей 46 — эта ситуация уже тоже была описанна на opennet к сожелению пользователя не помню, и не в этой теме, кто не встретит данной проблемы сёравно рекомендую сделать именно такой скрипт с таким содержанием