VsFTPD виртуальные пользователи (Berkeley DB + PAM)


Настроим 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

Отсутствует доступ к папке. Убедитесь, что имя заданно
правильно, и у вас имеется разрешения на доступ к папке.

Подробности:
Не удается установить связь с сервером


Ошибка 5

В ходе создания новой папки на 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

Share

You may also like...

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

  1. nikit0ss:

    Скажите, сделал все как и написано, только пути папок поменял с /ftp/ на /data/ftp

    захожу с компа из под винды — не принимает логины и пароли,  даже root

     mkdir -p /ftp/{buh,root,fas}

     

    • nikit0ss:

      вот что в логах:
       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.»
       

  2. проверь пути в конфигах пользователей

    • nikit0ss:

      local_root=data/ftp/test
      anon_upload_enable=YES
      anon_mkdir_write_enable=YES
      anon_other_write_enable=YES
      chroot_local_user=YES

    • nikit0ss:

      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 или как там? 

  3. nikit0ss:

    Совсем нет идей? как же так. ваш же конфиг получается не работает…

  4. После написания, не раз возвращался к статье и согласно неё ставил сервер.
    Скорее всего проблема в руках 

     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. придерживайся строго статье и всё будет работать. 

  5. nikit0ss:

    А это нормально?

    [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  ]
     

  6. nikit0ss:

    1.173JIODEU, 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 к сожелению пользователя не помню, и не в этой теме, кто не встретит данной проблемы сёравно рекомендую сделать именно такой скрипт с таким содержанием 

Добавить комментарий для vlad Отменить ответ

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