(1).實驗環境
FTP服務器:youxi1 192.168.1.6
測試主機:youxi2 192.168.1.7
VSFTP是C/S模式,默認端口21傳輸指令,20傳輸數據
(2).工作原理
FTP會話包含了兩個通道,數據通道和命令通道。FTP的工作模式有兩種,主動模式(PORT模式)和被動模式(PASV模式),均以FTP服務器作為參照物。FTP服務器主動連接客戶端為主動模式,FTP服務器等待客戶端連接為被動模式。
1)主動模式工作原理:
建立控制通道:客戶端發起連接請求,包含用戶名、密碼、客戶端隨機開放的一個高位端口(1024以上)以及連接模式PORT命令等。服務器接收后響應客戶端,服務器的21端口與提供的隨機高位端口建立控制通道。
建立數據通道:服務器發送連接請求,包含服務器的20端口。客戶端接收后響應請求,隨機開放一個高位端口(1024以上),客戶端的隨機高位端口與服務器的20端口建立數據通道。
2)被動模式工作原理:
建立控制通道:客戶端發起連接請求,包含用戶名、密碼、客戶端隨機開放的一個高位端口(1024以上)以及連接模式PASV命令等。服務器接收后響應客戶端,服務器的21端口與提供的隨機高位端口建立控制通道。
建立數據通道:服務器會隨機開放一個高位端口(1024以上)告知客戶端用於建立數據通道,客戶端開放一個隨機高位端口(1024以上)與服務器隨機開放的高位端口連接。
底下這張是Windows下的FTP被動連接:
(3).實驗
1)服務器端安裝vsftpd,客戶端安裝lftp
服務器端
[root@youxi1 ~]# yum -y install vsftpd
客戶端
[root@youxi2 ~]# yum -y install lftp
2)服務器端相關文件
/etc/vsftpd/vsftpd.conf 核心配置文件
/etc/vsftpd/ftpusers 指定不能訪問FTP服務器的用戶,即黑名單
/etc/vsftpd/user_list 當/etc/vsftpd/vsftpd.conf配置文件中userlist_deny= YES,那么該文件是黑名單;反之userlist_deny= NO,那么只允許該文件的用戶登錄
/etc/vsftpd/vsftpd_conf_migrate.sh vsftpd操作的一些變量和設置腳本
/var/ftp/ 默認情況下匿名用戶的根目錄
3)匿名用戶訪問
在/etc/vsftpd/vsftpd.conf配置文件中與匿名用戶有關的參數如下:
anonymous_enable=YES //允許匿名用戶登錄FTP,默認為YES anon_upload_enable=YES //允許匿名用戶上傳,默認為NO anon_mkdir_write_enable=YES //允許匿名用戶創建目錄,默認為NO anon_other_write_enable=YES //給予匿名用戶寫權限,默認為NO
根據相關需求將參數修改成指定要求。
接着將FTP服務器youxi1上的匿名用戶的根目錄/etc/ftp/屬主和屬組改為ftp,這樣匿名用戶才能操作目錄下的文件:
[root@youxi1 pub]# chown ftp:ftp /var/ftp/pub
注意:vsftp是相對安全的FTP工具,所以並不允許/var/ftp/給予匿名用戶寫權限
然后啟動vsftpd服務,並開機自啟:
[root@youxi1 pub]# systemctl start vsftpd [root@youxi1 pub]# systemctl enable vsftpd
這時可以使用Window匿名登錄,創建文件夾、上傳文件
也可以在Linux上使用lftp匿名登錄
[root@youxi2 ~]# lftp 192.168.1.6 lftp 192.168.1.6:~> ls drwxr-xr-x 2 14 50 28 May 18 14:52 pub lftp 192.168.1.6:/> cd pub/ lftp 192.168.1.6:/pub>
當然並不建議開啟匿名登錄。
4)使用指定的系統用戶只能訪問指定的目錄
在FTP服務器youxi1上添加普通用戶,但禁止登錄系統,並賦予密碼:
[root@youxi1 ~]# useradd -s /sbin/nologin ftp1 [root@youxi1 ~]# useradd -s /sbin/nologin ftp2 [root@youxi1 ~]# echo "ftp1:123456" | chpasswd [root@youxi1 ~]# echo "ftp2:123456" | chpasswd
在/etc/vsftpd/vsftpd.conf配置文件中與之相關的參數如下:
local_enable=YES //允許本地用戶登錄 #chroot_local_user=YES //設置是否將所有本地用戶囚禁在主目錄,默認為NO local_root=/www/html //設置本地用戶訪問的根目錄 chroot_list_enable=YES //激活chroot功能(激活囚禁用戶列表功能),默認為NO chroot_list_file=/etc/vsftpd/chroot_list //設置被囚禁的用戶列表存放的文件 allow_writeable_chroot=YES //允許被囚禁的用戶具有寫權限,默認為NO
將匿名用戶相關參數取消,修改或添加相關參數。
創建被囚禁用戶的主目錄/www/html/,以及被囚禁用戶列表文件
[root@youxi1 ~]# mkdir -p /www/html [root@youxi1 ~]# vim /etc/vsftpd/chroot_list ftp1 ftp2
修改被囚禁用戶的主目錄權限
[root@youxi1 ~]# chmod o+w /www/html/ //如果是已存在文件,需要使用-R選項遞歸 [root@youxi1 ~]# ls -ld /www/html/ drwxr-xrwx 2 root root 6 5月 19 14:13 /www/html/
重啟vsftpd服務
[root@youxi1 ~]# systemctl restart vsftpd
到測試主機youxi2上測試
[root@youxi2 ~]# lftp 192.168.1.6 -u ftp1,123456 lftp ftp1@192.168.1.6:~> ls ls: 登錄失敗: 530 Login incorrect.
網上找了找相關問題,一個是/etc/vsftpd/vsftpd.conf配置文件參數應該如下:
pam_service_name=vsftpd //這個我原本就是
還有一個是/etc/pam.d/vsftpd注釋掉如下參數:
#auth required pam_shells.so
然后再重啟vsftpd服務
[root@youxi1 ~]# systemctl restart vsftpd
這時候再到測試主機youxi2上
[root@youxi2 pam.d]# lftp 192.168.1.6 -u ftp1 口令: lftp ftp1@192.168.1.6:~> ls -rw-r--r-- 1 0 0 968 May 19 06:21 passwd
(4).OpenSSL加密FTP傳輸
使用OpenSSL生成自簽證書
//req是 X.509 Certificate Signing Request (CSR,證書簽名請求)管理的一個命令 //-x509是X.509 證書數據管理 //-days是定義證書有效時間 //-keyout是設置密鑰存儲文件 //-out是設置證書存儲位置,注意證書與密鑰保存在同一個文件 [root@youxi1 ~]# openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem -days 3650 Generating a 2048 bit RSA private key ..........................................................................+++ .................................+++ writing new private key to '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]:ZH^H^H^H^H^H^C [root@youxi1 ~]# openssl req -new -x509 -nodes -out vsftpd.pem -keyout vsftpd.pem -days 3650 Generating a 2048 bit RSA private key ..............................................................................................................+++ .......................................................................................................................................+++ writing new private key to '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]:CN //輸入國家名稱(2個字母代碼) State or Province Name (full name) []:BeiJing //州或省的全稱 Locality Name (eg, city) [Default City]:Beijing //地點名稱(例如城市) Organization Name (eg, company) [Default Company Ltd]:TengXun //組織名稱(例如公司) Organizational Unit Name (eg, section) []:IT //組織單位名稱(例如部門) Common Name (eg, your name or your server's hostname) []:youxi1 //公用名(例如你的或你的服務器的主機名) Email Address []:youxi1@qq.com //郵件地址
將文件保存到/etc/vsftpd/.sslkey/目錄下,並設置400權限
[root@youxi1 ~]# mkdir /etc/vsftpd/.sslkey/ [root@youxi1 ~]# mv vsftpd.pem /etc/vsftpd/.sslkey/ [root@youxi1 ~]# chmod 400 /etc/vsftpd/.sslkey/vsftpd.pem
添加以下參數到配置文件/etc/vsftpd/vsftpd.conf,使其支持OpenSSL:(以下參數需要加在配置文件中間,否則會報錯)
ssl_enable=YES //開啟SSL支持 allow_anon_ssl=NO //下面四行表示強制匿名用戶使用加密登錄和數據傳輸 force_local_data_ssl=YES force_local_logins_ssl=YES force_anon_logins_ssl=YES force_anon_data_ssl=YES ssl_tlsv1=YES //指定vsftpd支持TLS v1 ssl_sslv2=YES //指定vsftpd支持SSL v2 ssl_sslv3=YES //指定vsftpd支持SSL v3 require_ssl_reuse=NO //不重用SSL會話,安全配置項 ssl_ciphers=HIGH //允許用於加密SSL連接的SSL算法 rsa_cert_file=/etc/vsftpd/.sslkey/vsftpd.pem //證書位置 rsa_private_key_file=/etc/vsftpd/.sslkey/vsftpd.pem //密鑰位置
重啟vsftpd服務
[root@youxi1 ~]# systemctl restart vsftpd
如果FTP客戶端是CentOS的lftp,直接使用會報錯。如下:
[root@youxi2 ~]# lftp 192.168.1.6 -u ftp1 口令: lftp ftp1@192.168.1.6:~> ls ls: 嚴重錯誤: Certificate verification: Not trusted
此時需要在客戶端的lftp配置文件/etc/lftp.conf最后添加一行參數,不驗證SSL(也不知道會不會出問題),如下:
set ssl:verify-certificate no //
測試主機youxi2再次使用lftp連接就正常了
[root@youxi2 ~]# lftp 192.168.1.6 -u ftp1 口令: lftp ftp1@192.168.1.6:~> ls -rw-r--r-- 1 0 0 968 May 19 06:21 passwd