Страница 1 из 1

Статья: vsftpd + system users

Добавлено: 2010-11-28 21:06:01
freesky
Решил поделиться своим опытом настройки ftp-сервера vsftpd. В данном варианте настройки я предлагаю вам реализовать ftp-пользователей, используя системных. Быть может кому-нибудь да пригодится.

Шаг 1. Установка vsftpd
Для начала поставим vsftpd:

Код: Выделить всё

$ whereis vsftpd
vsftpd: /usr/ports/ftp/vsftpd
$ cd /usr/ports/ftp/vsftpd
# make && make install
Заранее скопируем конфигурационный файл vsftpd, чтобы в случае чего вернуть все на место:

Код: Выделить всё

# cp /usr/local/etc/vsftpd.conf /usr/local/etc/vsftpd.conf.bak
Шаг 2. Настройка vsftpd.conf
Пришло время настроить наш сервер на корректную работу с пользователями. Открываем файл /usr/local/etc/vsftpd.conf и приводим его к такому виду:

Код: Выделить всё

# пусть наш сервер слушает 21 порт...
listen=yes
# ...и работает в бэкграунде
background=yes

# разрешаем анонимов и не спрашиваем их пароль
anonymous_enable=yes
no_anon_password=yes
# разрешаем локальных пользователей...
local_enable=yes
# ...и запираем их в своей директории
chroot_local_user=yes
# папка конфигов пользователей
user_config_dir=/usr/local/etc/vsftpd_users
# юзер, от которого работают анонимы (создается при установке vsftpd)
ftp_username=ftp
# запрещаем пользователям менять права доступа на файлы
chmod_enable=no

# все файлы анонимы будут сохранять с маской 777 (все всем разрешено)
file_open_mode=0777
# настраиваем права доступа на закачиваемые файлы
anon_umask=022
local_umask=022

# включим возможность работы в пассивном режиме
pasv_enable=yes
# указываем диапазон портов для пассивного режима:
# sysctl net.inet.ip.portrange.first
# sysctl net.inet.ip.portrange.last
pasv_min_port=49152
pasv_max_port=65535

# для анонимов поставим ограничение на число подключений
max_per_ip=5

# разрешаем запись на сервер...
write_enable=yes
# ...и разрешаем анонимам закачивать файлы и...
anon_upload_enable=yes
# ...создавать директории
anon_mkdir_write_enable=yes
# запрещаем остальные действия с записью (удаление, переименование итп)
anon_other_write_enable=no
# пусть анонимы видят все файлы на сервере
anon_world_readable_only=no

# не будем показывать пользователям сообщение папки
dirmessage_enable=no

# включаем логирование
xferlog_enable=yes
Шаг 3. Создание структуры сервера
Нам надо создать файловую структуру сервера. Папка ftp по умолчанию - /var/ftp. Создадим в ней необходимые папки и раздадим корректные права доступа:

Код: Выделить всё

# mkdir /var/ftp/pub
# mkdir /var/ftp/incoming
# chown -R ftp:ftp /var/ftp
# chmod -R 755 /var/ftp
Шаг 4. Настройка пользователей
Пришло время создать пару-тройку пользователей для нашего сервера. Процесс создания пользователя состоит из трех этапов - добавление пользователя в систему, создание его конфигфайла и создание его домашней директории.

I этап.
Создаем пользователя:

Код: Выделить всё

# pw useradd -n user_1 -d /var/ftp/incoming/user_1 -s /usr/bin/false
# passwd user_1
II этап.
Создаем конфигфайл. Конфиг создается в директории, описанной в vsftpd.conf (user_config_dir). Если директория не была создана, то делаем её вручную:

Код: Выделить всё

# mkdir /usr/local/etc/vsftpd_users
Теперь создаем конфиг, имя которого представляет собой имя нашего свежесозданного пользователя. Следуя примеру это будет /usr/local/etc/vsftpd_users/user_1. Сразу же впишем основные настройки для нашего юзера (значения параметров см. в вышеприведенном vsftpd.conf):

