介紹
FTP(File Transfer Protocol)文件傳輸協議,是用於控制文件的雙向傳輸的應用程序
FTP用戶類型
(1) 匿名用戶:anonymous或ftp
(2) 本地用戶:賬號名稱、密碼等信息保存在passwd/shadow文件中
(3) 虛擬用戶:使用獨立的賬號/密碼數據文件
ftp的工作模式
FTP是僅基於TCP的服務,與衆不同的是FTP協議要用到兩個TCP連接,一個是控制鏈路,用來在客戶端與服務器之間傳遞命令的;另一個是數據鏈路,用來上傳或下載數據的。
FTP協議有兩種工作方式:POST方式(主動式)和PASV方式(被動式)
主動模式:服務端從20端口主動向客戶端發起鏈接
控制端口 21 數據傳輸端口 20
被動模式:服務端在指定範圍內某個端口被動等待及客戶端鏈接
控制端口21 數據傳輸端口 隨機
FTP連接類型配置
Windows Cmd下默認爲主動模式,更改Ftp爲被動的方法:
ftp> quote PASV
Linux Ftp命令下默認爲被動模式,更改爲主動的方法:
ftp> passive
主動與被動FTP優缺點
主動FTP對FTP服務器的管理有利,但對客戶端的管理不利。因爲FTP服務器企圖與客戶端的高位隨機端口建立連接,而這個端口很有可能被客戶端的防火牆阻塞掉。
被動FTP對FTP客戶端的管理有利,但對服務器端的管理不利。因爲客戶端要與服務器端建立兩個連接,其中一個連到一個高位隨機端口,而這個端口很有可能被服務器端的防火牆阻塞掉。
FTP服務器配置
vsftp
FTP的文件傳輸是明文方式,爲了安全誕生了vsftp,vsftpd是一個基於GPL發佈的FTP服務器軟件,安全性高,是RedHat linux默認的FTP服務終端軟件
vsftp特點
(1) 一般以普通用戶運行,降低進程權限,提高安全性
(2) 高權限指令需要上層程序許可
(3) 整合了所有ftp命令
(4) 用戶chroot功能,限制限制用戶只能訪問自己的家目錄
(5) 是RedHat linux默認的FTP服務端軟件
(6) 不再依賴xinetd服務
(7) 可同時容許匿名(anonymous)與本地用戶(local)訪問,還支持虛擬用戶
vsftp連接類型
控制連接:TCP 21,用戶發送FTP命令信息
數據連接:TCP20,用戶上傳,下載數據
vsftp配置文件介紹
配置文件作用 | 配置文件路徑 |
---|---|
vsftpd的可執行文件(主程序) | /usr/sbin/vsftpd |
vsftpd啓動腳本 | /etc/rc.d/init.d/vsftpd |
vsftpd主配置文件 | /etc/vsftpd/vsftpd.conf |
vsftpd的PAM認證文件 | /etc/pam.d/vsftpd |
禁止使用vsftpd的用戶列表文件 | /etc/vsftpd/ftpusers |
禁止或允許使用vsftpd的用戶列表文件 | /etc/vsftpd/user_list |
匿名用戶主目錄 | /var/ftp |
vsftp.conf文件常用的配置參數說明
常用的全局配置
listen_address=192.168.4.1 ;設置監聽的IP地址
listen=YES ;是否以獨立運行的方式監聽服務
listen_port=21 ;設置監聽FTP服務的端口號
write_enable=YES ;是否啓用寫入權限
download_enable=YES ;是否允許下載文件
max_clients=0 ;限制併發客戶端連接數
max_per_ip=0 ;限制同一IP地址的併發連接數
pasv_enable=yes ;設置最小的被動端口號
pasv_min_port=9981 ;設置最小的被動端口號
pasv_max_port=9981 ;設置最大的被動端口號
dirmessage_enable=yes ;是否顯示目錄說明文件
xferlog_enable=yes ;是否記錄ftp傳輸過程
xferlog_file=/var/log/vsftpd.log ;日誌的路徑和名字
xferlog_std_format=yes ;是否使用標準的ftp xferlog
chown_username=username ;是否改變上傳文件的屬主,如果是則需要輸入一個系統用戶
名
idle_session_timeout=600 ;設置默認不活躍session時間
date_connection_timeout=120 ;設置數據傳輸超時時間
ftpd_banner=welcome to ftp server ;定製歡迎信息
本地用戶訪問限制
userlist_enable=YES ;是否啓用user_list列表文件
userlist_deny=YES ;是否禁用user_list中的用戶
本地用戶權限控制
local_enable=YES ;是否啓用本地系統用戶
local_umask=022 ;本地用戶所上傳文件的權限掩碼
local_root=/var/ftp ;設置本地用戶的FTP根目錄
chroot_local_user=YES ;是否將用戶禁錮在主目錄
local_max_rate=0 ;限制最大傳輸速率(字節/秒)
chroot_list_enable=YES ;配合下面的文件使用
chroot_list_file=/etc/vsftpd/chroot_list ;配合使用,列表中的用戶將被禁錮在目錄中
本地用戶的權限除了使用以上的參數控制以外,還可以使用系統的權限進行控制。ftp的權限和系統的權限都允許時纔會放行,只要有一方權限不足使用FTP就會出現權限不足
匿名權限控制
anonymous_enable=YES ;啓用匿名訪問
anon_umask=022 ;匿名用戶所上傳文件的權限掩碼
anon_root=/var/ftp ;匿名用戶的FTP根目錄
anon_word_readable_only=YES ;允許匿名下載
anon_upload_enable=YES ;允許上傳文件
anon_mkdir_write_enable=YES ;允許創建目錄
anon_other_write_enable=YES ;允許匿名登入者更多於上傳或者建立目錄之外的權限,譬如刪除或者重命名,默認值爲NO
anon_max_rate=0 ;限制最大傳輸速率(字節/秒)
(1) 如果anon_upload_enable=NO,則匿名用戶不能上傳文件,但可以刪除或者重命名已經存在的文件
(2) 如果anon_mkdir_write_enable=NO,則匿名用戶不能上傳或者新建文件夾,但可以刪除或者重命名已經存在的文件夾
(3) 匿名用戶賬號名稱默認爲ftp或anonymous,不需要登錄密碼,默認只能下載無法上傳
配置匿名用戶
這裏爲了展示匿名用戶的所有功能才這樣配置,實際中不能這樣配置
(1) 安裝vsftp軟件,並按照下面配置修改配置文件
yum -y install vsftpd
mkdir -p /home/vsftpd/files
chmod -R 755 /home/vsftpd
chmod -R 777 /home/vsftpd/files
cp -p /etc/vsftpd/vsftpd.conf{,.bak} ;備份配置文件
grep -E -v "^#|^$" /etc/vsftpd/vsftpd.conf
anonymous_enable=YES ;啓用匿名訪問
anon_upload_enable=YES ;允許匿名用戶可上傳文件
anon_world_readable_only=NO ;允許匿名用戶可創建目錄
anon_mkdir_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
anon_root=/home/vsftpd/
anon_other_write_enable=YES
service vsftpd restart ;重啓vsftpd服務
注意:FTP的配置要處seLinux防火牆
anon_world_readable_only=NO
只要ftp用戶對文件有讀權限即可下載
anon_world_readable_only=YES
文件的其他人必須有讀的權限才允許下載(安全)
默認情況下,匿名用戶所有上傳下載都使用ftp用戶的權限,若要上傳文件,則需要ftp用戶有寫的權限,若要下載,則需要ftp用戶有讀的權限
(2) 在windows任務管理器測試:在地址欄輸入ftp://IP
,右鍵選擇登錄——>匿名登錄,測試文件的上傳,下載,修改文件夾名等操作
配置本地用戶
系統本地的默認設置
vsftpd默認允許所有的系統用戶都可以訪問FTP,並且要進行身份驗證。但是用系統用戶身份登錄FTP服務器後,默認將位於自己的家目錄中,而不是FTP的主目錄
local_enable=YES ;配置文件中關於系統用戶的默認設置
創建系統用戶,並設置密碼,在家目錄中添加測試文件
useradd anliu01
useradd anliu02
passwd anliu01
passwd anliu02
echo "ftp test" >> /home/anliu01/ftptest.txt
然後在windows的客戶端利用資源管理器測試訪問,在空白界面單擊鼠標右鍵之後選擇“登錄”,輸入用戶名和密碼,就可以進入到用戶的家目錄下,並且具寫入權限
禁錮系統用戶於指定目錄中
Windows客戶端也可以通過ftp命令訪問服務器,由於在命令行模式下模式採用FTP的主動模式,因而此時需要將客戶端的防火牆關閉才能成功訪問
此時,用戶雖然默認訪問的是自己的家目錄,但是卻可以使用cd命令切換到服務器端的任何具備訪問權限的目錄,如切換到/etc/目錄
這樣會存在很大的安全隱患,所以一般都需要將系統用戶禁錮在其家目錄下,禁止隨意切換(系統的所有用戶都將受到限制):chroot_local_user=YES
要對本地用戶查看效果,需先設置local_root=/home/vsftpd
結果如下:
讓特殊用戶擁有目錄的切換權限:chroot_local_user
與chroot_list_enable
參數同時使用
chroot_local_user=YES ;;是否將用戶禁錮在主目錄
chroot_list_enable=YES ;啓用chroot_list_file配置項指定的用戶列表文件(默認NO)
chroot_list_file=/etc/vsftpd/chroot_list ; 指定用戶列表文件
local_root=/var/ftp ;設置本地用戶的FTP根目錄
配置 | 作用 |
---|---|
chroot_local_user=NO chroot_list_enable=NO |
所有用戶均可以切換到上級目錄 |
chroot_local_user=YES chroot_list_enable=NO |
所有用戶均不能切換到上級目錄 |
chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list |
chroot_list文件中列出的用戶,可以切換到上級目錄 |
chroot_local_user=NO chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list |
chroot_list文件中列出的用戶,不能切換到上級目錄 |
(1) 當用戶不允許切換到上級目錄時,登錄後FTP站點的根目錄“/”是該FTP賬戶的主目錄,即文件的系統的/var/ftp目錄
(2) 若設置了write_enable=YES,則用戶還可對根目錄下的文件進行改寫操作
(3) 要對本地用戶查看效果,需先設置local_root=/home/vsftpd
設置用戶列表
在默認的配置下,所有的系統用戶都可以訪問FTP
限定只有指定的用戶可以訪問FTP
配置 | 作用 |
---|---|
/etc/vsftpd/ftpusers | 禁止登陸vsftpd服務器的用戶賬號列表(優先級最高) |
/etc/vsftpd/user_list | 與userlist_enable和userlist_deny設置有關 |
userlist_enable=YES | 啓用user_list,允許user_list中的用戶登錄 |
userlist_enable=YES userlist_deny=YES |
禁止user_list中的用戶登錄 |
userlist_enable=YES userlist_deny=NO |
僅允許列表中的用戶登錄 |
綜合來看,/etc/vsftpd/ftpusers提供一份禁止用戶列表,/etc/vsftpd/user_list提供一份靈活可控的用戶列表,/etc/vsftpd/ftpusers優先級高於/etc/vsftpd/user_list
實例 系統僅允許anliu01用戶登錄vsftpd
#tail -n 3 /etc/vsftpd/vsftpd.conf
local_root=/home/vsftpd/
userlist_enable=YES
userlist_deny=NO
#cat user_list
anliu01
配置虛擬用戶
虛擬用戶,是指存放於獨立數據庫文件中的FTP用戶賬號,可以將他們映射到某個不能登錄的系統用戶賬號上,以進一步增強FTP服務器的安全
(1) 創建虛擬用戶數據庫文件
安裝db_load工具(該工具可以建立Berkeley DB格式的數據庫文件)
yum install epel-release -y
yum install db4-utils -y
創建一個文本格式的用戶名/密碼列表文件,用於存放虛擬用戶賬號
cat /etc/vsftpd/logins.txt
anliu001
123456
anliu002
123456
以文件列表爲數據源通過db_load工具創建出Berkeley DB格式的數據庫文件
[root@nfs01 vsftpd]# db_load -T -t hash -f logins.txt logins.db
db_load命令是一種固定語法
-T:允許非Berkeley DB的應用程序使用從文本格式轉換的DB數據庫文件
-t hash:指定讀取數據文件的基本方法
-f:指定數據的源文件
(2) 創建虛擬用戶的映射賬號
vsftpd服務對虛擬用戶採用映射的控制方式,把所有的虛擬用戶賬號都對應到了同一個系統用戶上,並將這個用戶的家目錄作爲所有虛擬用戶登錄的後公用的FTP主目錄
例如:創建一個用戶virtual,指定家目錄爲/var/ftp/virtual,不允許用戶登錄
useradd -d /var/ftp/virtual -s /sbin/nologin virtual
chmod -R 755 /var/ftp/virtual/ ;改變目錄的權限 ,允許上傳
(3) 創建PAM認證文件
虛擬用戶的認證通過PAM機制實現
PAM是linux系統中的獨立API,它提供了各種驗證模塊以供其他程序調運。當這些程序需要進行用戶身份驗證操作時,就可以直接調運相應的模塊,而無需由自己來提供驗證功能
[root@nfs01 ~]# cat /etc/pam.d/vsftpd
#%PAM-1.0
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/logins
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/logins
(4) 修改vsftpd配置,添加虛擬用戶支持
[root@nfs01 vsftpd]# grep -E -v "^#|^$" 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
guest_enable=YES #啓動虛擬用戶映射功能
guest_username=virtual #定製所映射的系統用戶名稱
pam_service_name=vsftpd #指定PAM認證文件
user_config_dir=/etc/vsftpd/vuser #表示虛擬用戶配置文件的存放目錄
allow_writeable_chroot=YES #去除用戶主目錄的寫權限
(5) 創建虛擬用戶配置文件
爲了對虛擬用戶的精準控制,實現不同用戶有不同權限,我們需要爲每個用戶創建獨立的配置文件
mkdir /etc/vsftpd/vuser
#cat /etc/vsftpd/vuser/anliu001
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#cat /etc/vsftpd/vuser/anliu002
anon_upload_enable=NO ;經測試用戶默認可以下載,若此項設置爲YES,用戶可上傳
在linux中測試
anliu01可以正常的文件上傳與下載(上傳後的文件屬主與屬組是virtual,文件權限是600,不能下載)
anliu02只能下載,不能上傳
練習
1.在Centos 7上構建vsftp服務器。要求採用FTP虛擬用戶方式,添加2個用戶,分別是user01,user02。要求如下:
(1)用戶user01能夠對服務器/var/ftp/soft目錄中的資料管理(上傳,創建目錄,刪除文件等)
(2)用戶user02能夠下載服務器/var/ftp/soft目錄中的資料。
準備工作
yum -y install vsftpd
cp -p /etc/vsftpd/vsftpd.conf{,.bak} ;備份配置文件
yum install epel-release -y
yum install db4-utils -y
systemctl stop firewalld
setenforce 0
步驟一:創建一個文本格式的用戶名/密碼列表文件,用於存放虛擬用戶賬號
[root@nfs01 vsftpd]# vim logins.txt
user01
123456
user02
123456
步驟二:創建數據庫文件logins.db
[root@nfs01 vsftpd]# db_load -T -t hash -f logins.txt logins.db
步驟三:創建虛擬用戶的映射賬號
useradd -d /var/ftp/soft -s /sbin/nologin soft
chmod -R 755 /var/ftp/soft/ ;改變目錄的權限 ,允許上傳
步驟四:創建PAM認證文件
[root@nfs01 ~]# cat /etc/pam.d/vsftpd
#%PAM-1.0
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/logins
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/logins
步驟五:修改vsftpd配置,添加虛擬用戶支持
#vim /etc/vsftpd/vsftpd.conf
guest_enable=YES #啓動虛擬用戶映射功能
guest_username=virtual #定製所映射的系統用戶名稱
pam_service_name=vsftpd #指定PAM認證文件
user_config_dir=/etc/vsftpd/vuser #表示虛擬用戶配置文件的存放目錄
allow_writeable_chroot=YES #去除用戶主目錄的寫權限
anon_umask=022 #不設置,文件默認權限爲600,user02無法下載user01上傳的文件【文件默認不能擁有執行權限】
步驟六:創建虛擬用戶配置文件
mkdir /etc/vsftpd/vuser
#cat /etc/vsftpd/vuser/user01
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#cat /etc/vsftpd/vuser/user02
anon_upload_enable=YES
write_enable=NO
進行測試
2.(1)創建文件resource,對teacher有所有權限,對於student來說有可讀權限;
(2)每個學生有一個賬號(虛擬用戶實現),對應有一個目錄,這個目錄針對學生的賬號以及teacher有所有權限,對其他沒有任何權限。
[root@ftp ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
chroot_local_user=YES
local_root=/home/vsftpd
anon_other_write_enable=YES
[root@ftp ~]# useradd teacher #設置密碼
[root@ftp ~]# useradd student #設置密碼
[root@ftp ~]# mkdir /home/vsftpd
[root@ftp ~]# echo "test" >/home/vsftpd/resource
[root@ftp ~]# chmod -R 745 /home/vsftpd
[root@ftp ~]# chown -R teacher:teacher /home/vsftpd
[root@ftp ~]# chmod 744 /home/vsftpd/resource