Решил сотворить что-то сам, причем полнофункционально и полезно работающее. А именно - сделать FTP сервер с возможностью логинов под зарегистрированными пользователями. И не просто логином. Зарегистрированные пользователи должны иметь определенные привилегии перед анонимными - они могут совершать в своей папке любые действия, причем не могут перемещаться выше своей папки на сервере (т.е. могут изменять только свою папку и файлы). Анонимные же пользователи имеют право на скачивание общедоступных и личных файлов зарегистрированных пользователях и загрузку своих файлов только в определенный каталог, не имея при этом права на изменение общедоступных файлов и файлов других пользователей.
Итак, что нам требуется от сервера:
1. Возможность логина под анонимным пользователем;
2. Возможность логина под зарегистрированным пользователем;
3. Анонимные пользователи могут скачивать общедоступные файлы и личные файлы пользователей;
4. Анонимные пользователи могут загружать свои файлы в определенные(ый) каталог(и), при этом не имея возможности удалять общедоступные, личные и собственные файлы;
5. Зарегистрированные пользователи могут загружать свои файлы на сервер и производить с ними любые действия;
6. Зарегистрированные пользователи не имеют доступа никуда, кроме своей папки, т.е. могут изменять
только свои папки и файлы, но не общедоступные, анонимные или папки и файлы других пользователей.
Все, с задачами определились, будем их реализовывать
1. Установка и настройка vsFTPd
В первую очередь нам необходимо установить и настроить корректным образом сам FTP сервер. Будем использовать сервер vsFTPd. Пакет с сервером называется аналогично -
vsftpd. Устанавливаем сервер (установка может отличаться от вашей ОС, здесь приведена установка для ALT Linux 4.0):
Код:
# apt-get update
# apt-get install vsftpd
Сервер установили, теперь настроим его нужным нам образом (месторасположение и название конфигурационного файла зависит от используемой вами ОС, здесь приведена настройка для ALT Linux 4.0):
/etc/vsftpd.conf
Код:
### Настройки запуска сервера ###
# Если вы не хотите запускать сервер через xinetd, то раскомментируйте следующие две строки
#listen=yes
#listen_port=21
# Принимать подключения с порта 20
connect_from_port_20=yes
### Настройки логина пользователей ###
# Разрешаем вход анонимным пользователям
anonymous_enable=yes
# Не спрашиваем пароль у анонимов
no_anon_password=yes
# Разрешаем вход локальным пользователям
local_enable=yes
# Закрываем пользователей в их домашнем каталоге
chroot_local_user=yes
# Каталог настроек пользователей
user_config_dir=/etc/vsftpd/user_conf
### Настройки прав доступа к файлам/папкам ###
# Маска доступа для файлов, загруженных локальными пользователями: 755 (см. пояснение ниже)
local_umask=0022
# Маска доступа для файлов, загруженных анонимами: 557 (см. пояснение ниже)
anon_umask=0220
# Режим открытия файлов: eXecutable (см. пояснение ниже)
file_open_mode=0777
### Настройки пассивного режима ###
# Включаем возможность использования пассивного режима
pasv_enable=yes
# Нижняя граница портов для пассивного режима
pasv_min_port=50000
# Верхняя граница портов для пассивного режима
pasv_max_port=50100
### Настройки лимитов ###
# Максимальное количество подключений для одного пользователя: 3 (для каждого пользователя можно будет настроить индивидуально, см. настройку ниже)
max_per_ip=3
### Настройки файловых операций ###
# Разрешаем любые формы записи на сервер
write_enable=yes
# Разрешаем загрузку файлов анонимными пользователями
anon_upload_enable=yes
# Разрешаем анонимным пользователям создавать каталоги
anon_mkdir_write_enable=yes
# Разрешаем анонимам видеть не только world readable only файлы
anon_world_readable_only=no
### Разные настройки ###
# Отключаем показ сообщений при входе в директории
dirmessage_enable=no
### Настройки журналирования ###
xferlog_enable=yes
2. Настройка пользователей
Так, с конфигурацией сервера закончили. Теперь расшарим некоторые ресурсы на сервере и реализуем логин зарегистрированных пользователей.
Для начала исправим домашние каталоги некоторых системных пользователей, которые отвечают за функционирование FTP сервера (опять же зависит от используемой вами ОС, настройка приведена для ALT Linux 4.0):
Код:
# usermod -d /var/ftp ftp
# usermod -d /var/ftp vsftpd
Двигаемся дальше. Создадим некоторую структуру каталогов на сервере: share - для общедоступных файлов, distrib - для дистрибутивов, music - для музыки, incoming - для личных файлов пользователей:
Код:
# mkdir /var/ftp/share
# mkdir /var/ftp/distrib
# mkdir /var/ftp/music
# mkdir /var/ftp/incoming
После создания каталогов FTP наполните их соответствующими данными, за исключением каталога, выделенного жирным цветом в листинге. Этот каталог предназначается для хранения личных файлов пользователей и файлов, закачанных анонимами.
Теперь настала пора создать пару-тройку пользователей и настроить им доступ в их каталоги с определенными правами. Для примера приведем настройку для 2 пользователей. В процесс добавления пользователя на FTP входит его добавление в систему, задание пароля для этого пользователя, создание домашней папки пользователя, создание конфигурационного файла для пользователя и раздача ему определенных прав. Пойдем по порядку. Создаем системного пользователя, сразу назначая ему некоторые параметры:
Код:
$ FUNAME=user01
# useradd -d /var/ftp/incoming/$FUNAME -g ftp $FUNAME
Последней командой мы создаем пользователя, имя которого назначается временной переменной FUNAME (ее мы определяем для удобства). Если всмотреться внимательно, то мы увидим, что в качестве домашней папки пользователя используется папка в /var/ftp/incoming, имя которой совпадает с именем пользователя. Именно для этого мы используем временную переменную, дабы не вписывать одно и то же несколько раз. На самом деле имя домашней папки пользователя может быть любое, папка даже может располагаться вне /var/ftp/incoming, но если вы хотите использовать иное имя папки, то это потребует внесения небольших изменений в конфигурационный файл пользователя. Так, хватит с теорией, продолжаем настройку
. Если программа добавления пользователя не создала его домашний каталог, то сделаем это за нее:
Код:
# mkdir /var/ftp/incoming/$FUNAME
Надо задать пароль для пользователя (длина пароля должна быть не менее 4 символов):
Теперь вычистим личную папку пользователя от всего мусора, которые создает команда useradd:
Код:
# rm -rf /var/ftp/incoming/$FUNAME/*
Сделали. Теперь создадим еще одного пользователя и настроим конфигурационные файлы каждого:
Код:
$ FUNAME=user02
# useradd -d /var/ftp/incoming/$FUNAME -g ftp $FUNAME
# mkdir /var/ftp/incoming/$FUNAME
# passwd $FUNAME
# rm -rf /var/ftp/incoming/$FUNAME/*
Второго пользователя мы создали, переходим к настройке конфигурационных файлов. В конфигурации vsFTPd при помощи директивы user_config_dir мы указывали папку настроек пользователей. Если она не существует, то создадим ее, а если существует - вычистим от существующих файлов и создадим свои. Используем ту папку, которая определена директивой user_config_dir в /etc/vsftpd.conf:
Код:
# mkdir /etc/vsftpd/user_conf
# rm -rf /etc/vsftpd/user_conf/*
Для каждого зарегистрированного пользователя на FTP создаем одноименный с именем пользователя файл настройки в папке конфигураций пользователей и переделываем под соответствующие нужды. В большинстве случаев конфигурационные файлы одинаковые, однако возможно вы захотите настроить те или иные параметры для каждого пользователя:
/etc/vsftpd/user_conf/user01
Код:
# Локальный каталог для пользователя
local_root=/var/ftp/incoming/user01
# Разрешаем пользователю совершать остальные действия в его папке
anon_other_write_enable=yes
# Для этого пользователя уберем лимит подключений с одного IP-адреса
max_per_ip=0
/etc/vsftpd/user_conf/user02
Код:
# Локальный каталог для пользователя
local_root=/var/ftp/incoming/user02
# Разрешаем пользователю совершать остальные действия в его папке
anon_other_write_enable=yes
# А вот для этого пользователя лимит мы установим равным 10
max_per_ip=10
# И включим показ сообщений при входе в директории:
dirmessage_enable=yes
С конфигурацией пользователей покончили, переходим к раздаче локальных прав доступа
3. Настройка локальных прав доступа
Кроме того, что мы настроили права доступа пользователей на сервере, мы должны задать соответствующие права на локальной файловой системе для всего FTP сервера. Реализуем это:
Код:
# chown -R ftp.ftp /var/ftp // владельцем всего каталога и подкаталогов FTP сервера будет являться пользователь ftp.ftp
# chmod -R 555 /var/ftp // права доступа на весь каталог и подкаталоги выставляем только чтение и выполнение
# chmod -R 557 /var/ftp/incoming // но для каталога входящих файлов делаем возможность записи для всех "левых" пользователей
$ FUNAME=user01 // теперь выставляем права для первого нашего пользователя
# chown -R $FUNAME.ftp /var/ftp/incoming/$FUNAME // владельцем своего домашнего каталога является сам же пользователь
# chmod -R 755 /var/ftp/incoming/$FUNAME // запись в каталог разрешаем только самому его владельцу - пользователю
$ FUNAME=user02 // настал черед второго пользователя
# chown -R $FUNAME.ftp /var/ftp/incoming/$FUNAME // тут все аналогично
# chmod -R 755 /var/ftp/incoming/$FUNAME // и тут тоже ничего не меняется
Теперь вспомним, зачем мы задавали права доступа в конфигурационном файле vsFTPd. Если мы хотим, чтобы права доступа сохранялись при изменении пользователями своих папок, то мы вынуждены настроить соответствующие директивы в /etc/vsftpd.conf, а именно - anon_umask (настройка режимов доступа для файлов анонимов), local_umask (настройка режимов доступа для файлов локальных пользователей) и file_open_mode (настройка режимов открытия файлов). Настройка этих директив была приведена выше, и поэтому настраивать их снова не нужно.
В принципе, на этом настройка завершена. Перезагружаем vsFTPd (зависит от ОС):
если сервер запускается через xinetd
Код:
# service xinetd restart
если сервер запускается вручную
Код:
# /etc/init.d/vsftpd restart
или
Код:
# killall vsftpd
# vsftpd &
Теперь тестируем наш сервер. Для этого можно воспользоваться любым FTP-клиентом, например lftp. Проверяем возможности и функции, которые мы хотели реализовать, а именно - права доступа анонимов, возможность логина зарегистрированных пользователей, права зарегистрированных пользователей, возможность скачивания/загрузки файлов и т.п. Если все было настроено корректно, то вы получите полностью рабочий FTP-сервер с дополнительным функционалом, чего мы и хотели добиться
А если у вас ничего не получилось, то пишите в этой теме - поможем решить ваши проблемы
ПРИЛОЖЕНИЕ
Для того, чтобы автоматизировать процессы добавления-удаления пользователей, напишем скрипты для выполнения этих задач (некоторые переменные и функции зависят от используемых вами настроек и ОС, они выделены жирным):
/etc/vsftpd/userconf.tmpl
Код:
local_root=/var/ftp/incoming/USER
anon_other_write_enable=yes
max_per_ip=0
/usr/local/bin/uftpadd
Код:
#!/bin/bash
# Скрипт добавления пользователей FTP
# Переменные
USERCONF_DIR=/etc/vsftpd/user_conf # папка настроек пользователей FTP
USERS_DIR=/var/ftp/incoming # папка домашних директорий пользователей FTP
USERCONF_TMPL=/etc/vsftpd/userconf.tmpl # шаблон настроек пользователя (можно изменить в соответствии со своими потребностями), конечный файл настройки можно будет изменить позже
USERGROUP=ftp # группа пользователей FTP
# Установка имени пользователя
if [ -z $1 ]; then
echo -n "Username: "
read USERNAME
else
USERNAME=$1;
fi
# Создание пользователя
useradd -d $USERS_DIR/$USERNAME -g $USERGROUP $USERNAME
# Создание пароля для пользователя
passwd $USERNAME
# Очистка папки пользователя
rm -rf $USERS_DIR/$USERNAME/*
# Раздача прав доступа для папки пользователя
chown -R $USERNAME.$USERGROUP $USERS_DIR/$USERNAME
chmod -R 755 $USERS_DIR/$USERNAME
# Создание конфигурационного файла для пользователя
USERCONF_FILE=$USERCONF_DIR/$USERNAME
sed -e "s!USER!$USERNAME!g" $USERCONF_TMPL > $USERCONF_FILE
# Перезагрузка xinetd/vsftpd
service xinetd restart
exit 0
/usr/local/bin/uftpdel
Код:
#!/bin/bash
# Скрипт удаления пользователя FTP
# Переменные
USERCONF_DIR=/etc/vsftpd/user_conf # папка настроек пользователей
USERS_DIR=/var/ftp/incoming # папка домашних директорий пользователей
# Установка имени пользователя
if [ -z $1 ]; then
echo -n "Username: "
read USERNAME
else
USERNAME=$1;
fi
USER_DIR=$USERS_DIR/$USERNAME
if [ ! -d $USER_DIR ]; then
echo "Username is invalid. Halted."
exit 6
fi
# Удаление пользователя
userdel $USERNAME
# Удаление папки пользователя
rm -rf $USERS_DIR/$USERNAME
# Удаление конфигурационного файла для пользователя
rm -f $USERCONF_DIR/$USERNAME
# Перезагрузка xinetd/vsftpd
service xinetd restart
exit 0
Выставим права на исполнение для наших скриптов:
Код:
# chmod +x /usr/local/bin/uftpadd
# chmod +x /usr/local/bin/uftpdel
Все, теперь процесс добавления/удаления пользователей можно производить гораздо проще, вводя только имя и пароль пользователя. Скрипты можно запускать как с параметрами, так и без:
Код:
# uftpadd user01
# uftpadd
Username: user01
Код:
# uftpdel user01
# uftpdel
Username: user01