服務部署—— Vsftpd 服務器

作者:Escape

鏈接:https://www.escapelife.site/posts/8dc56d36.html

目錄

一 文件傳輸協議

1.1 FTP 協議概述

一般來講,人們將計算機聯網的首要目的就是獲取資料,而文件傳輸是一種非常重要的獲取資料的方式。今天的互聯網是由幾千萬臺個人計算機、工作站、服務器、小型機、大型機、巨型機等具有不同型號、不同架構的物理設備共同組成的,而且即便是個人計算機,也可能會裝有WindowsLinuxUNIXMac等不同的操作系統。爲了能夠在如此複雜多樣的設備之間解決問題解決文件傳輸問題,文件傳輸協議(FTP)應運而生。

FTP 是一種在互聯網中進行文件傳輸的協議,基於客戶端 / 服務器(C/S)模式,默認使用2021號端口,其中端口 20(數據端口)用於進行數據傳輸,端口 21(命令端口)用於接受客戶端發出的相關 FTP 命令與參數。

FTP 服務器普遍部署於內網中,具有容易搭建、方便管理的特點。而且有些 FTP 客戶端工具還可以支持文件的多點下載以及斷點續傳技術,因此 FTP 服務得到了廣大用戶的青睞。

1.2 FTP 工作模式

FTP 服務器是按照 FTP 協議在互聯網上提供文件存儲和訪問服務的主機,FTP 客戶端則是向服務器發送連接請求,以建立數據傳輸鏈路的主機。FTP 協議有下面兩種工作模式。

防火牆一般是用於過濾從外網進入內網的流量,因此有些時候需要將 FTP 的工作模式設置爲主動模式,纔可以傳輸數據。但是因爲客戶端主機一般都設有防火牆,會禁止服務器的連接請求,所有適當的 iptables 規則變得越來越重要了。

1.3 FTP 服務程序

由於 FTP 是一種基於(C/S)客戶端/服務器模式的協議,所有有很多的程序能夠提供 FTP 服務的功能。

服務端程序

pureftp 是免費和安全的 FTP 服務器,它注重效率和易用性。

客戶端程序

FTP 服務的響應碼

1xx: 信息

2xx: 成功類的狀態碼

3xx: 提示需進一步提供補充類信息的狀態碼

4xx: 客戶端錯誤

5xx: 服務端錯誤

二 vsftpd 服務程序

vsftpd(非常安全的 FTP 守護進程) 是一款運行在 Linux 操作系統上的 FTP 服務程序,不僅完全開源而且免費,此外,還具有很高的安全性、傳輸速度,以及支持虛擬用戶驗證等其他 FTP 服務程序具備的特點。

2.1 安裝服務

[root@localhost ~]# yum install vsftpd
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分輸出信息………………
================================================================================
Installing:
vsftpd x86_64 3.0.2-9.el7 rhel 166 k
Transaction Summary
================================================================================
Install 1 Package
vsftpd.x86_64 0:3.0.2-9.el7
Complete!

