VSFTPD - поднимаем ftp сервер на Linux

vsftpd_linux_serverИтак, перед нами стоит задача, поднять FTP-сервер на который будут заходить как анонимные пользователи (без авторизации), так и пользователи с авторизацией, по логину и паролю, информация о которых будет храниться  в MySQL (виртуальные юзеры) плюс сам протокол будет еще и SSL, тобишь FTPS с использованием сертификата публичного ключа :)
В качестве ftp-демона будем использовать vsftpd, как один из самых продвинутых и надежных ftp-серверов с точки зрения безопасности  в Unix-подобных системах :) Данная заметка поможет вам настроить very secure ftp server.

Для наших целей, вполне подойдет CentOS 6 x64 Minimal. Лично мне, из всех серверных RedHut-дистрибутивов он нравится больше всего, маленький, быстрый, легковесный, ничего лишнего! :) Ну в общем поехали:

1) Настроим сеть, пропишем имя хоста:

vi /etc/sysconfig/network

с — начать редактирование!

NETWORKING=yes
HOSTNAME=centos6

:wq — сохранить и выйти.

Включим DHCP Iface, если в сети имеется работающий DHCP-сервер:

vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=00:0B:56:31:2C:4E
ONBOOT=yes

Если, мы хотим прописать сетевые настройки вручную, то содержимое файла может выглядеть примерно так:

DEVICE=eth0
;BOOTPROTO=dhcp
IPADDR=192.168.1.8
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
GATEWAY=192.168.1.1
HWADDR=00:0B:56:31:2C:4E
ONBOOT=yes
service network restart

Настройки DNS находятся в файле /etc/resolv.conf, указываем свои данные:

nameserver 192.168.1.8
nameserver 192.168.1.9

Проверим Firewall, разрешим нужные службы:

Для удобства будем использовать графическую утилиту:

yum install system-config-firewall-tui
system-config-firewall-tui

Открываем всё, что нужно:

Проапдэйтить OS включая все приложения:

yum –y update

Создадим пользователя и добавим его в группу wheel.

useradd Link -G wheel

либо добавляем, уже существующего пользователя с помощью команды:

gpasswd wheel -a Link

Назначаем пароль:

passwd Link

Ставим все что потребуется для комфортной работы:

yum install sudo wget mc unzip crontabs

Правим /etc/sudoers, где необходимо расскомментировать строчку:

%whell ALL=(ALL) ALL

что означает, что все пользователи входящие в группу wheel могут запускать любые команды от root'а. После чего все административные команды вводятся после sudo с указанием текущего пароля пользователя.

Добавляем RPMForge, крупнейший репозитарий для CentOS:

Для i386:

wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm

Для x86_64:

wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

Посмотреть архитектуру процессора:

uname -i

Делаем импорт ключа:

rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt

Проверяем на наличие ошибок:

rpm -K rpmforge-release-0.5.2-2.el6.rf.*.rpm

Ставим пакет:

rpm -i rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

2) Ставим сам VsFTPd и прописываем его в автозагрузку:

yum install vsftpd
chkconfig vsftpd on

Для начала настроим анонимуса, которому будет позволено из папочки pub читать файлы, а в папочку incoming грузить файлы :) По умолчанию, корневой каталог ftp сервера находится в /var/ftp. Так и оставим. Создадим там еще одну директорию, пропишем права.

mkdir -p /var/ftp/incoming
chmod 007 /var/ftp/incoming/
chmod 005 /var/ftp/pub

В конфиге vsftpd, для успешной авторизации анонимуса и стабильной работы сервера, могут быть следующие параметры:

async_abor_enable=YES
write_enable=YES
download_enable=YES
anonymous_enable=YES
anon_root=/var/ftp/
no_anon_password=YES
anon_world_readable_only=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
anon_umask=022
file_open_mode=0666
listen=YES
listen_port=21
pasv_enable=YES
userlist_deny=YES
pasv_min_port=49151
pasv_max_port=65535
xferlog_enable=YES
xferlog_std_format=YES
xferlog_file=/var/log/vsftpd.log
dirmessage_enable=YES
ftpd_banner=Welcome to Linux-Zombie FTP service.
ftp_username=ftp
ls_recurse_enable=NO
secure_chroot_dir=/var/run/vsftpd
hide_ids=YES
max_clients=50
log_ftp_protocol=YES
chown_upload_mode=0600
chown_uploads=YES
chown_username=ftp
idle_session_timeout=120
data_connection_timeout=300
accept_timeout=60
connect_timeout=60
ascii_upload_enable=YES
ascii_download_enable=YES
guest_enable=yes
guest_username=vsftpd
nopriv_user=vsftpd

Для работы пассивного режима, не забываем открыть на файрволе диапазон tcp портов указанный в конфиге. Подробное описание по каждому из параметров можно подсомотреть вот здесь.

3) Теперь, настроим доступ к серверу при помощи логина и пароля, которые будут хранится в базе MySQL. Для этого, сначала создадим локального пользователя vsftpd, от имени которого будут работать наши виртуальные пользователи ftp:

useradd -d /home/vsftpd -g nobody -s /bin/false vsftpd

