VSFTPD - поднимаем ftp сервер на Linux
Итак, перед нами стоит задача, поднять 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 https://rpmfind.net/linux/RPM/dag/redhat/el6/x86_64/rpmforge-release-0.5.2-2.el6.rf.x86_64.html
Делаем импорт ключа:
rpm -i https://mirrors.cloud.tencent.com/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://github.com/anthcourtney/pam-mysql/blob/master/pam_mysql-0.7-0.16.rc1.el7.centos.x86_64.rpm rpm -Uvh pam_mysql-0.7-0.12.rc1.el6.src.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