Код: Выделить всё

# touch /usr/local/etc/vsftpd_users/user_1
# echo "local_root=/var/ftp/incoming/user_1" >> /usr/local/etc/vsftpd_users/user_1
# echo "anon_other_write_enable=yes" >> /usr/local/etc/vsftpd_users/user_1
# echo "max_per_ip=0" >> /usr/local/etc/vsftpd_users/user_1
III этап.
Осталось создать папку для нашего пользователя и настроить на нее права доступа. Приступаем:

Код: Выделить всё

# mkdir /var/ftp/incoming/user_1
# chmod -R 755 /var/ftp/incoming/user_1
# chown -R user_1:ftp /var/ftp/incoming/user_1
Шаг 5. Запуск сервера
Все почти закончено - осталось лишь запустить наш сервер. Добавляем в /etc/rc.conf строчку, которая будет ответственна за запуск vsftpd:

Код: Выделить всё

# echo "vsftpd_enable="YES"" >> /etc/rc.conf
Перезагружаемся и проверяем работоспособность сервера. Вот и все

Приложение
Чтобы удобнее было работать с пользователями на ftp, создадим небольшой скриптик:
/usr/local/bin/uftp

Код: Выделить всё

#!/bin/sh
pw="/usr/sbin/pw"
hdir="/var/ftp/incoming/"
cmnt=" ftp user"
cdir="/usr/local/etc/vsftpd_users/"

if [ "$#" = 0 ]; then
    echo "Usage: $0 add|delete [uname] [homedir]|[-r] [comment]";
