Начало > Помощен център > Cloud сървъри > Администрация на сървър > CentOS 7 - инсталиране на FTP сървър vsftpd

CentOS 7 - инсталиране на FTP сървър vsftpd

Помощен център

CentOS 7 - инсталиране на FTP сървър vsftpd

FTP (File Transfer Protocol) е стандартен мрежов протокол клиент-сървър, който позволява на потребителите да прехвърлят файлове към и от отдалечен сървър.

В статията ще инсталираме VSFTPD (very secure ftp daemon) на CentOS 7, който е популярен, стабилен, сигурен, бърз и лесен за конфигуриране FTP сървър. Ще конфигурираме vsftpd да ограничи достъпа на потребителите до домашната им директория и ще криптираме връзката с SSL/TLS като за целта ще генерираме самоподписан SSL сертификат.

Инсталиране на vsftpd

vsftpd е наличен в официалното хранилище на пакети на CentOS 7 и може да се инсталира директно с пакетния мениджър YUM. Но, следвайки добрите практики, преди това ще актуализираме кеша на хранилището със следната команда:

sudo yum makecache

Инсталираме vsftpd с познатата команда:

sudo yum install vsftpd

[commonuser@centos7 ~]$ sudo yum install vsftpd
...
Installed:
  vsftpd.x86_64 0:3.0.2-25.el7
Complete!
[commonuser@centos7 ~]$

Ако след инсталацията проверим статусът на vsftpd ще забележим, че ФТП сървъра е с деактивиран (disabled) и неактивен (inactive) статус:

sudo systemctl status vsftpd

[commonuser@centos7 ~]$ sudo systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[commonuser@centos7 ~]$

Затова ръчно стартираме vsftpd:

sudo systemctl start vsftpd

и го добавяме към списъка с програми, които стартират заедно със сървъра:

sudo systemctl enable vsftpd

Нова проверка на vsftpd статуса ни показва, че FTP сървъра е активиран (enabled) и активен (active):

[commonuser@centos7 ~]$ sudo systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2019-08-08 09:25:02 EEST; 3min 15s ago
 Main PID: 1605 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           └─1605 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Aug 08 09:25:02 centos7 systemd[1]: Starting Vsftpd ftp daemon...
Aug 08 09:25:02 centos7 systemd[1]: Started Vsftpd ftp daemon.

Конфигуриране на vsftpd

В CentOS 7 всички конфигурационни файлове на vsftpd се намират в директория /etc/vsftpd. Основният конфигурационен файл е /etc/vsftpd/vsftpd.conf и повечето от следващите промени ще направим в този файл.

FTP достъп

Ще разрешим достъп до FTP сървъра само на локалните потребители, затова намираме директивите anonymous_enable и local_enable и им даваме следните стойности:

anonymous_enable=NO

local_enable=YES

Активиране на upload

