一、FTP的作用和工作原理
FTP(FileTransfer Protocol)是文件傳輸協議的簡稱
FTP的作用:
FTP的主要作用,就是讓用戶連接上一個遠程計算機(這些計算機上運行着FTP服務器程序)查看遠程計算機有哪些文件,然後把文件從遠程計算機上拷貝到本地計算機,或把本地計算機的文件送到遠程計算機去
FTP服務器的工作原理:
簡單地說,支持ftp協議的服務器就是ftp服務器,ftp協議的連接方式有兩種,一種是命令連接,一種是數據連接,而ftp的數據連接方式也有兩種,一種是主動模式,一種是被動模式
其主動模式的工作原理
1.客戶端對服務器發起請求,連接的是服務器的21號端口,客戶端的端口號N是大於1024的隨機端口
2.服務器的21號端口給予客戶端響應數據流
3.服務器打開20號端口去連接客戶端的N+1的端口
4.客戶端給予響應,數據開始傳輸
被動模式的工作原理
1.客戶端對服務器發起的請求連接是服務器的21號端口,客戶端的端口號N是大於1024的隨機端口
2.服務器的21號端口給予客戶端響應
3.服務器打開一個大於1024的隨機端口,客戶端使用N+1端口號去連接服務器打開的端口
4.服務器給予響應,於是數據開始傳輸
需要注意的是:客戶端如何連接服務器端的這個隨機端口的呢?在命令連接階段,服務器會傳輸172.16.2.1.113.26的字符串過去,前四個標識的是服務器的IP地址,而隨機端口是通過後面兩個字符計算得出的,計算法則爲第一個乘以256加上第二個數,即客戶端連接服務器端的這個隨機端口號是113*256+26
二、安裝ftp軟件包:
配置好yum源後通過yum –y install vsftpd進行安裝
[root@stu2~]# rpm -ql vsftpd //查看軟件包生成了那些文件
列出幾個較爲重要的
/etc/logrotate.d/vsftpd //配置日誌回滾的文件 /etc/pam.d/vsftpd //定義vsftpd是如何認證用戶的,默認情況vsftpd支持使用匿名用戶和本地用戶 /etc/rc.d/init.d/vsftpd //服務啓動腳本 /etc/vsftpd /etc/vsftpd/ftpusers /etc/vsftpd/user_list /etc/vsftpd/vsftpd.conf //服務的主配置文件 /etc/vsftpd/vsftpd_conf_migrate.sh /usr/sbin/vsftpd //服務器端程序 /var/ftp //ftp的默認家目錄
ftp協議響應碼:
1xx:服務器信息
2xx:正確響應信息
3xx:正常響應,某操作過程尚未完成,需進一步補充完成;
4xx:客戶端錯誤;
5xx:服務器端錯誤;
vsftpd的用戶類型:
需要注意的是,ftp服務器端文件路徑是用戶的家目錄,查看用戶家目錄的相關信息可以通過finger命令來查看
1.匿名用戶:事實上是服務器端自動映射的一個系統用戶
客戶端匿名連接:
[root@station92~]# ftp172.16.2.1 //連接測試 Connectedto 172.16.2.1 (172.16.2.1). 220(vsFTPd 2.2.2)//220是協議響應碼,表示正常響應 Name(172.16.2.1:root): ftp//表示匿名訪問 331Please specify the password. Password: //匿名用戶登錄密碼爲空 230Login successful. Remotesystem type is UNIX. Usingbinary mode to transfer files. ftp> pwd 257"/" //匿名用戶默認被鎖定在“/“目錄下,而本地用戶沒有被鎖定,因此看以看所有的文件 [root@stu2 ~]# finger ftp Login:ftp Name: FTP User Directory:/var/ftp Shell: /sbin/nologin Neverlogged in. Nomail. NoPlan. 其中Directory: /var/ftp表示用戶家目錄路徑信息
2.本地用戶:即/etc/passwd中的用戶,默認root和id號小於500的用戶都禁止訪問ftp
本地用戶連接
[root@station92~]# ftp 172.16.2.1 Connectedto 172.16.2.1 (172.16.2.1). 220(vsFTPd 2.2.2) Name(172.16.2.1:root): gentoo 331Please specify the password. Password: 230Login successful. Remotesystem type is UNIX. Usingbinary mode to transfer files. ftp>pwd 257"/users/gentoo" ftp>ls 227Entering Passive Mode (172,16,2,1,236,228). 150Here comes the directory listing. -rw-rw-r-- 1 500 500 73175088 Jul 10 03:18linux-3.10.tar.xz 226Directory send OK. 服務器端查看本地用戶信息 [root@stu2~]# finger gentoo Login:gentoo Name: Directory:/users/gentoo Shell: /bin/bash Lastlogin Sat Aug 17 09:54 (CST) on pts/1 from 172.16.254.54 Nomail. NoPlan. Root用戶默認沒有訪問權限 [root@station92~]# ftp 172.16.2.1 Connectedto 172.16.2.1 (172.16.2.1). 220 (vsFTPd2.2.2) Name(172.16.2.1:root): root 530 Permissiondenied. Loginfailed.
3.虛擬用戶:事實上服務器端自動映射的一個系統用戶,多個虛擬用戶同時被映射爲一個系統用戶,但不同的虛擬用戶可以具有不同的訪問權限
三、vsftpd的工作特性
在/etc/vsftpd/vsftpd.conf中定義了vsftpd的工作特性
[root@stu2~]# grep -v "^#" /etc/vsftpd/vsftpd.conf | grep -v "^$" anonymous_enable=YES//允許匿名用戶訪問,若禁止使用NO local_enable=YES//允許本地用戶訪問,若禁止則使用NO write_enable=YES//表示是否允許本地用戶有上傳權限的,YES表示可以,NO表示禁止,也取決於客戶端連接時使用的客戶端工具 local_umask=022//設置本地用戶上傳建立文件時的權限掩碼 dirmessage_enable=YES//用戶切換進入目錄時顯示.message(如果存在)文件的內容 xferlog_enable=YES//是否開啓傳輸日誌的 connect_from_port_20=YES//連接控制端口爲20 xferlog_std_format=YES//啓動標準xferlog的日誌格式,若禁用此項,將使用vsftpd自己的日誌格式 listen=YES//是否以獨立運行的方式監聽服務 pam_service_name=vsftpd//設root userlist_enable=YES//表明啓動本地用戶 tcp_wrappers=YES//是否開啓tcp_wrappers主機訪問控制 除此之外還有註釋掉的,有些可以啓動的具體爲: #anon_upload_enable=YES#是否匿名用戶上傳文件 #anon_mkdir_write_enable=YES#匿名用戶具有創建目錄的權限 可以加一條 Anon_other_write_enable=YES#其他權限,可是設置文件的屬主屬組,刪除等操作 #xferlog_file=/var/log/xferlog#記錄傳輸日誌內容的 #idle_session_timeout=600#命令連接的超時時間 #data_connection_timeout=120#數據連接的超時時間 #chroot_local_user=YES #chroot_list_enable=YES #chroot_list_file=/etc/vsftpd/chroot_list
chroot: 禁錮用戶於其家目錄中,實現方式有兩種:
1、所有的本地用戶都被鎖定在家目錄下了
chroot_local_user=YES
[root@station92~]# ftp 172.16.2.1 Connectedto 172.16.2.1 (172.16.2.1). 220 (vsFTPd2.2.2) Name(172.16.2.1:root): gentoo 331 Pleasespecify the password. Password: 230 Loginsuccessful. Remotesystem type is UNIX. Usingbinary mode to transfer files. ftp> pwd 257"/" //本地用戶被鎖定在家目錄下 ftp> ls 227Entering Passive Mode (172,16,2,1,195,144). 150 Herecomes the directory listing. -rw-r--r-- 1 500 500 921 Aug 19 00:16fstab -rw-rw-r-- 1 500 500 73175088 Jul 10 03:18linux-3.10.tar.xz 226Directory send OK. ftp> cd/ 250Directory successfully changed. ftp> ls 227Entering Passive Mode (172,16,2,1,231,75). 150 Herecomes the directory listing. -rw-r--r-- 1 500 500 921 Aug 19 00:16fstab -rw-rw-r-- 1 500 500 73175088 Jul 10 03:18linux-3.10.tar.xz 226Directory send OK.
2、禁錮/etc/vsftpd/chroot_list中的指定用戶,黑名單
[root@stu2vsftpd]# touch chroot_list
[root@stu2vsftpd]# vim chroot_list
在chroot_list中寫上centos 和gentoo兩個用戶,用戶hailian沒寫入,進行驗證
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
[root@station92~]# ftp 172.16.2.1 Connectedto 172.16.2.1 (172.16.2.1). 220 (vsFTPd2.2.2) Name(172.16.2.1:root): centos 331 Pleasespecify the password. Password: 230 Loginsuccessful. Remotesystem type is UNIX. Usingbinary mode to transfer files. ftp> pwd 257"/" //鎖定用戶的家目錄 ftp> bye 221Goodbye. [root@station92~]# ftp 172.16.2.1 Connectedto 172.16.2.1 (172.16.2.1). 220 (vsFTPd2.2.2) Name(172.16.2.1:root): gentoo 331 Pleasespecify the password. Password: 230 Loginsuccessful. Remotesystem type is UNIX. Usingbinary mode to transfer files. ftp> pwd 257"/" //鎖定用戶的家目錄 ftp> bye 221Goodbye. [root@station92~]# ftp 172.16.2.1 Connectedto 172.16.2.1 (172.16.2.1). 220 (vsFTPd2.2.2) Name(172.16.2.1:root): hailian 331 Pleasespecify the password. Password: 230 Loginsuccessful. Remotesystem type is UNIX. Usingbinary mode to transfer files. ftp> pwd 257"/home/hailian" //沒有鎖定
3、不禁錮/etc/vsftpd/chroot_list中的指定用戶,白名單
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
進行驗證:
[root@station92~]# ftp 172.16.2.1 Connectedto 172.16.2.1 (172.16.2.1). 220 (vsFTPd2.2.2) Name(172.16.2.1:root): gentoo 331 Pleasespecify the password. Password: 230 Loginsuccessful. Remotesystem type is UNIX. Usingbinary mode to transfer files. ftp> pwd 257"/users/gentoo" ftp> bye 221Goodbye. [root@station92~]# ftp 172.16.2.1 Connectedto 172.16.2.1 (172.16.2.1). 220 (vsFTPd2.2.2) Name(172.16.2.1:root): centos 331 Pleasespecify the password. Password: 230 Loginsuccessful. Remotesystem type is UNIX. Usingbinary mode to transfer files. ftp> pwd 257"/users/centos" ftp> bye 221Goodbye. [root@station92~]# ftp 172.16.2.1 Connectedto 172.16.2.1 (172.16.2.1). 220 (vsFTPd2.2.2) Name(172.16.2.1:root): hailian 331 Pleasespecify the password. Password: 230 Loginsuccessful. Remotesystem type is UNIX. Usingbinary mode to transfer files. ftp> pwd 257"/"
user_list:定義ftp用戶白名單和黑名單:
1、白名單:
userlist_enable=YES
userlist_deny=NO
2、黑名單:
userlist_enable=YES
userlist_deny=YES
傳輸速率限定,默認單位爲字節:
anon_max_rate=10240#定義匿名用戶的最大傳輸速率,單位爲字節
local_max_rate=10240#限定本地用戶最大的下載速度爲10KB/s
連接數限定:
max_clients=100
max_per_ip=2
修改配置文件後要重新加載服務
servicevsftpd reload
注:
1)由於此配置文件檢查要求比較嚴格,不可隨意出現任意空白字符,例如write_enable=YES之前不可出現任何空白字符;等號兩側不可出現任何空白字符。
2)當更改這個文件中的這些權限時一定要確保SElinux是關閉的,不然會被阻止的。
驗證:
在服務器端的主配置文件/etc/vsftpd/vsftpd.conf
write_enable=YES//表示是否允許本地用戶有上傳權限的,YES表示可以,NO表示禁止,也取決於客戶端連接時使用的客戶端工具,匿名用戶不可以上傳
[root@station92~]# ftp 172.16.2.1 Connectedto 172.16.2.1 (172.16.2.1). 220 (vsFTPd2.2.2) Name(172.16.2.1:root): ftp 331 Pleasespecify the password. Password: 230 Loginsuccessful. Remotesystem type is UNIX. Usingbinary mode to transfer files. ftp> put/etc/fstab local:/etc/fstab remote: /etc/fstab 227Entering Passive Mode (172,16,2,1,50,195). 550Permission denied.//匿名用戶不允許有上傳權限 本地用戶: [root@station92~]# ftp 172.16.2.1 Connectedto 172.16.2.1 (172.16.2.1). 220 (vsFTPd2.2.2) Name(172.16.2.1:root): gentoo 331 Pleasespecify the password. Password: 230 Loginsuccessful. Remotesystem type is UNIX. Usingbinary mode to transfer files. ftp> put/etc/fstab local:/etc/fstab remote: /etc/fstab 227Entering Passive Mode (172,16,2,1,90,137).//ftp工作在被動模式下 553 Couldnot create file.//表明上傳功能沒問題,但無法創建文件 ftp> pwd 257"/users/gentoo"
上述無法上傳文件的原因是因爲客戶端工具問題,用lftp既可以實現上傳功能
[root@station92~]# lftp [email protected] Password: [email protected]:~> ls -rw-rw-r-- 1 500 500 73175088 Jul 10 03:18linux-3.10.tar.xz [email protected]:~> put /etc/fstab 921 bytestransferred //實現了上傳功能 [email protected]:~> ls -rw-r--r-- 1 500 500 921 Aug 19 00:16fstab -rw-rw-r-- 1 500 500 73175088 Jul 10 03:18linux-3.10.tar.xz
啓動匿名用戶可以上傳文件的,在服務器端的主配置文件/etc/vsftpd/vsftpd.conf中啓用anon_upload_enable=YES
# servicevsftpd reload
用匿名用戶連接服務器時,仍不能上傳文件,原因是匿名用戶在/var/ftp/沒用創建目錄的功能,需要在服務器端進行設置:
[root@stu2~]# cd /var/ftp/ [root@stu2ftp]# ll total 4 drwxr-xr-x2 root root 4096 Aug 18 01:58 pub [root@stu2ftp]# mkdir upload [root@stu2ftp]# setfacl -m u:ftp:rwx upload/ [root@stu2ftp]# getfacl upload/ # file: upload/ # owner:root # group:root user::rwx user:ftp:rwx group::r-x mask::rwx other::r-x
然後在客戶端實現上傳功能
[root@station92~]# lftp 172.16.2.1 lftp172.16.2.1:~> ls drwxr-xr-x 2 0 0 4096 Aug 17 17:58 pub drwxrwxr-x 2 0 0 4096 Aug 19 02:54upload lftp172.16.2.1:/> cd upload/ lftp172.16.2.1:/upload> ls lftp172.16.2.1:/upload> put /etc/fstab 921 bytestransferred
需要注意的是vsftpd要求對/var/ftp/這個目錄只有root用戶具有寫權限,其他任何用戶都不允許
啓用#anon_mkdir_write_enable=YES#匿名用戶具有創建目錄的權限
[root@station92~]# lftp 172.16.2.1 lftp172.16.2.1:~> ls drwxr-xr-x 2 0 0 4096 Aug 17 17:58 pub drwxrwxr-x 2 0 0 4096 Aug 19 08:16upload lftp172.16.2.1:/> cd upload/p cd: Accessfailed: 550 Failed to change directory. (/upload/p) lftp172.16.2.1:/> cd upload/ lftp172.16.2.1:/upload> ls -rw------- 1 14 50 921 Aug 19 03:46fstab -rw------- 1 14 50 103 Aug 19 08:16issue lftp172.16.2.1:/upload> mkdir test mkdir ok,`test' created lftp172.16.2.1:/upload> ls -rw------- 1 14 50 921 Aug 19 03:46fstab -rw------- 1 14 50 103 Aug 19 08:16issue drwx------ 2 14 50 4096 Aug 19 08:21test
ftp的傳輸是明文的,要實現加密功能則需要ftps
四、ftpd+ssl實現安全的ftps
首先要自建CA服務器
其次創建自己的私鑰文件#cd /etc/vsftpd/ssl/
(umask 077;openssl genrsa -out vsftpd.key 2048)
umask 077:用括號括起來,則表示此umsak只對當前子shell有效,如果不用括號,則對當前shell都生效,在此創建文件時屬組和其它用戶將沒有任何權限
openssl genrsa:生成私鑰的命令關鍵字
-out:指定文件的路徑
vsftpd.key:私鑰的名稱,名字可以隨便取,用.key結尾是爲了方便記憶
2048:指私鑰生成的位,默認是512,必須是2的n次方倍數
利用私鑰文件生成證書籤署請求文件
[root@stu2ssl]# openssl req -new -key vsftpd.key -out vsftpd.csr
req:證書請求和證書生成工具的命令關鍵字
-new:製作證書申請
-key:指定私鑰文件
-out:輸出證書請求文件的路徑,以.csr結尾
You areabout to be asked to enter information that will be incorporated into yourcertificate request. What youare about to enter is what is called a Distinguished Name or a DN. There arequite a few fields but you can leave some blank For somefields there will be a default value, If youenter '.', the field will be left blank. ----- CountryName (2 letter code) [XX]:CN State orProvince Name (full name) []:henan LocalityName (eg, city) [Default City]:zhengzhou OrganizationName (eg, company) [Default Company Ltd]:ftp.magedu.com OrganizationalUnit Name (eg, section) []:^C [root@stu2ssl]# openssl req -new -key vsftpd.key -out vsftpd.csr You areabout to be asked to enter information that will be incorporated into yourcertificate request. What youare about to enter is what is called a Distinguished Name or a DN. There arequite a few fields but you can leave some blank For somefields there will be a default value, If youenter '.', the field will be left blank. ----- CountryName (2 letter code) [XX]:CN State orProvince Name (full name) []:henan LocalityName (eg, city) [Default City]:zhengzhou OrganizationName (eg, company) [Default Company Ltd]:magedu OrganizationalUnit Name (eg, section) []:tech Common Name(eg, your name or your server's hostname) []:ftp.magedu.com EmailAddress []:[email protected] Pleaseenter the following 'extra' attributes to be sentwith your certificate request A challengepassword []: An optionalcompany name []: [root@stu2ssl]# ls vsftpd.csr vsftpd.key
有ca頒發ftp證書
opensslca :頒發CA證書的命令關鍵字
-in:指定證書籤署請求文件
-out:輸出頒發證書的文件
-days:限定證書的有效期,3656天
修改vsftpd的配置文件讓其支持ssl功能,即在/etc/vsftpd/vsftpd.conf最後添上如下內容
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key
客戶端軟件用FlashF軟件測試
總結:ftp的傳輸方式是明文的,因此在服務器上通過抓包工具,可以獲取用戶的密碼。命令爲:# tcpdump -i eth0 -XX port 21這樣對服務器是一個很大的安全隱患,因此基於ftps搭建的服務器是非常有必要的,上述講解不足之處還請大家多多提醒,互相幫助,共同進步!