[root@linuxprobe ~]# yum install ftp
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分輸出信息………………
Install 1 Package
ftp.x86_64 0:0.17-66.el7
Complete!
# iptables防火牆管理工具默認禁止了FTP傳輸協議的端口號
[root@localhost ~]# iptables -F
# 程序的主配置文件爲/etc/vsftpd/vsftpd.conf
[root@localhost ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

2.2 配置文件

這裏主要說的是,CentOS6 中的配置文件位置,在 CentOS7 中有可能不同。

2.3 配置參數

常用配置參數都爲主配置文件,/etc/vsftpd/vsftpd.conf 的常用配置。

三 vsftpd 認證模式

vsftpd 作爲更加安全的文件傳輸的服務程序,允許用戶以三種認證模式登錄到 FTP 服務器上。

3.1 匿名訪問模式

vsftpd 服務程序默認開啓了匿名開放模式,我們需要做的就是開放匿名用戶的上傳、下載文件的權限,以及讓匿名用戶創建、刪除、更名文件的權限。

# 匿名訪問模式主配置文件
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
# 重啓服務
[root@localhost ~]# systemctl restart vsftpd

# 服務程序加入到開機啓動項中,以保證服務器在重啓後依然能夠正常提供傳輸服務
[root@localhost ~]# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
# 在vsftpd服務程序的匿名開放認證模式下,其賬戶統一爲anonymous,密碼爲空
# 連接到FTP服務器後,默認訪問的是/var/ftp目錄,我們可以在其中進行創建、刪除等操作
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): anonymous
331 Please specify the password.
Password:此處敲擊回車即可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
550 Permission denied.
# 系統顯示拒絕創建目錄,這是爲什麼呢?
# 查看該目錄的權限得知,只有root管理員纔有寫入權限,開放ftp用戶權限(該賬戶在系統中已經存在)
[root@localhost ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 root root 16 Jul 13 14:38 /var/ftp/pub

[root@localhost ~]# chown -Rf ftp /var/ftp/pub
[root@localhost ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 ftp root 16 Jul 13 14:38 /var/ftp/pub

[root@localhost ~]# ftp 192.168.10.10
………………省略部分輸出信息………………
ftp> mkdir files
550 Create directory operation failed.
# 我們發現還是無法創建目錄,發現是SELinux服務在搗亂了
# 使用getsebool命令查看與FTP相關的SELinux域策略都有哪些
[root@localhost ~]# getsebool -a | grep ftp
ftp_home_dir --> off
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off

# 根據經驗和策略的名稱判斷出是ftpd_full_access--> off策略規則導致了操作失敗
[root@localhost ~]# setsebool -P ftpd_full_access=on

# 此時,匿名用戶就可以正常使用FTP服務了
[root@linuxprobe ~]# ftp 192.168.10.10
………………省略部分輸出信息………………
ftp> mkdir files
257 "/pub/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> exit
221 Goodbye.

3.2 本地用戶模式

如果大家之前用的是匿名開放模式,現在就可以將它關了,然後開啓本地用戶模式。

# 本地用戶模式主配置文件
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO

local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
connect_from_port_20=YES
listen=NO
listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
xferlog_enable=YES
xferlog_std_format=YES
# 同樣需要重啓服務和開機自啓動
[root@localhost ~]# systemctl restart vsftpd

# 服務程序加入到開機啓動項中,以保證服務器在重啓後依然能夠正常提供傳輸服務
[root@localhost ~]# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
# 現在已經完全可以本地用戶的身份登錄FTP服務器了,但是使用root無法登陸
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): root
530 Permission denied.
Login failed.
ftp>

# 這是因爲,爲了系統的安全,默認禁止root等用戶登錄FTP服務被系統拒絕訪問
# 因爲vsftpd服務程序所在的目錄中,默認存放着兩個名爲用戶名單的文件,ftpusers和user_list
# 在ftpusers和user_list兩個用戶文件中將root用戶刪除就可以登錄了
[root@localhost ~]# cat /etc/vsftpd/user_list
root
bin
daemon

[root@localhost ~]# cat /etc/vsftpd/ftpusers
root
bin
daemon
# 在採用本地用戶模式登錄FTP服務器後,默認訪問的是該用戶的家目錄,因此不存在寫入權限不足的情況
# 如果不關閉SELinux,則需要再次開啓SELinux域中對FTP服務的允許策略
[root@localhost ~]# setsebool -P ftpd_full_access=on

# 即可以使用系統用戶進行FTP服務的登錄了
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): escape
331 Please specify the password.
Password:此處輸入該用戶的密碼
230 Login successful.
Remote system type is UNIX.

3.3 虛擬用戶模式 (文本文件)

認證模式:vsftpd + pam + file

# 編輯虛擬用戶文件
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# vim vuser.list
zhangsan
redhat
lisi
redhat
# 明文信息既不安全,也不符合讓vsftpd服務程序直接加載的格式
# 因此需要使用db_load命令用哈希算法將原始的明文信息文件轉換成數據庫文件
# 降低數據庫文件的權限,然後再把原始的明文信息文件刪除
[root@localhost vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@localhost vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)

[root@localhost vsftpd]# chmod 600 vuser.db
[root@localhost vsftpd]# rm -f vuser.list
[root@localhost ~]# useradd -d /var/ftproot -s /sbin/nologin virtual

[root@localhost ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/

[root@localhost ~]# chmod -Rf 755 /var/ftproot/
#新建一個用於虛擬用戶認證的PAM文件vsftpd.vu
#PAM文件內的db=參數爲使用db_load命令生成的賬戶密碼數據庫文件的路徑,但不用寫數據庫文件的後綴

[root@localhost ~]# vim /etc/pam.d/vsftpd.vu
auth       required     pam_userdb.so    db=/etc/vsftpd/vuser
account    required     pam_userdb.so    db=/etc/vsftpd/vuser
# 我們要做的就是把vsftpd主配置文件中原有的PAM認證文件vsftpd修改爲新建的vsftpd.vu文件即可
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
pam_service_name=vsftpd.vu
user_config_dir=/etc/vsftpd/vusers_dir

local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
userlist_enable=YES
tcp_wrappers=YES
[root@localhost ~]# mkdir /etc/vsftpd/vusers_dir/
[root@localhost ~]# cd /etc/vsftpd/vusers_dir/

[root@localhost vusers_dir]# touch lisi

[root@localhost vusers_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
# 先按照前面實驗中的步驟開啓SELinux域的允許策略,以免再次出現操作失敗的情況
[root@localhost ~]# setsebool -P ftpd_full_access=on

[root@localhost ~]# getsebool -a | grep ftp
ftp_home_dir –> off
ftpd_anon_write –> off
ftpd_connect_all_unreserved –> off
ftpd_connect_db –> off
ftpd_full_access –> off
ftpd_use_cifs –> off
ftpd_use_fusefs –> off
ftpd_use_nfs –> off
ftpd_use_passive_mode –> off
httpd_can_connect_ftp –> off
httpd_enable_ftp_server –> off
sftpd_anon_write –> off
sftpd_enable_homedirs –> off
sftpd_full_access –> on
sftpd_write_ssh_home –> off
tftp_anon_write –> off
tftp_home_dir –> off
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): lisi
331 Please specify the password.
Password:此處輸入虛擬用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Permission denied.
ftp> exit
221 Goodbye.
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): zhangsan
331 Please specify the password.
Password:此處輸入虛擬用戶的密碼
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.

