一、FTP協議、服務器
FTP:文件傳輸協議(用于網絡文件雙向傳輸的應用層協議)
特點:最廣泛、最底層、較簡單,但是明文傳輸;適用于較大文件的傳輸
1.常見客戶端、服務器
- 客戶端:WINSCP or filezilla(windows),ftp(linux)
- 服務器:IIS(windows)、vsftpd(linux)
- VSFTPD:very secure FTP daemon
2.FTP服務參數
服務端
- 軟件名:vsftpd
- 服務名:vsftpd
- 端口號:20、21、指定范圍的隨機端口
- 配置文件:/etc/vsftpd/vsftpd.conf
- 日志文件:/var/log/messages
客戶端
- 軟件名:ftp
- 格式:ftp 服務器ip
- 命令:連上ftp后,用help或?命令查看,!命令——可以執行客戶端命令
注:ftp連接需要將客戶端用戶禁錮在家目錄,防止權限過大
二、FTP用戶模式
- 匿名用戶模式:測試用戶,用戶名為ftp或anonymous,密碼隨意
- 本地用戶模式:服務器上的/etc/passwd的用戶(默認禁止/etc/vsftpd/user_list中用戶連接)
- 虛擬用戶模式(不做重點)
用戶屬性:賬號、共享位置、訪問權限、設置指定的訪問權限、下載(上傳)的文件的位置
訪問權限
- FTP服務的訪問權限:下載、上傳、創建文件夾、其他寫入權限等
- Linux系統的訪問權限:r、w、x
1.匿名用戶
服務端共享目錄:/var/ftp
默認權限:可下載、不能上傳(設置權限由兩部分控制:主配置文件和文件系統權限)
客戶端下載目錄:下載在連接ftp時所在目錄位置
匿名用戶參數:
- anontmous_enable=YES? ? ? ? 啟用匿名訪問
- anon_umask=022? ? ? ? 匿名用戶所上傳文件的權限掩碼?
- anon_root=/var/ftp? ? ? ? 匿名用戶FTP的根目錄
- anon_upload_enable=YES? ? ? ? 允許上傳文件
- anon_mkdir_write_enable=YES? ? ? ? 允許創建目錄
- anon_other_write_enable=YES? ? ? ? 允許其他寫權限
- anon_max_rate=2? ? ? ? 限制最大傳輸速率(字節/秒)
參數設置注意事項:
- 想要使用,除配置文件允許外,還需要設置獨立的文件系統權限(建議用acl)
- 即便可以上傳文件,上傳文件的權限也僅有600,其他人(包括上傳者)無法下載使用
- 想要讓其他人也能正常下載,需要修改匿名用戶上傳文件掩碼值為022
2.本地用戶
用戶名、密碼:服務器端設置的系統用戶名和密碼
服務端共享目錄:系統用戶家目錄
默認權限(FTP的所有權限):可上傳、下載、創建目錄、刪除、重命名等其他寫入權限
客戶端下載目錄:下載在連接ftp時所在的目錄位置
本地用戶參數
- local_enable=YES? ? ? ? 啟用本地用戶訪問
- local_umask=022? ? ? ? 本地用戶所上傳文件的權限掩碼
- local_root=/home/用戶名? ? ? ? 設置本地用戶的FTP根目錄
- chroot_local_user=YES? ? ? ? 是否將用戶禁錮在主目錄
- allow_writeable_chroot=YES? ? ? ? 禁錮后允許寫入
- local_max_rate=2? ? ? ? 限制最大傳輸速率(字節/秒)
補充:useradd -s /sbin/nologin -d /data/ftp wangwu——設置不能登錄系統;僅禁錮用戶在主目錄依舊不夠安全,也要同時拒絕ssh連接的通道
? ? ? ? ? ?設置了/sbin/nologin后,客戶端用ftp有可能無法連接,因為服務端/etc/shells下沒有/sbin/nologin,需要手動添加才可以連接
3.VSFTPD全局參數
- write_enable=YES? ? ? ? 是否啟用寫入權限
- download_enable=YES? ? ? ? 是否允許下載文件
- connect_timeout=60? ? ? ? 主動模式下的連續超時時間
- accept_timeout=60? ? ? ? 被動模式下的連續超時時間
- data_connection_timeout=300? ? ? ? 進行完整數據傳輸后的再操作連接時間
- idle_session_timeout=300? ? ? ? 驗證完用戶名和密碼后等待傳輸數據的超時時間
注:其中有一個配置:pam_service_name=vsftpd,其中vsftpd指的是/etc/pam.d/vsftpd文件,該文件可驗證/etc/vsftpd/ftpuser文件下用戶登錄;如果修改,則客戶端連接會因為無法驗證而失敗? ??
例:vim /etc/pam.d/vsftpd
其中,*.so文件是該服務的依賴,依賴分為動態依賴和靜態依賴
- 靜態依賴:static,隨著服務啟動而存在
- 動態依賴:如so,服務啟動時沒有,需要使用的時候加載
三、VSFTPD原理
工作模式:主動模式、被動模式?
傳輸模式:ASCII模式、Binary模式
- ASCII模式:將文件內容轉換成存儲文本文件的格式;多用于傳輸文本文件
- BINARY(二進制)模式:不對數據進行任何處理,逐位復制;多用于傳輸非文本文件,如程序、數據庫、壓縮文件
1.FTP被動模式
被動模式原理
- 客戶端連接服務器的21端口、驗證用戶名和密碼,建立控制連接
- 客戶端想傳輸數據時,在控制連接中發送PASV命令
- 服務器收到該命令后,生成隨機端口返回給客戶端、等待客戶端的請求
- 傳輸數據時,客戶端的隨機端口連接服務器的指定端口,建立數據連接
- 客戶端和服務器進行數據傳輸
注:20端口不在被動模式里
控制連接
客戶端(隨機端口)——服務端(21端口)
數據連接
客戶端(隨機端口)——服務端(指定端口)
被動切主動
- 客戶端傳輸數據時,FTP服務默認采用被動模式
- 被動和主動是由客戶端決定的
- 被動和主動作用的是服務器的動作,是主動連接還是被動的等待連接
- 使用主動模式:ftp>passive off
2.FTP主動模式
主動模式原理
- 客戶端連接服務器的21端口、驗證用戶名和密碼,建立控制連接
- 客戶端想傳輸數據時,在控制連接中發送PORT命令【1.該命令中包含了客戶端想要進行數據傳輸的指定端口;2.服務器收到該命令后,會主動連接客戶端】
- 要傳輸數據時,服務器的20端口連接至客戶端的指定端口,建立數據連接
- 客戶端和服務器進行數據傳輸
控制連接
客戶端(隨機端口)——服務器端(21端口)
數據連接
服務端(20端口)——客戶端(指定端口)
3.模式對比
(1)控制連接過程不同
(2)數據連接部分不同【FTP的主被動模式是由客戶端決定的,針對服務器而言的】
(3)使用場景不同:
- FTP服務器較弱時,可以考慮主動模式;
- 公網無法要求客戶端開放防火墻,一般采用被動模式;
- 被動模式下,可以通過pasv_min_port和pasv_max_port控制隨機端口范圍
4.問題:為什么用被動連接模式?
- 主動模式下數據連接都走20端口,壓力大
- 防火墻規則:管進不管出;主動連接在數據傳輸時需要客戶端放行端口、不太可控
四、本地用戶登錄及設置
1.服務端(77.77)
#安裝軟件
$ dnf -y install vsftpd
#開啟服務
$ systemctl start vsftpd
#通過端口驗證開啟成功,結果中可以看到用來監聽的21端口
$ ss -antp | grep vsftpd
#禁錮本地用戶只能在自己的家目錄范圍
#注意此時應該先把要上傳共享目錄的文件系統權限設置上
$ vim /etc/vsftpd/vsftpd.conf
#禁錮本地用戶在家目錄
chroot_local_user=YES
#禁錮本地用戶后允許寫權限
allow_writeable_chroot=YES
#重啟服務
$ systemctl restart vsftpd
實驗:
[root@localhost ~]# dnf -y install vsftpd[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# ss -anpt | grep vsftpd
LISTEN 0 32 *:21 *:* users:(("vsftpd",pid=991,fd=3))
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
allow_writeable_chroot=YES
[root@localhost ~]# systemctl restart vsftpd
2.客戶端(77.79)
#安裝連接命令
$ dnf -y install ftp
#連接ftp服務器
$ ftp ftp服務器IP
輸入用戶名:vsftpd服務的用戶名
輸入密碼:vsftpd服務該用戶的密碼
ftp> pwd #查看當前位置,在本地用戶的家目錄即/home/用戶名
ftp> get 文件名 #從共享目錄下載文件到客戶端的當前位置
ftp> put 文件名 #向共享目錄上傳文件、默認有權限
ftp> mkdir 目錄名 #在共享目錄中創建目錄的權限、默認有權限
ftp> rename、delete等 #在共享目錄的其他寫權限、默認有權限
實驗:
[root@localhost ~]# ftp 192.168.77.77
Connected to 192.168.77.77 (192.168.77.77).
220 (vsFTPd 3.0.5)
Name (192.168.77.77:root): zhaoliu
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ?
Commands may be abbreviated. Commands are:! debug mdir sendport site
$ dir mget put size
account disconnect mkdir pwd status
append exit mls quit struct
ascii form mode quote system
bell get modtime recv sunique
binary glob mput reget tenex
bye hash newer rstatus tick
case help nmap rhelp trace
cd idle nlist rename type
cdup image ntrans reset user
chmod lcd open restart umask
close ls prompt rmdir verbose
cr macdef passive runique ?
delete mdelete proxy send
ftp> ls
227 Entering Passive Mode (192,168,77,77,134,90).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Sep 08 13:49 1.txt
-rw-r--r-- 1 0 0 0 Sep 08 13:49 2.txt
-rw-r--r-- 1 0 0 0 Sep 08 13:49 3.txt
-rw-r--r-- 1 0 0 0 Sep 08 13:49 4.txt
-rw-r--r-- 1 0 0 0 Sep 08 13:49 5.txt
226 Directory send OK.
ftp> pwd
257 "/" is the current directoryftp> get 1.txt
local: 1.txt remote: 1.txt
227 Entering Passive Mode (192,168,77,77,164,68).
150 Opening BINARY mode data connection for 1.txt (0 bytes).
226 Transfer complete.ftp> !ls
1.txt anaconda-ks.cfg cat.sh nginx-1.26.3.tar.gz ng.txtftp> put cat.sh
local: cat.sh remote: cat.sh
227 Entering Passive Mode (192,168,77,77,211,74).
150 Ok to send data.
226 Transfer complete.
389 bytes sent in 9.6e-05 secs (4052.08 Kbytes/sec)ftp> mkdir bik.d
257 "/bik.d" createdftp> delete 3.txt
250 Delete operation successful.
注:在/etc/vsftpd/user_list中定義了被拒絕使用ftp服務的系統用戶
補充
windows客戶端
1、在文件資源管理器的地址欄中,輸入:ftp://vsftpd服務IP/,右鍵登錄
或者:ftp://username:password@vsftpd服務IP
2、filezilla軟件
五、匿名用戶登錄及設置
1.服務端(77.77)
#安裝軟件
$ dnf -y install vsftpd
#開啟服務
$ systemctl start vsftpd
#通過端口驗證開啟成功,結果中可以看到用來監聽的21端口
$ ss -antp | grep vsftpd
#注意此時應該先把要上傳共享目錄的文件系統權限設置上
$ vim /etc/vsftpd/vsftpd.conf
#開啟匿名用戶模式
anonymous_enable=YES
#設置上傳權限
anon_upload_enable=YES
#設置創建目錄權限
anon_mkdir_write_enable=YES
#設置上傳后文件或創建目錄后的默認權限
anon_umask=022
#設置其他寫入權限
anon_other_write_enable=YES
#重啟服務
$ systemctl restart vsftpd
注1:權限生效=vsftpd服務開放權限+有文件系統權限(否則會出現550錯誤狀態碼)
注2:匿名用戶一定不要改/var/ftp這個目錄的文件系統權限,否則退出后服務再起不來
注3:配置文件里的布爾類型(YES或NO),結尾不能有空格
2.客戶端(77.79)
#安裝連接命令
$ dnf -y install ftp
#連接ftp服務器
$ ftp ftp服務器IP
輸入用戶名:ftp 或 anonymous
輸入密碼:隨便輸入、一般輸空直接回車
ftp> pwd #查看當前位置,在匿名用戶的共享根目錄即/var/ftp
ftp> get 文件名 #從共享目錄下載文件到客戶端的當前位置
ftp> put 文件名 #向共享目錄上傳文件、默認沒有
ftp> mkdir 目錄名 #在共享目錄中創建目錄的權限、默認沒有
ftp> rename、delete等 #在共享目錄的其他寫權限、默認沒有
實驗:
[root@localhost ~]# ftp 192.168.77.77
Connected to 192.168.77.77 (192.168.77.77).
220 (vsFTPd 3.0.5)
Name (192.168.77.77:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.ftp> pwd
257 "/" is the current directoryftp> ls
227 Entering Passive Mode (192,168,77,77,225,225).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Sep 08 14:02 a.txt
-rw-r--r-- 1 0 0 0 Sep 08 14:02 b.txt
-rw-r--r-- 1 0 0 0 Sep 08 14:02 c.txt
-rw-r--r-- 1 0 0 0 Sep 08 14:02 d.txt
-rw-r--r-- 1 0 0 0 Sep 08 14:02 e.txt
-rw-r--r-- 1 0 0 0 Sep 08 14:02 f.txt
drwxr-xr-x 2 0 0 6 Oct 30 2023 pub
226 Directory send OK.ftp> !ls
1.txt anaconda-ks.cfg cat.sh nginx-1.26.3.tar.gz ng.txt#服務器端已配置好vsftpd相關服務,但ftp用戶沒有文件系統權限
ftp> put cat.sh
local: cat.sh remote: cat.sh
227 Entering Passive Mode (192,168,77,77,81,146).
553 Could not create file.
ftp> mkdir 1.txt
550 Create directory operation failed.#使用setfacl -m u:ftp:rwx /var/ftp/手動為根目錄添加寫權限,再試
ftp> mkdir 1.txt
257 "/1.txt" created
ftp> put cat.sh
local: cat.sh remote: cat.sh
227 Entering Passive Mode (192,168,77,77,181,17).
150 Ok to send data.
226 Transfer complete.
389 bytes sent in 3.7e-05 secs (10513.51 Kbytes/sec)
注:默認情況下,只有寫權限;不可以用chmod o+w的方式設置文件系統寫權限,因為會導致權限泄露;目錄只有擁有w權限,才可以創建子文件、子目錄、刪除文件或改名。
六、VSFTPD加密
1.加密方式(vsftpd+ssl)
- ssl:Secure Socket Layer,安全套接字,安全性協議
- TLS:基于SSL開發,支持更多功能
實驗:在服務端使用tcpdump工具抓包,客戶端連接
可以看到用戶名和密碼都是明文傳輸,并不安全,所以才需要ssl進行加密
2.SSL主要功能
- 認證用戶和服務器
- 加密數據
- 維護數據的完整性
3.PKI組成:公鑰基礎設施(CA,X.509,SSL)
- CA:證書申請——審批——發放——更新——查詢、撤銷、廢止——歸檔
- 常見的CA機構:Let's Encrypt
- CA申請:公網域名+ip
- 實驗:模擬做自簽名證書——自己信任
4.加密原理
- 服務端在本地生成一對密鑰,攜數據、公鑰申請CA認證
- CA機構通過單項的哈希算法(如MD5)將申請加密為“信息摘要”
- CA機構對“信息摘要”進行再次加密,變成數字簽名
- 數字證書=申請信息+服務器公鑰+數字簽名
5.加密步驟
(1)安裝ssl軟件包(openssl和open-devel)
[root@localhost ~]# dnf -y install openssl openssl-devel
(2)基于ssh生成密鑰對(對稱加密)
#密鑰對vsftpd.key
[root@localhost vsftpd]# openssl genrsa -out vsftpd.key 2048
[root@localhost vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh vsftpd.key
(3)拿公鑰、公司信息做數字證書申請
[root@localhost vsftpd]# openssl genrsa -out vsftpd.key 2048
[root@localhost vsftpd]# lsftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh vsftpd.key
[root@localhost vsftpd]# openssl req -new -key vsftpd.key -out vsftpd.csr
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
State or Province Name (full name) []:shanxi
Locality Name (eg, city) [Default City]:lvliang
Organization Name (eg, company) [Default Company Ltd]:tuanyuan
Organizational Unit Name (eg, section) []:qingnian
Common Name (eg, your name or your server's hostname) []:qingnian
Email Address []:320966772@qq.comPlease enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:[root@localhost vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh vsftpd.csr vsftpd.key
(4)簽發證書
[root@localhost vsftpd]# openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt
Certificate request self-signature ok
subject=C = cn, ST = shanxi, L = lvliang, O = gongqing, OU = qingnian, CN = xxhf
[root@localhost vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh vsftpd.crt vsftpd.csr vsftpd.key
補充:Linux證書擴展名:.crt或.pem(但以pem為擴展名的不一定是證書)
(5)將ssl相關配置寫入配置文件(添加加密設置)
vim /etc/vsftpd/vsftpd.conf
#啟用ssl認證
ssl_enable=YES
#開啟tlsv1、sslv2、sslv3都支持,轉換成使用tls1.2
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
#允許匿名用戶{虛擬用戶}
allow_anon_ssl=YES
#匿名登錄和傳輸時強制使用ssl
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
#本地登錄和傳輸時強制使用ssl
force_local_logins_ssl=YES
force_local_data_ssl=YES
#rsa格式的證書
rsa_cert_file=/etc/vsftpd/vsftpd.crt
#rsa格式的公鑰
rsa_private_key_file=/etc/vsftpd/vsftpd.key
(6)重啟服務
[root@localhost vsftpd]# systemctl start vsftpd
6.客戶端驗證
注:要找支持ftp、ftps協議的客戶端
服務端監聽:tcpdump -nA -i ens160 port 21 > ftp2.txt
客戶端連接:第三方工具filezilla或lftp服務,均可以看到用戶名和密碼已經被加密
安裝lftp
[root@localhost ~]# dnf -y install lftp
[root@localhost ~]# lftp -u zhaoliu -e "set ssl:verify-certificate no" 192.168.77.77
Password:
lftp zhaoliu@192.168.77.77:~> ls
-rw-r--r-- 1 0 0 0 Sep 08 13:49 1.txt
-rw-r--r-- 1 0 0 0 Sep 08 13:49 2.txt
-rw-r--r-- 1 0 0 0 Sep 08 13:49 4.txt
-rw-r--r-- 1 0 0 0 Sep 08 13:49 5.txt
drwxr-xr-x 2 1004 1004 6 Sep 08 13:50 bik.d
-rw-r--r-- 1 1004 1004 389 Sep 08 13:50 cat.sh
查看服務端文件,可以看到用戶名和密碼均已被加密
補充說明:
- lftp——命令跟shell都一樣;支持fpts協議;vsftpd重啟,客戶端連接不斷
- 虛擬機和真實機時間不同步,可能會導致證書不生效,需要同步時間,可在虛擬機——設置——選項——時間同步,中設置