что означает, создать пользователя в домашней директории /home/vsftpd (по умолчанию, имеет смысл только если путь будет отличным от /home, поэтому в данном случае можно не указывать) добавив его в непривилегированную группу nobody (x:99) и назначив ему неактивный shell — /bin/false.

К существующему конфигу vsftpd.conf рассмотренному выше, добавляем следующие параметры:

local_enable=YES
virtual_use_local_privs=YES
pam_service_name=vsftpd
user_sub_token=$user
local_root=/home/vsftpd/$user
chroot_local_user=YES

Ставим MySQL:

yum install mysql-server mysql-client

Проверка успешности установки:

rpm -qa | grep -i mysql

Должно вывалится что-то типа этого:

mysql-libs-5.1.61-1.el6_2.1.x86_64
perl-DBD-MySQL-4.013-3.el6.x86_64
mysql-server-5.1.61-1.el6_2.1.x86_64
mysql-5.1.61-1.el6_2.1.x86_64

Автоматический запуск MySQL во время старта.

chkconfig mysqld on

Запускаем службу:

service mysqld start

В процессе запуска, возможно будет на что-то ругаться, не обращаем на это внимание, просто запускаем скрипт, на все вопросы отвечаем да. Данный скрипт  установит новый пароль для root, удалит пользователя anonymous, запретит логинится с удаленных машин под root-ом.

/usr/bin/mysql_secure_installation

Авторизуемся в MySQL:

mysql -u root -p

Создаем базу, в которой будем хранить пользовательские аккаунты:

create database vsftpd;

Показать базы:

show databases;

Использовать базу vsftpd:

use vsftpd;

Дать пользователю vsftpd с паролем mypass доступ к базе vsftpd с минимальными привилегиями.

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'mypass';

Что бы изменения вступили в силу, набираем:

Flush privileges;

Создадим таблицу accounts, состоящую из трех столбцов (id, username, password):

create table accounts (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL, password VARCHAR(50) NOT NULL, UNIQUE (username)) ENGINE = MYISAM;

Проверяем что столбцы добавились в таблицу:

SHOW COLUMNS FROM accounts FROM vsftpd;

Выходим из консоли mysql, набираем в командной строке: \q
Теперь установим пакет pam-mysql, который будет является связующим звеном между VsFTPd и MySQL:

wget http://dl.fedoraproject.org/pub/epel/6/x86_64/pam_mysql-0.7-0.12.rc1.el6.x86_64.rpm
rpm -Uvh pam_mysql-0.7-0.12.rc1.el6.x86_64.rpm

Проверяем установку командой, в списке должны увидеть pam_mysql.so:

ls -al /lib64/security/pam_m*

Отредактируем файл: /etc/pam.d/vsftpd. Закоментируем или удалим все строки, оставив только эти, убедимся что тут только две строки начинающиеся с auth required и account required без переносов:

# For VsFTPd virtual users:
auth required pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=password crypt=2

Перезапустим демон чтобы он загрузил библиотеку pam_mysql.so:

service vsftpd restart

Авторизуемся в Mysql с помощью пользователя Vsftpd и добавим тестового виртуального юзера.

mysql -u vsftpd -p
use vsftpd;
INSERT INTO accounts (username, password) VALUES('link', PASSWORD('link'));
quit

Создадим директорию виртуального пользователя link и пропишем ему нужные права:

mkdir /home/vsftpd/link
chown vsftpd:nobody /home/vsftpd/link

Существенно упростить эту задачу, нам поможет скрипт от Александра Остапова.

cd /home
wget http://sanotes.ru/wp-content/uploads/ftp.zip
unzip ftp.zip

Делаем файлик исполняемым и запускаем его:

chmod +x ftp.sh

Вводим пароль к базе vsftpd  и попадаем в меню, где мы теперь можем создавать пользователей, удалять, просматривать и.т.д.

Итак, пробуем подключится к серверу при помощи виртуального пользователя link  и получаем ошибку:

530 login incorrect

Оно и понятно, здесь постарался SELinux. Что бы убедится, что это действительно так, временно его отключим.

setenforce 0

Для того что бы избирательно настроить SELinux только для FTP-сервера, воспользуемся следующей командной:
Вывести список политик SELinux для ftp:

getsebool -a grep | ftp

В списке доступных политик нас интересуют две: ftp_home_dir и ftpd_connect_db, поэтому разрешаем их командой:

setsebool -P ftp_home_dir on
setsebool -P ftpd_connect_db on

Для полного отключения SElinux (если уже очень хочется, хотя и крайне не рекомендуется =)), правим файлик /etc/selinux/config, где параметру SELINUX задаем disabled, но лучше все таки поставить permissive. Так же полностью отключить SElinux, можно в загрузчике Grub. Правим /boot/grub/grub.conf в конце строки вида: kernel /boot/vmlinuz-2.6.18-92.el5PAE ro root=LABEL=/ rhgb quiet selinux=0 вытавить selinux=0. (либо enforcing=0)

3) Теперь включим поддержку ssl (ftps):

Создадим сертификат:

openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem

Задаем свои параметры ключа. В существующий конфиг vsftpd можно добавить следующее:

ssl_enable=YES
allow_anon_ssl=YES
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem
ssl_ciphers=High

Перезапускаем демон

service vsftpd restart

Проверяем наш сервер:
под Linux, например с помощью lftp:

yum install lftp
lftp -u user -e 'set ftp:ssl-force true' ftp-host

Под виндами:
В FileZilla, Total Commander, WinSCP работает также без проблем.
В FireFTP — плагин для Mozilla Firefox, зависает на 150 Here comes the directory listing, причем Passive Mode заблокирован.

4. Настроим статистику по FTP при помощи анализатора логов AWStats.

Сначала установим и настроим Apache:

yum install httpd

Запуск при старте:

chkconfig httpd on

Редактируем конфиг Apach'a, где находим директиву ServerName и указываем свое значение:

vi /etc/httpd/conf/httpd.conf

Ставим AWstats:

yum install awstats

Создаем новый файл конфигурации, где значение между awstats. и .conf имя вашего домена или ip-адрес сервера  и добавляем в него следующие строки:

vi /etc/awstats/awstats.mydomain.conf
SiteDomain="mydomain"
HostAliases="centos6 192.168.1.8"
LogFile="/var/log/vsftpd.log"
LogType=F
LogFormat="%time3 %other %host %bytesd %url %other %other %method %other %logname %other %code %other %other"
LogSeparator="\s"
NotPageList=""
LevelForBrowsersDetection=0
LevelForOSDetection=0
LevelForRefererAnalyze=0
LevelForRobotsDetection=0
LevelForWormsDetection=0
LevelForSearchEnginesDetection=0
ShowLinksOnUrl=0
ShowMenu=1
ShowSummary=UVHB
ShowMonthStats=UVHB
ShowDaysOfMonthStats=HB
ShowDaysOfWeekStats=HB
ShowHoursStats=HB
ShowDomainsStats=HB
ShowHostsStats=HBL
ShowAuthenticatedUsers=HBL
ShowRobotsStats=0
ShowEMailSenders=0
ShowEMailReceivers=0
ShowSessionsStats=1
ShowPagesStats=PBEX
ShowFileTypesStats=HB
ShowFileSizesStats=0
ShowBrowsersStats=0
ShowOSStats=0
ShowOriginStats=0
ShowKeyphrasesStats=0
ShowKeywordsStats=0
ShowMiscStats=0
ShowHTTPErrorsStats=0
ShowSMTPErrorsStats=0

Для немедленного обновления статистики из браузера можно также добавить параметр:

AllowToUpdateStatsFromBrowser=1

После чего, редактируем /etc/httpd.d/conf/awstats.conf, куда прописываем следующее:

ScriptAlias /awstats/ /var/www/awstats/
DirectoryIndex awstats.pl
Options ExecCGI
order deny,allow
deny from all
allow from 127.0.0.1
allow from your_ip

Alias /classes/ /var/www/awstats/lib/
Alias /icon/ /var/www/awstats/icon/
Alias /css/ /var/www/awstats/css/
Alias /js/ /var/www/awstats/js/
Options ExecCGI -MultiViews +SymLinksIfOwnerMatch

где, your_ip — адрес компьютера с которого необходимо разрешить доступ к статистике.

Restart service httpd

Генерим статистику:

/var/www/awstats/awstats.pl -update -config=mydomain

где, вместо mydomain, подставляем своё имя домена или айпи адрес сервера/машины.

Для обновления статистики в автоматическом режиме добавляем эту команду в cron.

crontab -e

Например, обновлять статистику каждые 30 минут:

*/30 * * * * /var/www/awstats/awstats.pl -update -config=mydomain

Просмотреть задание:

crontab -l

Для просмотра сгенерированной статистики достаточно набрать в браузере:
http://mydomain/awstats/awstats.pl

2 комментария VSFTPD — поднимаем ftp сервер на Linux

  • Denis

    скрипт от Александра Остапова выдает ошибку при попытке создания пользователя :

    Введите пароль для нового пользователя ftp:

    chown: invalid group: `vsftpd:nogroup'

    Ошибка добавления пользователя test_user

    а при попытке удаления :

    Введите логин удаляемого пользователя: test_user

    tar: Removing leading `/' from member names

    /home/vsftpd/test_user/

    mv: cannot create regular file `/srv/vsftpd_back/': Is a directory

    Ошибка удаления пользователя test_user

    где может быть косяк?

    • admin admin

      Denis, уже точно не помню что там и как, т.к. в 2012 году все это дело настраивал :) Но судя по ошибке «chown: invalid group: `vsftpd:nogroup’» скрипт ругается на то что пользователь «vsftpd» не принадлежит группе «nogroup», т.к. согласно статье у нас этот пользователь добавлен в группу «nobody». Поэтому попробуйте в скрипте поменять группу на «nobody» и запустить заново. (ftp_group=nobody #Группа vsftpd). По второй части, а чего вы удаляете test_user, если еще не создали его?!

Оставить ответ

Войти с помощью: 

Вы можете использовать эти HTML тэги

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

  

  

  

*