Заметки сисадмина
Назад

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

Опубликовано: 04.05.2012
Время на чтение: 67 мин
2
2138

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

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

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

NETWORKING=yes 
HOSTNAME=centos6

Задействуем DHCP Iface, если в сети имеется работающий DHCP-сервер:

DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=00:0B:56:31:2C:4E
ONBOOT=yes

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

DEVICE=eth0
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:

wget http://repository.it4i.cz/mirrors/repoforge/redhat/el6/en/x86_64/dag/RPMS/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

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

rpm -i http://repository.it4i.cz/mirrors/repoforge/RPM-GPG-KEY.dag.txt

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

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. Так и оставим. Создадим там еще одну директорию, пропишем права.

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 в автозагрузку и запускаем службу:

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 https://download.fedoraproject.org/pub/epel/6/SRPMS/Packages/p/pam_mysql-0.7-0.12.rc1.el6.src.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 https://sanotes.ru/wp-content/uploads/ftp.zip
unzip ftp.zip

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

chmod +x ftp.sh

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

Итак, пробуем подключится к серверу при помощи виртуального пользователя link  и получаем ошибку: 530 login incorrect
Оно и понятно, здесь постарался SELinux. Что бы убедится, что это действительно так, временно его отключим.

setenforce 0

Для того что бы избирательно настроить 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

Проверяем наш сервер, например с помощью 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 - адрес компьютера с которого необходимо разрешить доступ к статистике. Перезапускаем Apache:

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

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

, ,
Поделиться
Похожие записи