3.4 虛擬用戶模式 (MySQL 數據庫)

認證模式:vsftpd + pam + mysql

# 安裝mysql和pam_mysql,pam_mysql由epel源提供
$ yum -y install vsftpd mysql-server mysql-devel pam_mysql
# 1、準備數據庫及相關表

首先請確保mysql服務已經正常啓動。而後,按需要建立存儲虛擬用戶的數據庫即可,這裏將其創建爲vsftpd數據庫
mysql> create database vsftpd;

授權vsftpd用戶可以通過localhost主機操作select權限vsftpd庫的所有表,密碼爲www.escapelife.com
mysql> grant select on vsftpd.* to vsftpd@localhost identified by 'www.escapelife.com';
mysql> grant select on vsftpd.* to vsftpd@127.0.0.1 identified by 'www.escapelife.com';
mysql> flush privileges;

(這裏是本機安裝所有授權localhost主機,如果不同需要使用不同的主機地址)
(mysql> grant select on vsftpd.* to vsftpd@'192.168.31.%' identified by 'www.escapelife.com';)
(mysql> flush privileges;)

創建相關表
mysql> use vsftpd;
mysql> create table users (
    -> id INT UNSIGNED AUTO_INCREMENT NOT NULL,
    -> name VARCHAR(50) BINARY NOT NULL,
    -> password char(48) BINARY NOT NULL,
    -> PRIMARY KEY(id)
    -> );
# 2、添加測試的虛擬用戶

根據需要添加所需要的用戶,需要說明的是,這裏將其密碼爲了安全起見應該使用PASSWORD函數加密後存儲
mysql> INSERT INTO users(name, password) VALUES('tom', password('escapelife'));
mysql> INSERT INTO users(name, password) VALUES('bob', password('escapelife'));
SELETC * FROM user;
# 1.建立pam認證所需文件

$ vi /etc/pam.d/vsftpd.mysql
添加如下兩行,主要32位和64位庫文件的不同位置,模塊路徑可不寫表示pam模塊路徑
指定用戶、密碼、主機、數據庫、表、用戶名字段、密碼字段、密碼的加密方式
密碼的加密方式可以通過安裝的pam_mysql的文檔查看,/usr/share/doc/pam_mysql-0.7/README   rpm -ql pam_mysql
auth required /lib64/security/pam_mysql.so user=vsftpd passwd=www.escapelife.com host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /lib64/security/pam_mysql.so user=vsftpd passwd=www.escapelife.com host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

(auth required /lib64/security/pam_mysql.so user=vsftp passwd=www.escapelife.com host=192.168.31.71 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2)
(account required /lib64/security/pam_mysql.so user=vsftp passwd=www.escapelife.com host=192.168.31.71 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2)

注意:由於mysql的安裝方式不同,pam_mysql.so基於unix sock連接mysql服務器時可能會出問題,此時,建議授權一個可遠程連接的mysql並訪問vsftpd數據庫的用戶。
# 2.修改vsftpd的配置文件,使其適應mysql認證

建立虛擬用戶映射的系統用戶及對應的目錄
$ useradd -s /sbin/nologin -d /var/ftproot vuser
$ chmod go+rx /var/ftproot

請確保/etc/vsftpd.conf中已經啓用了以下選項
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
chroot_local_user=YES

而後添加以下選項
guest_enable=YES
guest_username=vuser

並確保pam_service_name選項的值如下所示
pam_service_name=vsftpd.mysql
# 啓動vsftpd服務
$ service vsftpd start
$ chkconfig vsftpd on

# 查看端口開啓情況
$ netstat -tnlp | grep :21
tcp      0      0 0.0.0.0:21      0.0.0.0:*      LISTEN      23286/vsftpd

# 使用虛擬用戶登錄,驗證配置結果
$ ftp localhost
# vsftpd可以在配置文件目錄中爲每個用戶提供單獨的配置文件以定義其ftp服務訪問權限,每個虛擬用戶的配置文件名同虛擬用戶的用戶名。配置文件目錄可以是任意未使用目錄,只需要在vsftpd.conf指定其路徑及名稱即可。

# 1、配置vsftpd爲虛擬用戶使用配置文件目錄
$ vim vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_config

# 2、創建所需要目錄,併爲虛擬用戶提供配置文件
$ mkdir /etc/vsftpd/vusers_config/
$ cd /etc/vsftpd/vusers_config/
$ touch tom bob

# 3、配置虛擬用戶的訪問權限
# 虛擬用戶對vsftpd服務的訪問權限是通過匿名用戶的相關指令進行的
# 如果需要讓tom用戶具有上傳文件的權限,可以修改/etc/vsftpd/vusers_config/tom文件
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/wpJce7R1tvANdUvKoUg5Ww