FTP(File Transfer Protocol)文件傳輸協議
FTP 是 TCP/IP 協議組中的協議之一。該協議是Internet文件傳送的基礎,它由一系列規格說明文檔組成,目標是提高文件的共享性,提供非直接使用遠程計算機,使存儲介質對用戶透明和可靠高效地傳送數據。簡單的說,FTP就是完成兩臺計算機之間的拷貝,從遠程計算機拷貝文件至自己的計算機上,稱之為“下載(download)”文件。若將文件從自己計算機中拷貝至遠程計算機上,則稱之為“上傳(upload)”文件。在TCP/IP協議中,FTP標準命令TCP端口號為21,Port方式數據端口為20。
兩類連接:
命令連接:傳輸命令
數據連接:傳輸數據
兩種模式:
主動模式:PORT
Server: 20/tcp連接客戶端的命令連接使用的端口向后的第一個可用端口
被動模式:PASV
Server:打開一個隨機端口,并等待客戶端連接
主動FTP:
命令連接:客戶端 >1023端口 -> 服務器 21端口
數據連接:客戶端 >1023端口 <- 服務器 20端口
被動FTP:
命令連接:客戶端 >1023端口 -> 服務器 21端口
數據連接:客戶端 >1023端口 -> 服務器 >1023端口
很多防火墻在設置的時候都是不允許接受外部發起的連接的,所以許多位于防火墻后或內網的FTP服務器不支持PASV模式,因為客戶端無法穿過防火墻打開FTP服務器的高端端口;而許多內網的客戶端不能用PORT模式登陸FTP服務器,因為從服務器的TCP 20無法和內部網絡的客戶端建立一個新的連接,造成無法工作。
PAM(Pluggable Authentication Modules )可插拔認證模塊:
PAM是由Sun提出的一種認證機制。它通過提供一些動態鏈接庫和一套統一的API,將系統提供的服務和該服務的認證方式分開,使得系統管理員可以靈活地根據需要給不同的服務配置不同的認證方式而無需更改服務程序,同時也便于向系統中添加新的認證手段。
PAM支持的四種管理界面:
1、認證管理(authenticationmanagement)
主要是接受用戶名和密碼,進而對該用戶的密碼進行認證,并負責設置用戶的一些秘密 信息。
2、帳戶管理(accountmanagement)
主要是檢查帳戶是否被允許登錄系統,帳號是否已經過期,帳號的登錄是否有時間段的 限制等等。
3、密碼管理(passwordmanagement)
主要是用來修改用戶的密碼。
4、會話管理(sessionmanagement)
主要是提供對會話的管理和記賬(accounting)。
vsftpd
vsftpd (very secure FTP daemon),安全性是它的一個最大的特點。vsftpd 是一個UNIX類操作系統上運行的服務器的名字,它可以運行在諸如 Linux、BSD、Solaris、HP-UNIX等系統上面,是一個完全免費的、開放源代碼的ftp服務器軟件,支持很多其他的 FTP 服務器所不支持的特征。比如:非常高的安全性需求、帶寬限制、良好的可伸縮性、可創建虛擬用戶、支持IPv6、速率高等。
vsftpd以ftp用戶的身份運行進程,默認認用戶即為ftp用戶,匿名用戶的默認路徑即ftp用戶的家目錄/var/ftp
程序環境:
主程序:/usr/sbin/vsftpd
主配置文件:/etc/vsftpd/vsftpd.conf
數據根目錄:/var/ftp
Systemd Unit File(系統單元文件):/usr/lib/systemd/system/vsftpd.service
[root@localhost ~]#yum -y install vsftpd (安裝vsftpd)[root@localhost ~]#systemctl start vsftpd.service (啟動)[root@localhost ~]#ps auxroot 5808 0.0 0.0 52708 564 ? Ss 07:42 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf[root@localhost ~]#ss -tnl (查看端口)LISTEN 0 32 :::21 :::*
配置vsftpd
用戶類別:
匿名用戶:anonymous –> ftp,/var/ftp
系統用戶:禁止系統用戶訪問ftp服務,/etc/vsftpd/ftpusers,PAM(/etc/pam.d/vsftpd)
虛擬用戶:非系統用戶,用戶賬號非為可登錄操作系統的用戶賬號(非/etc/passwd)
匿名用戶:
[root@localhost ~]#yum -y install lftp (安裝lftp)[root@localhost ~]#lftp 172.16.250.149 (主機1)lftp anonymous@172.16.250.149:/> lftp -u ftp 172.16.250.149lftp 172.16.250.149:/> lftp -u anonymous 172.16.250.149lftp 172.16.250.149:~> ls口令:lftp ftp@172.16.250.149:~> lsdrwxr-xr-x 2 0 0 6 Nov 05 2016 pub [root@localhost ~]#cp /etc/issue /var/ftp/pub/[root@localhost ~]#cd /var/ftp/pub/[root@localhost /var/ftp/pub]#chown ftp.ftp issue [root@localhost ~]#lftp -u rookie 172.16.250.149 主機2Password:lftp rookie@172.16.250.149:~> cd /var/ftp/pub/lftp rookie@172.16.250.149:/var/ftp/pub> ls-rw-r--r-- 1 14 50 23 Jun 06 02:08 issuelftp rookie@172.16.250.149:/var/ftp/pub> rm issuerm: Access failed: 550 Delete operation failed. (issue) (刪除操作失?。┳⒁猓阂粋€用戶通過文件共享服務訪問文件系統上的文件的生效權限為此二者的交集(默認情況下匿名用戶只有下載和查看的權限,無刪除權限)
lftp rookie@172.16.252.245:~> lftp -u rookie 172.16.250.149 (主機2)口令:lftp rookie@172.16.250.149:~> pwd (查看家目錄) ftp://rookie@172.16.250.149/%2F/home/rookie[root@localhost ~]#yum -y install finger[root@localhost ~]#finger rookieLogin: rookie Name:Directory: /home/rookie Shell: /bin/bashNever logged in.No mail.No Plan.
配置文件:/etc/vsftpd/vsftpd.conf
directive value
注意:directive之前不能有多余字符
匿名用戶:
anonymous_enable=YES (是否支持啟用匿名賬號)
anon_upload_enable=YES (特定條件下上傳文件)
anon_mkdir_write_enable=YES (一定條件下創建新目錄)
anon_other_write_enable=YES (上傳和刪除目錄)
anon_world_readable_only=YES (是否全局只讀)
系統用戶:
local_enable=YES (是否啟用本地用戶)
write_enable=YES (是否本地用戶使用寫權限)
local_umask=022
[root@localhost ~]#useradd rookie (主機1)[root@localhost ~]#echo qwer | passwd --stdin rookie更改用戶 rookie 的密碼 。passwd:所有的身份驗證令牌已經成功更新。 [root@localhost /etc]#lftp -u rookie 172.16.250.149 (主機2)口令:lftp rookie@172.16.250.149:~> lslftp rookie@172.16.250.149:~> pwd ftp://rookie@172.16.250.149/%2Fhome/rookie root@localhost ~]#yum -y install finger (主機1)[root@localhost ~]#finger rookieLogin: rookie Name:Directory: /home/rookie Shell: /bin/bashNever logged in.No mail.No Plan.[root@localhost /etc]#su - rookie[rookie@localhost ~]$ touch hi.rookie (創建hi.rookie) lftp rookie@172.16.250.149:~> ls (主機2)-rw-rw-r-- 1 1001 1001 0 Jun 06 00:53 hi.rookie [root@localhost /var/ftp]#mkdir upload (主機1)[root@localhost /var/ftp]#chown ftp.ftp upload/[root@localhost /etc/vsftpd]#vim vsftpd.conf (上傳文件)
[root@localhost /etc/vsftpd]#systemctl restart vsftpd.service
[root@localhost ~]#lftp 172.16.250.149 (主機2)lftp 172.16.250.149:~> lsdrwxr-xr-x 2 0 0 19 Jun 06 02:08 pubdrwxr-xr-x 2 14 50 6 Jun 06 02:23 uploadlftp 172.16.250.149:/> cd upload/lftp 172.16.250.149:/upload> put /etc/issue23 bytes transferred lftp 172.16.250.149:/upload> rm issuerm: Access failed: 550 Permission denied. (issue) (上傳的文件無法刪除) [root@localhost /etc/vsftpd]#ls /var/ftp/upload/ (主機1)issue
[root@localhost /etc/vsftpd]#vim vsftpd.conf (主機1)(添加創建和刪除目錄權限)
[root@localhost /etc/vsftpd]#systemctl restart vsftpd.service [root@localhost ~]#lftp 172.16.250.149 (主機2)lftp 172.16.250.149:~> cd upload/lftp 172.16.250.149:/upload> mkdir test (創建test目錄)mkdir ok, `test' createdlftp 172.16.250.149:/upload> cd test/lftp 172.16.250.149:/upload/test> put /etc/fstab (將fstab考到test目錄下)541 bytes transferredlftp 172.16.250.149:/upload/test> ls (自己不可見)lftp 172.16.250.149:/upload/test> rm fstab (但是可以刪除)rm ok, `fstab' removedlftp 172.16.250.149:/upload/test> cd ..lftp 172.16.250.149:/upload> rmdir test (將test目錄刪除)rmdir ok, `test' removedlftp 172.16.250.149:/upload> rm issue (將issue刪除)rm ok, `issue' removed
FTP協議是明文的,因此并不安全[root@localhost ~]#lftp -u rookie 172.16.250.149Password:lftp rookie@172.16.250.149:~> ls lftp rookie@172.16.250.149:~> [root@localhost /etc]#tcpdump -i ens33 -nn -XX tcp port 2122:14:10.133030 IP 172.16.251.163.58862 > 172.16.250.149.21: Flags [P.], seq 21:34, ack 134, win 229, options [nop,nop,TS val 16566583 ecr 8458676], length 130x0000: 000c 29d1 9c19 000c 29e1 d9c5 0800 4500 ..).....).....E.0x0010: 0041 9f1a 4000 4006 4d42 ac10 fba3 ac10 .A..@.@.MB......0x0020: fa95 e5ee 0015 55b9 564e 4985 9628 8018 ......U.VNI..(..0x0030: 00e5 4e8e 0000 0101 080a 00fc c937 0081 ..N..........7..0x0040: 11b4 5553 4552 2072 6f6f 6b69 650d 0a ..USER.rookie..(用戶名)22:14:10.135448 IP 172.16.251.163.58862 > 172.16.250.149.21: Flags [P.], seq 34:45, ack 168, win 229, options [nop,nop,TS val 16566585 ecr 8458679], length 110x0000: 000c 29d1 9c19 000c 29e1 d9c5 0800 4500 ..).....).....E.0x0010: 003f 9f1b 4000 4006 4d43 ac10 fba3 ac10 .?..@.@.MC......0x0020: fa95 e5ee 0015 55b9 565b 4985 964a 8018 ......U.V[I..J..0x0030: 00e5 4e8c 0000 0101 080a 00fc c939 0081 ..N..........9..0x0040: 11b7 5041 5353 2071 7765 720d 0a ..PASS.qwer..(密碼)
列在此文件中的用戶均禁止使用ftp服務
輔助配置文件/etc/vsftpd/ftpusers
[root@localhost /etc/vsftpd]#echo rookie >> ftpusers (主機1)[root@localhost /etc/vsftpd]#!syssystemctl restart vsftpd.service [root@localhost ~]#lftp -u rookie 172.16.250.149 (主機2)Password:lftp rookie@172.16.250.149:~> ls ls: Login failed: 530 Login incorrect. (登錄失?。?
禁錮所有本地用戶于其家目錄,需要事先去除用戶對家目錄的寫權限
chroot_local_user=YES
禁錮列表中文件存在的用戶于其家目錄中,需要事先去除用戶對家目錄的寫權限
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
[root@localhost ~]#yum -y install ftp (主機2)[root@localhost ~]#ftp 172.16.250.149Connected to 172.16.250.149 (172.16.250.149).220 (vsFTPd 3.0.2)Name (172.16.250.149:root): rookie (用戶名)331 Please specify the password.Password: (密碼)230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> pwd257 "/home/rookie" (家目錄)ftp> cd /etc/ (切換到/etc下)250 Directory successfully changed. (可成功切換) [root@localhost /etc/vsftpd]#for i in {1..5}; do useradd rookie$i; echo 'qwer' | passwd --stdin rookie$i; done (主機1)更改用戶 rookie1 的密碼 。passwd:所有的身份驗證令牌已經成功更新。更改用戶 rookie2 的密碼 。passwd:所有的身份驗證令牌已經成功更新。更改用戶 rookie3 的密碼 。passwd:所有的身份驗證令牌已經成功更新。更改用戶 rookie4 的密碼 。passwd:所有的身份驗證令牌已經成功更新。更改用戶 rookie5 的密碼 。passwd:所有的身份驗證令牌已經成功更新。[root@localhost /etc/vsftpd]#chmod a-w /home/rookie1 (去掉寫權限)[root@localhost /etc/vsftpd]#chmod a-w /home/rookie2 (去掉寫權限)[root@localhost /etc/vsftpd]#vim chroot_listrookie1rookie2
[root@localhost /etc/vsftpd]#!syssystemctl restart vsftpd.service [root@localhost ~]#ftp 172.16.250.149 (主機2)Connected to 172.16.250.149 (172.16.250.149).220 (vsFTPd 3.0.2)Name (172.16.250.149:root): rookie1331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> pwd257 "/"ftp> cd /etc/550 Failed to change directory. (無法切換目錄)
控制可登錄vsftpd服務的用戶列表:
userlist_enable=YES
啟用/etc/vsftpd/user_list文件來控制可登錄用戶
userlist_deny=
YES:意味著此為黑名單
NO:白名單
[root@localhost ~]#vim /etc/vsftpd/vsftpd.conf (改為白名單)
[root@localhost /etc/vsftpd]#vim user_list (準許登錄的用戶)
[root@localhost /etc/vsftpd]#!syssystemctl restart vsftpd.service [root@localhost ~]#ftp 172.16.250.149 (主機2)Connected to 172.16.250.149 (172.16.250.149).220 (vsFTPd 3.0.2)Name (172.16.250.149:root): rookie1331 Please specify the password.Password:230 Login successful.Remote system type is UNIX.Using binary mode to transfer files.ftp> ls227 Entering Passive Mode (172,16,250,149,60,44).150 Here comes the directory listing.226 Directory send OK. [root@localhost ~]#ftp 172.16.250.149Connected to 172.16.250.149 (172.16.250.149).220 (vsFTPd 3.0.2)Name (172.16.250.149:root): rookie3530 Permission denied.Login failed.ftp> ls530 Please login with USER and PASS.Passive mode refused.
傳輸日志:
xferlog_enable=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
守護進程的類型:
standalone:獨立守護進程;由服務進程自行監聽套按字,并接收用戶訪問請求
transient:瞬時守護進程;由受托管方代為監聽套按字,服務進程沒有訪問請求時不啟動,當托管方收到訪問請求時,才啟動服務進程
CentOS 6:xinetd獨立守護進程, /etc/xinetd.d/
CentOS 7:由systemd代為監聽
上傳下載速率:
anon_max_rate=0
local_max_rate=0
并發連接數限制:
max_clients=2000
max_per_ip=50
原創文章,作者:Linux.rookie,如若轉載,請注明出處:http://www.www58058.com/77685