else
    case "$1" in                                                                                                                                             
                                                                                                                                                             
    [aA][dD][dD])                                                                                                                                            
        if [ -z "$2" ]; then                                                                                                                                 
            echo -n "Username: "                                                                                                                             
            read username                                                                                                                                    
            if [ -z "$username" ]; then                                                                                                                      
                echo "Username field is empty."                                                                                                              
                exit 1                                                                                                                                       
            fi                                                                                                                                               
        else                                                                                                                                                 
            username=$2                                                                                                                                      
        fi                                                                                                                                                   

        if [ -z "$3" ]; then
            echo -n "Home directory: "
            read homedir
            if [ -z "$homedir" ]; then
                homedir=$hdir$username
            fi
        else
            homedir=$3
        fi

        if [ -z "$4" ]; then
            echo -n "Comment: "
            read comment
            if [ -z "$comment" ]; then
                comment=$username$cmnt
            fi
        else
            comment=$4
        fi

        if [ ! -d "$homedir" ]; then
            mkdir $homedir
            rm -rf $homedir/*
        fi

        ${pw} useradd -n $username -c $comment -d $homedir -s /usr/bin/false
        passwd $username

        chown -R $username:ftp $homedir
        chmod -R 755 $homedir
        touch $cdir$username
        echo "local_root=$homedir" > $cdir$username
        echo "anon_other_write_enable=yes" >> $cdir$username
        echo "max_per_ip=0" >> $cdir$username

        echo "$username has been created"
        ;;

    [dD][eE][lL][eE][tT][eE])
        if [ -z "$2" ]; then
            echo -n "Username: "
            read username
            if [ -z "$username" ]; then
                echo "Username field is empty."
                exit 1
            else
                ${pw} userdel $username
                rm -f $cdir$username
                echo "$username has been deleted."
            fi
        else
            if [ "$3" = "-r" ]; then
                ${pw} userdel $2 -r
            else
                ${pw} userdel $2
            fi
            rm -f $cdir$2
            echo "$2 has been deleted."
        fi
        ;;

    *)
        echo "Usage: $0 add|delete [uname] [homedir]|[-r] [comment]"
        ;;

    esac
fi

exit 0
Заделаем его исполнимым:

Код: Выделить всё

# chmod +x /usr/local/bin/uftp
Теперь можно добавлять/удалять пользователей посредством команд:

Код: Выделить всё

# uftp add
# uftp delete
Статья

Re: Статья: vsftpd + system users

Добавлено: 2011-01-21 23:03:25
Alex Keda
скрипты свои лучше класть куданить в /root/scrips и добавлять этот путь в $PATH
раскидывать левые файлы где попало - не есть гуд

Re: Статья: vsftpd + system users

Добавлено: 2011-03-30 11:30:42
andik
Доброго времени суток.
У меня появилась задача поднять аналогичный ftp сервер (vsftpd + системные пользователи), но у меня структура немного иная и отсюда вылезло несколько вопросов.
# mkdir /var/ftp/pub
# mkdir /var/ftp/incoming
mkdir /usr/local/ftp/
mkdir /usr/local/ftp/usr1
mkdir /usr/local/ftp/usr2
mkdir /usr/local/ftp/usrn

должен существовать администратор, которому будут доступны все пользовательские директории на чтение и запись, в свою очередь пользователи могут видеть только свою директорию, т.е. никакой записи/чтения соседей быть не должно, тут вроде бы все просто(chroot).

Но если создать некоего ftpadmin и ftpuser1,ftpuser2 с общей группой, то становится понятно, что он(admin) читать/писать будет, но проблема в другом - юзверь всё равно сможет сделать файлу chmod 700/500/400 и тогда admin обломинго.
Как быть в такой ситуации?
Сколько не искал какую-нибудь директиву, которая задает суперпользователя, но ничего похожего не нашел. Плохо искал или делается как-то иначе?

Re: Статья: vsftpd + system users

Добавлено: 2011-03-30 19:32:40
andik
вот что придумалось к концу дня.

Код: Выделить всё

listen=YES
background=YES
connect_from_port_20=YES

pasv_enable=yes
pasv_min_port=50000
pasv_max_port=51100

anonymous_enable=NO
local_enable=YES
user_config_dir=/etc/vsftpd/user_conf

write_enable=YES
local_umask=077

chown_uploads=YES
chown_username=ftpadm

chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/vsftpd.chroot_list
chmod_enable=NO

xferlog_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
dirmessage_enable=NO
ftpd_banner="Welcome to My  FTP service."
настройка юзера ftp

Код: Выделить всё

pw usermod ftp -d /usr/local/ftp 
структура каталогов
  • /usr/local/ftp
    /usr/local/ftp/ftpuser

Код: Выделить всё

cat /etc/vsftpd/user_conf/ftpuser
local_root=/usr/local/ftp/ftpuser
anon_other_write_enable=yes
max_per_ip=20
chmod_enable=NO
local_umask=0775

Код: Выделить всё

cat /etc/vsftpd/user_conf/ftpadm
local_root=/usr/local/ftp
anon_other_write_enable=yes
max_per_ip=0
chmod_enable=YES


Что получилось?

ftpadm видит все директории от корня, но не видит файлов в /usr/local/ftp/ftpuser
В этой же директории не может создать ни файл, ни папку

ftpuser создает файлы с правами 700, а хотелось бы с 775.

Немного про права:

Код: Выделить всё

srv# ls -la
total 8
drwxrwxr-x   4 ftpadm   ftp    512 Mar 30 20:30 .
drwxr-xr-x  20 root     wheel  512 Mar 30 19:12 ..
drwxrwxr-x   3 ftpuser  ftp    512 Mar 30 20:02 ftpuser
drwx------   2 ftpadm   ftp    512 Mar 30 20:30 test


Подскажите пожалуйста, где я был не прав?

Re: Статья: vsftpd + system users

Добавлено: 2011-03-30 19:40:45
andik
да, забыл указать

Код: Выделить всё

srv# cat  /etc/vsftpd/vsftpd.chroot_list
ftpadm
srv#