Thank you for reading this post, don't forget to subscribe!
На текущий момент есть две удачные реализации FTP-сервера для Linux: vsFTPd и proFTPd. В данной инструкции речь пойдет о первом, так как его актуальная версия более свежая, в то время, как последняя версия proFTPd выпущена в 2013 году.
Установка и базовая настройка vsFTPd
Обновляем систему:
yum update
Запускаем процесс установки:
yum install vsftpd
После открываем на редактирование следующий файл:
vi /etc/vsftpd/vsftpd.conf
И приводим его к следующему виду:
anonymous_enable=NO
chroot_local_user=YES
allow_writeable_chroot=YES
pasv_min_port=40900
pasv_max_port=40999
* первые две строчки мы редактируем: anonymous_enable разрешает подключение анонимных пользователей, поэтому мы отключаем такую возможность; chroot_local_user запрещает выход за пределы домашней директории пользователя. Третью, четвертую и пятую строки мы дописываем — allow_writeable_chroot разрешает подключения пользователю, у которого есть права на запись в корневую директорию; это диапазон динамических портов, которые будут использоваться vsFTPd. Данный диапазон важно указывать, если используется брандмауэр. Сам диапазон можно задать любой из незарегистрированных портов.
Отключаем SELinux следующими командами:
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
* первая команда отключит SELinux, вторая — отключит его автозапуск после перезагрузки.
Добавляем правила в брандмауэр для корректной работы FTP-сервера:
firewall-cmd --permanent --add-port=20-21/tcp
firewall-cmd --permanent --add-port=40900-40999/tcp
firewall-cmd --reload
Разрешаем автозапуск vsFTPd и запускаем его:
systemctl enable vsftpd
systemctl start vsftpd
По умолчанию, к vsFTPd нельзя подключиться с использованием учетной записи root. Поэтому нужно использовать другую пользовательскую запись или создать новую следующей командой:
useradd ftpuser -d /var/www -s /sbin/nologin
* ftpuser — имя учетной записи; /var/www — домашняя директория; /sbin/nologin запрещает локальный вход в систему.
Задаем пароль новому пользователю:
passwd ftpuser
Базовая настройка закончена — можно пробовать подключаться к FTP-серверу.
vsFTPd через TLS
TLS позволяет настроить безопасный FTP, передача данных через который осуществляется по зашифрованному каналу.
Для начала создаем сертификат:
openssl req -new -x509 -days 1461 -nodes -out /etc/vsftpd/vsftpd.pem -keyout /etc/vsftpd/vsftpd.pem -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=test.test.ru/CN=test"
* в данном примере мы создаем самоподписный сертификат на 4 года для URL test.test.ru или test. Обратите внимание, это один файл, в котором содержится открытый и закрытый ключи.
Открываем на редактирование конфигурационный файл vsFTPd:
vi /etc/vsftpd/vsftpd.conf
И дописываем в него следующее:
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=NO
force_local_logins_ssl=NO
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem
* где ssl_enable разрешает использование шифрования; allow_anon_ssl разрешает использовать SSL анонимным пользователям; force_local_data_ssl требует использования шифрования, и если установить YES, клиенты без шифрования не смогут подключиться; force_local_logins_ssl также требует подключение по SSL; ssl_tlsv1 — использовать TLS версии 1; ssl_sslv2 — использовать SSL версии 2; ssl_sslv3 — использовать SSL версии 3; rsa_cert_file — путь к сертификату.
Перезапускаем FTP-сервер:
systemctl restart vsftpd
Готово.
Виртуальные пользователи
Устанавливаем пакет compat-db:
yum install compat-db
На всякий случай, сохраняем pam файл для авторизации vsftpd:
mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.back
Создаем новый файл со следующим содержимым:
vi /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/virtual_users
account required pam_userdb.so db=/etc/vsftpd/virtual_users
session required pam_loginuid.so
* где /etc/vsftpd/virtual_users — файл, в котором мы будем хранить пользователей.
Открываем конфигурационный файл сервера FTP:
vi /etc/vsftpd/vsftpd.conf
И добавляем следующее:
guest_enable=YES
guest_username=ftp
virtual_use_local_privs=YES
user_sub_token=$USER
local_root=/home/$USER
* где guest_enable разрешает виртуальных пользователей; guest_username — имя системной учетной записи, от которой работаю виртуальные пользователи; virtual_use_local_privs — виртуальные пользователи с такими же привилегиями, что и локальные; user_sub_token — имя учетной записи храниться в переменной $USER; local_root задает домашнюю директорию виртуальному пользователю.
Создаем файл с виртуальными пользователями со следующим содержимым:
vi /etc/vsftpd/virtual_users
ftp1
passwd1
ftp2
passwd2
* где ftp1 и ftp2 — логины; passwd1 и passwd2 — пароли.
Сразу генерируем из файла базу:
db_load -T -t hash -f /etc/vsftpd/virtual_users /etc/vsftpd/virtual_users.db
Необходимо убедиться, что для пользователей есть соответствующие домашние директории:
mkdir /home/ftp{1,2}
И также у системной учетной записи есть соответствующие права:
chown -R :ftp /home/ftp{1,2}
Перезапускаем сервис:
systemctl restart vsftpd
Хранение пользователей в базе данных
В качестве базы данных можно использовать MySQL или MariaDB. В данном примере будет использоваться последняя.
Устанавливаем СУБД следующей командой:
yum install mariadb mariadb-server
Разрешаем автозапуск и запускаем сервис:
systemctl enable mariadb
systemctl start mariadb
Задаем пароль для пользователя root:
mysqladmin -u root password
Запускаем командную оболочку mariadb:
mysql -p
Создаем базу данных и пользователя с правами только на выборку данных:
> CREATE DATABASE vsftpd;
> GRANT SELECT ON vsftpd.* TO 'vsftpd'@'localhost' IDENTIFIED BY 'passwordftp';
* где vsftpd.* разрешает доступ на все таблицы базы vsftpd; 'vsftpd'@'localhost' — учетная запись, у которой есть право подключаться только с локального сервера; passwordftp — пароль для подключения.
Подключаемся к созданной базе и создаем таблицу:
> USE vsftpd;
> CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) NOT NULL ,
`password` VARCHAR( 50 ) NOT NULL ,
UNIQUE (`username`)
) ENGINE = MYISAM ;
Теперь добавим пользователя:
> INSERT INTO users (username, password) VALUES('ftpm1', md5('password'));
* где ftpm1 — логин, password — пароль.
Выходим из оболочки mariadb:
> \q
Устанавливаем модуль pam_mysql:
rpm -Uvh ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/releases/20/Everything/x86_64/os/Packages/p/pam_mysql-0.7-0.16.rc1.fc20.x86_64.rpm
Сохраняем копию pam файла:
mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.back
Создаем новый и приводим его к следующему виду:
vi /etc/pam.d/vsftpd
session optional pam_keyinit.so force revoke
auth required pam_mysql.so user=vsftpd passwd=passwordftp host=localhost db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=3
account required pam_mysql.so user=vsftpd passwd=passwordftp host=localhost db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=3
* где user=vsftpd passwd=passwordftp — логин и пароль для подключения к базе данных; db=vsftpd table=users — имя созданной базы данных и таблицы с пользователями; usercolumn=username passwdcolumn=password — название полей, из которых извлекаем логины и пароли для FTP-пользователей.
Настройка завешена, пробуем подключиться.
Возможные проблемы
Ошибка GnuTLS -15: An unexpected TLS packet was received
Ошибка возникает в том случае, когда у учетной записи, от которой идет подключения есть права на запись в корневую домашнюю директорию, а также используется безопасное соединение через TLS. В vsFTPd, по умолчанию, это приводит к ошибке.
Для решения проблемы воспользуйтесь любым из способов:
- Убираем права на запись для корневой директории, например: chmod a-w /var/www
- В конфигурационном файле vsftpd добавляем следующую строку:
allow_writeable_chroot=YES
Если это не помогло, отключите шифрование, закомментировав строку ssl_enable=YES. После этого, при подключении будут появляться более информативные сообщения.
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Ошибка возникает в том случае, когда у учетной записи, от которой идет подключения есть права на запись в корневую домашнюю директорию. В vsFTPd, по умолчанию, это приводит к ошибке.
Для решения проблемы воспользуйтесь любым из способов:
- Убираем права на запись для корневой директории, например: chmod a-w /var/www
- В конфигурационном файле vsftpd добавляем следующую строку:
allow_writeable_chroot=YES
500 OOPS: cannot change directory:/…
Не существует директории или нет прав на чтение.
Проверьте правильность настроек и то, что директория, действительно существует.
SFTP как альтернатива FTP
Если необходимо разово перенести на сервер данные, можно обойтись протоколом SSH File Transfer Protocol или SFTP. Все, что для этого нужно — доступ по SSH и программа клиент, например, WinSCP.
FTP-клиент на CentOS
Для более удобной проверки настроек можно установить FTP-клиент прямо на сервер и с его помощью выполнять подключения.
Для этого выполняем установку клиента:
yum install ftp
И подключаемся к нашему серверу командой:
ftp localhost
Вводим логин и пароль, которые будут запрошены. После подключения мы увидим следующее:
Trying ::1…
Connected to localhost (::1).
220 (vsFTPd 3.0.2)
Name (localhost:root): ftpm1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>