Шаг 1. Установка vsftpd
Для начала поставим vsftpd:
Код: Выделить всё
$ whereis vsftpd
vsftpd: /usr/ports/ftp/vsftpd
$ cd /usr/ports/ftp/vsftpd
# make && make install
Код: Выделить всё
# cp /usr/local/etc/vsftpd.conf /usr/local/etc/vsftpd.conf.bak
Пришло время настроить наш сервер на корректную работу с пользователями. Открываем файл /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
Нам надо создать файловую структуру сервера. Папка ftp по умолчанию - /var/ftp. Создадим в ней необходимые папки и раздадим корректные права доступа:
Код: Выделить всё
# mkdir /var/ftp/pub
# mkdir /var/ftp/incoming
# chown -R ftp:ftp /var/ftp
# chmod -R 755 /var/ftp
Пришло время создать пару-тройку пользователей для нашего сервера. Процесс создания пользователя состоит из трех этапов - добавление пользователя в систему, создание его конфигфайла и создание его домашней директории.
I этап.
Создаем пользователя:
Код: Выделить всё
# pw useradd -n user_1 -d /var/ftp/incoming/user_1 -s /usr/bin/false
# passwd user_1
Создаем конфигфайл. Конфиг создается в директории, описанной в vsftpd.conf (user_config_dir). Если директория не была создана, то делаем её вручную:
Код: Выделить всё
# mkdir /usr/local/etc/vsftpd_users
Код: Выделить всё
# 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
Осталось создать папку для нашего пользователя и настроить на нее права доступа. Приступаем:
Код: Выделить всё
# mkdir /var/ftp/incoming/user_1
# chmod -R 755 /var/ftp/incoming/user_1
# chown -R user_1:ftp /var/ftp/incoming/user_1
Все почти закончено - осталось лишь запустить наш сервер. Добавляем в /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