Премахваме символът за коментар (#) пред настройката write_enable, за да разрешим промени във файловата система, като качване и изтриване на файлове.

write_enable=YES

Chroot jail

Chroot jail е начин да се изолира процес и неговите дъщерни процеси от останалата част от системата. По този начин потребителите няма да имат достъп до файлове, извън тяхната домашна директория. За целта премахваме коментара пред директивата за chroot:

chroot_local_user = YES

Когато chroot е активиран, vsftpd ще откаже да качва файлове, ако директорията, в която потребителите са заключени, има права за писане - по този начин се предотвратяват уязвимости в сигурността.

За да разрешим upload при активиран chroot добавяме следните записи в /etc/vsftpd/vsftpd.conf:

user_sub_token=$USER

local_root=/home/$USER/ftp

allow_writeable_chroot=YES

Ограничаване на потребителите

За да разрешим само на определени потребители да влизат в FTP сървъра, добавяме следните редове след реда userlist_enable:

userlist_file=/etc/vsftpd/user_list

userlist_deny=NO

Защита на връзката със самоподписан SSL/TLS сертификат

В статията ще генерираме самоподписан SSL сертификат, използвайки командата openssl. Следващата команда ще създаде 2048-битов частен ключ и самоподписан сертификат, валиден за 10 години. И частният ключ, и сертификатът ще бъдат записани в един и същ файл vsftpd.pem:

[commonuser@centos7 ~]$ sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
[sudo] password for commonuser:
Generating a 2048 bit RSA private key
...........................................................................+++
........................+++
writing new private key to '/etc/vsftpd/vsftpd.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:BG
State or Province Name (full name) []:Sofia
Locality Name (eg, city) [Default City]:Sofia
Organization Name (eg, company) [Default Company Ltd]:ICN
Organizational Unit Name (eg, section) []:ICN HelpDesk
Common Name (eg, your name or your server's hostname) []:localhost
Email Address []:admin@localhost
[commonuser@centos7 ~]$ sudo ls -l /etc/vsftpd/
...
-rw-r--r--. 1 root root 3111 Aug  8 10:29 vsftpd.pem
[commonuser@centos7 ~]$

Не е задължително да попълвате информация в полетата, въведете само точка (.) и те ще останат празни. Може да въведете и произволна информация като в примера.

Въвеждаме коректния път до файла vsftpd.pem в директивите *rsacertfile и rsaprivatekey_file, и задаваме стойност YES на директивата ssl_enable*:

rsa_cert_file=/etc/vsftpd/vsftpd.pem

rsa_private_key_file=/etc/vsftpd/vsftpd.pem

ssl_enable=YES

Рестартиране на vsftpd

След като приключите с редактирането, конфигурационният файл /etc/vsftpd/vsftpd.conf (без коментарите) трябва да изглежда така:

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
listen=NO
allow_writeable_chroot=YES
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_file=/etc/vsftpd/user_list
userlist_deny=NO
tcp_wrappers=YES
user_sub_token=$USER
local_root=/home/$USER/ftp
rsa_cert_file=/etc/vsftpd/vsftpd.pem
rsa_private_key_file=/etc/vsftpd/vsftpd.pem
ssl_enable=YES

Запазваме информацията с Ctrl+O и Enter и затваряме файла с Ctrl+X. Рестартираме FTP сървъра за да активираме промените:

sudo systemctl restart vsftpd

Отваряне на FTP портовете в защитната стена

Със следната команда разрешаваме трафика през посочените в /etc/vsftpd/vsftpd.conf портове 20 и 21:

sudo firewall-cmd --permanent --zone=public --add-port=20-21/tcp

и рестартираме защитната стена firewalld:

sudo firewall-cmd --reload

Настройване на директорията за качване ftp

Създаваме ръчно директория ftp в домашната директория на потребителя, променяме нейната собственост и задаваме коректни права на директорията със следните три команди (заменете username с действително потребителско име в системата):

sudo mkdir -p /home/username/ftp/

sudo chown -R username:username /home/username/ftp

sudo chmod 550 /home/username/ftp

Свързване през vsftpd

Време е да тестваме дали имаме защитен достъп през FTP до нашия CentOS 7 сървър. Отваряме най-популярната FTP програма FileZilla. Преди да въведете данните за достъп уверете се, програмата е настроена да работи в active mode в менюто Edit > Settings > FTP:

FileZilla настройване на active mode

След това въвеждаме за име на сървър IP адреса на сървъра, потребител и парола и кликаме бутона Quickconnect:

Status: Connecting to 192.168.1.10:21...
Status: Connection established, waiting for welcome message...
Status: Initializing TLS...
Status: Verifying certificate...
Status: TLS connection established.
Status: Logged in
Status: Retrieving directory listing...
Status: Directory listing of "/" successful

След успешно свързване през криптирана TLS връзка се зарежда директорията ftp на потребителя, точно според настройките в /etc/vsftpd/vsftpd.conf и вече може да трансферираме файлове между сървъра и компютъра.