Ftp
ftp簡介
網絡文件共享服務主流的主要有三種,分別是ftp、nfs、samba。
FTP是File Transfer Protocol(文件傳輸協議)的簡稱,用於internet上的控制文件的雙向傳輸。
FTP也是一個應用程序,基於不同的操作系統有不同的FTP應用程序,而所有這些應用程序都遵守同一種協議以傳輸文件。
在FTP的使用當中,用戶經常遇到兩種概念:下載和上傳
| 下載(Download) | 上傳(Upload) |
|---|---|
| 從遠程主機拷貝文件至自己的計算機上 | 將文件從自己的計算機上拷貝至遠程主機上 |
ftp架構
FTP工作於應用層,監聽於tcp的21號端口,是一種C/S架構的應用程序。其有多種客戶端和服務端的應用程序,下面來簡單介紹一下
| 客戶端工具 | 服務端軟件 |
|---|---|
| ftp lftp,lftpget wget,curl filezilla gftp(Linux GUI) 商業軟件(flashfxp,cuteftp) | wu-ftpd proftpd(提供web接口的一種ftp服務端程序) pureftp vsftpd(Very Secure) ServU(windows平台的一種強大ftp服務端程序) |
ftp數據連接模式
ftp有2種數據連接模式:命令連接和數據連接
- 命令連接:是指文件管理類命令,始終在線的持久性連接,直到用戶退出登錄為止
- 數據連接:是指數據傳輸,按需創建及關閉的連接
其中數據連接需要關注的有2點,一是數據傳輸格式,二是數據傳輸模式
數據傳輸格式有以下兩種:
- 文件傳輸
- 二進制傳輸
數據傳輸模式也有2種:
- 主動模式:由服務器端創建數據連接
- 被動模式:由客戶端創建數據連接
兩種數據傳輸模式的建立過程:
| 傳輸模式 | 建立過程 |
|---|---|
| 主動模式 | 命令連接: Client(1025)--> Server(21) 客戶端以一個隨機端口(大於1023)來連服務器端的21號端口 數據連接: Server(20/tcp) --> Client(1025+1) 服務器端以自己的20號端口去連客戶端創建命令連接時使用的隨機端口+1的端口號 |
| 被動模式 | 命令連接: Client(1110) --> Server(21) 客戶端以一個隨機端口來連成服務器端的21號端口 數據連接: Client(1110+1) --> Server(隨機端口) 客戶端以創建命令連接的端口+1的端口號去連服務器端通過命令連接告知自己的一個隨機端口號來創建數據連接 |
主動模式有個弊端,因為客戶端的端口是隨機的,客戶端如果開了防火牆,
則服務器端去連客戶端創建數據連接時可能會被拒絕
用戶認證
ftp的用戶主要有三種:
- 虛擬用戶:僅用於訪問某特定服務中的資源
- 系統用戶:可以登錄系統的真實用戶
- 匿名用戶
vsftpd
此處我們要說的ftp應用程序是vsftpd,這也是在公司中用得最多的一款ftp軟件。
vsftpd安裝
[root@node1 ~]# yum -y install vsftpd
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
baseos 2.5 MB/s | 2.8 kB 00:00
appstream 3.1 MB/s | 3.2 kB 00:00
Dependencies resolved.
====================================================================================
Package Architecture Version Repository Size
====================================================================================
Installing:
vsftpd x86_64 3.0.3-31.el8 AppStream 180 k
Transaction Summary
====================================================================================
Install 1 Package
Total size: 180 k
Installed size: 343 k
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : vsftpd-3.0.3-31.el8.x86_64 1/1
Running scriptlet: vsftpd-3.0.3-31.el8.x86_64 1/1
Verifying : vsftpd-3.0.3-31.el8.x86_64 1/1
Installed products updated.
Installed:
vsftpd-3.0.3-31.el8.x86_64
Complete!
vsftpd配置
/etc/pam.d/vsftpd //vsftpd用戶認證配置文件
/etc/vsftpd/ //配置文件目錄
/etc/vsftpd/vsftpd.conf //主配置文件
//匿名用戶(映射為ftp用戶)的共享資源位置是/var/ftp
//系統用戶通過ftp訪問的資源位置為用戶的家目錄
//虛擬用戶通過ftp訪問的資源位置為給虛擬用戶指定的映射成為的系統用戶的家目錄
[root@node1 ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #是否允許匿名訪問
local_enable=YES #是否允許本地用戶登錄
write_enable=YES #本地用戶有寫權限
local_umask=022 #本地用戶上傳的umask值
dirmessage_enable=YES #啟用某目錄下的.message描述信息,假定有一個目錄為/upload,在其下創建一個文件名為.message,在文件內寫入一些描述信息,則當用戶切換至/upload目錄下時會自動顯示.message文件中的內容
xferlog_enable=YES #是否啟用傳輸日志,記錄ftp傳輸過程
connect_from_port_20=YES #連接的端口是20號端口
xferlog_std_format=YES #傳輸日志是否使用標准格式
listen=NO #是否以獨立允許的方式監聽
listen_ipv6=YES
pam_service_name=vsftpd #指定vsftpd使用/etc/pam.d下的哪個pam配置文件進行用戶認證
userlist_enable=YES #是否啟用“禁止用戶登錄名單”
vsftpd常見的配置參數:
| 參數 | 作用 |
|---|---|
| anonymous_enable=YES | 啟用匿名用戶登錄 |
| anon_upload_enable=YES | 允許匿名用戶上傳 |
| anon_mkdir_write_enable=YES | 允許匿名用戶創建目錄,但是不能刪除 |
| anon_other_write_enable=YES | 允許匿名用戶創建和刪除目錄 |
| local_enable=YES | 啟用本地用戶登錄 |
| write_enable=YES | 允許本地用戶有寫權限 |
| local_umask=022 | 通過ftp上傳文件的默認遮罩碼 |
| chroot_local_user=YES | 禁錮所有的ftp本地用戶於其家目錄中 |
| chroot_list_enable=YES | 開啟禁錮文件列表 需要與chroot_list_file參數一起使用 |
| chroot_list_file=/etc/vsftpd/chroot_list | 指定禁錮列表文件路徑 在此文件里面的用戶將被禁錮在其家目錄中 |
| allow_writeable_chroot=YES | 允許被禁錮的用戶家目錄有寫權限 |
| xferlog_enable=YES | 是否啟用傳輸日志,記錄ftp傳輸過程 |
| xferlog_std_format=YES | 傳輸日志是否使用標准格式 |
| xferlog_file=/var/log/xferlog | 指定傳輸日志存儲的位置 |
| chown_uploads=YES | 是否啟用改變上傳文件屬主的功能 |
| chown_username=whoever | 指定要將上傳的文件的屬主改為哪個用戶 此用戶必須在系統中存在 |
| pam_service_name=vsftpd | 指定vsftpd使用/etc/pam.d下的 哪個pam配置文件進行用戶認證 |
| userlist_enable=YES | 是否啟用控制用戶登錄的列表文件: 默認為/etc/vsftpd/user_list文件 |
| userlist_deny=YES | 是否拒絕userlist指定的列表文件中存在的用戶登錄ftp |
| max_clients=# | 最大並發連接數 |
| max_per_ip=# | 每個IP可同時發起的並發請求數 |
| anon_max_rate | 匿名用戶的最大傳輸速率,單位是“字節/秒” |
| local_max_rate | 本地用戶的最大傳輸速率,單位是“字節/秒” |
| dirmessage_enable=YES | 啟用某目錄下的.message描述信息 假定有一個目錄為/upload,在其下創建一個文件名為.message, 在文件內寫入一些描述信息,則當用戶切換至/upload目錄下時會自動顯示.message文件中的內容 |
| message_file | 設置訪問一個目錄時獲得的目錄信息文件的文件名,默認是.message |
| idle_session_timeout=600 | 設置默認的斷開不活躍session的時間 |
| data_connection_timeout=120 | 設置數據傳輸超時時間 |
| ftpd_banner="Welcome to chenlf FTP service." | 定制歡迎信息,登錄ftp時自動顯示 |
//虛擬用戶的配置:
//所有的虛擬用戶會被統一映射為一個指定的系統帳號,訪問的共享位置即為此系統帳號的家目錄
//各虛擬用戶可被賦予不同的訪問權限,通過匿名用戶的權限控制參數進行指定
//虛擬用戶帳號的存儲方式:
1.文件:編輯文件,此文件需要被編碼為hash格式。
奇數行為用戶名
偶數行為密碼
2.關系型數據庫的表中:
通過即時查詢數據庫完成用戶認證
mysql庫:pam要依賴於pam_mysql軟件,可以通過epel源yum安裝
vsftpd配置
環境如下:
| 環境 | 主機名稱 | IP |
|---|---|---|
| 服務端 | node1 | 192.168.100.1 |
| 客戶端 | node2 | 192.168.100.2 |
准備工作
//關閉防火牆和SElinux
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# setenforce 0
[root@node2 ~]# systemctl stop firewalld
[root@node2 ~]# setenforce 0
//安裝vsftpd
[root@node1 ~]# yum -y install vsftpd
[root@node2 ~]# yum -y install ftp
//備份配置文件
[root@node1 ~]# cp /etc/vsftpd/vsftpd.conf{,.bak}
匿名用戶訪問模式
FTP匿名訪問是比較不安全的模式,在真實環境中千萬不要放入敏感數據以免泄露。
配置vsftpd.conf允許匿名訪問、寫入和上傳
//寫配置文件
[root@node1 ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=yes
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
//啟動服務
[root@node1 ~]# systemctl start vsftpd
//用客戶端訪問測試
[root@node2 ~]# ftp 192.168.100.1
Connected to 192.168.100.1 (192.168.100.1).
220 (vsFTPd 3.0.3)
Name (192.168.100.1:root): anonymous #輸入anonymous
331 Please specify the password.
Password: #回車即可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,100,1,145,194).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 6 Feb 17 2020 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir baozi
550 Create directory operation failed.
ftp> ls
227 Entering Passive Mode (192,168,100,1,122,253).
150 Here comes the directory listing.
226 Directory send OK.
ftp> exit
221 Goodbye.
//可以看到上面已經允許匿名用戶創建目錄和寫入權限,仍然被拒絕了,匿名用戶訪問的FTP根目錄是/var/ftp,而FTP根目所有者是root,修改所有者為ftp
[root@node1 ~]# ll /var/ftp/
total 0
drwxr-xr-x. 2 root root 6 Feb 17 2020 pub
[root@node1 ~]# chown ftp /var/ftp/pub/
[root@node1 ~]# ll /var/ftp/
total 0
drwxr-xr-x. 2 ftp root 6 Feb 17 2020 pub
//修改所有者后,在用客戶端嘗試
[root@node2 ~]# ftp 192.168.100.1
Connected to 192.168.100.1 (192.168.100.1).
220 (vsFTPd 3.0.3)
Name (192.168.100.1:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir baozi
257 "/pub/baozi" created
ftp> ls
227 Entering Passive Mode (192,168,100,1,230,137).
150 Here comes the directory listing.
drwx------ 2 14 50 6 Apr 06 08:53 baozi
226 Directory send OK.
ftp> exit
221 Goodbye.
//到服務端查看
[root@node1 ~]# ll /var/ftp/pub/
total 0
drwx------. 2 ftp ftp 6 Apr 6 16:53 baozi
本地用戶模式
本地用戶模式比匿名用戶模式更加安全一點,關閉匿名用戶訪問模式,vsftpd服務默認已經允許本地用戶訪問,只需要添加本地用戶模式權限參數,刪除原先用戶配置或者還原虛擬機,否則可能會因為配置文件沖突而報錯
//寫配置文件
[root@node1 ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
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
userlist_deny=YES
//重啟服務
[root@node1 ~]# systemctl restart vsftpd
//禁止用戶登錄的名單可以在ftpusers 或user_list中查看
[root@node1 ~]# cat /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
//vsftpd服務為了讓FTP更加安全,默認是禁止root用戶身份登錄的,這里創建一個普通用戶yqh登錄
[root@node1 ~]# useradd yqh
[root@node1 ~]# passwd yqh
Changing password for user yqh.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
//在客戶端測試用yqh用戶登錄
[root@node2 ~]# ftp 192.168.100.1
Connected to 192.168.100.1 (192.168.100.1).
220 (vsFTPd 3.0.3)
Name (192.168.100.1:root): yqh
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls -a
227 Entering Passive Mode (192,168,100,1,224,37).
150 Here comes the directory listing.
drwx------ 2 1000 1000 62 Apr 06 08:58 .
drwxr-xr-x 3 0 0 17 Apr 06 08:58 ..
-rw-r--r-- 1 1000 1000 18 Aug 30 2019 .bash_logout
-rw-r--r-- 1 1000 1000 141 Aug 30 2019 .bash_profile
-rw-r--r-- 1 1000 1000 312 Aug 30 2019 .bashrc
226 Directory send OK.
ftp> mkdir yqh1
257 "/home/yqh/yqh1" created
ftp> ls
227 Entering Passive Mode (192,168,100,1,171,29).
150 Here comes the directory listing.
drwxr-xr-x 2 1000 1000 6 Apr 06 09:00 yqh1
226 Directory send OK.
ftp> exit
221 Goodbye.
//在服務端查看
[root@node1 ~]# ll /home/yqh/
total 0
drwxr-xr-x. 2 yqh yqh 6 Apr 6 17:00 yqh1
虛擬用戶模式
刪除原先用戶配置或者還原虛擬機,否則可能會因為配置文件沖突而報錯。
虛擬用戶模式的賬號口令都不是真實系統中存在的,所以只要配置妥當虛擬用戶模式比本地用戶模式更加安全。
虛擬用戶的配置:
所有的虛擬用戶會被統一映射為一個指定的系統帳號,訪問的共享位置即為此系統帳號的家目錄
各虛擬用戶可被賦予不同的訪問權限,通過匿名用戶的權限控制參數進行指定
虛擬用戶帳號的存儲方式:
1.文件:編輯文件,此文件需要被編碼為hash格式。
奇數行為用戶名
偶數行為密碼
2.關系型數據庫的表中:
通過即時查詢數據庫完成用戶認證
mysql庫:pam要依賴於pam_mysql軟件,可以通過epel源yum安裝
虛擬用戶模式配置流程大致如下:
1.建立虛擬FTP用戶數據庫文件
2.創建FTP根目錄及虛擬用戶映射的系統用戶
3.建立虛擬用戶的PAM認證文件
4.在vsftpd.conf文件中添加支持配置
5.為虛擬用戶設置不同權限
6.重啟服務
以文件方式存儲虛擬賬號:
//建立虛擬FTP用戶數據庫文件
[root@node1 ~]# vim /etc/vsftpd/vuser.txt
yuqinghao
123
baozi
456
//使用db_load命令用HASH算法生成FTP用戶數據庫文件vuser.db
##-T表示轉換,-t表示加密方式使用hash算法加密
[root@node1 ~]# db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db
//提高虛擬用戶帳號文件的安全性,應將文件權限設置為600,以避免數據外泄
[root@node1 ~]# chmod 600 /etc/vsftpd/vuser*
//創建FTP根目錄及虛擬用戶映射為系統用戶
[root@node1 ~]# useradd -d /var/ftproot -s /sbin/nologin vuser
//修改其家目錄權限保證其他用戶可以訪問
[root@node1 ~]# chmod 755 /var/ftproot/
//建立虛擬用戶的PAM認證文件
##參數db用於指向剛剛生成的vuser.db文件,不用加后綴
[root@node1 ~]# vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
//在vsftpd.conf文件中添加支持配置
[root@node1 ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
pam_service_name=vsftpd.vu
guest_enable=YES
guest_username=vuser
allow_writeable_chroot=YES
//為虛擬用戶設置不同權限
[root@node1 ~]# mkdir /etc/vsftpd/vuser_dir
[root@node1 ~]# echo 'user_config_dir=/etc/vsftpd/vuser_dir' >> /etc/vsftpd/vsftpd.conf
//為不同的虛擬用戶配置權限,yuqinghao用戶可以上傳和創建目錄,以及寫入權限
[root@node1 ~]# vim /etc/vsftpd/vuser_dir/yuqinghao
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
//baozi用戶只有默認的下載權限,只需要創建一個名為baozi空文件即可
[root@node1 ~]# touch /etc/vsftpd/vuser_dir/baozi
//重啟服務
[root@node1 ~]# systemctl restart vsftpd
//在客戶端測試
//用yuqinghao用戶測試
[root@node2 ~]# ftp 192.168.100.1
Connected to 192.168.100.1 (192.168.100.1).
220 (vsFTPd 3.0.3)
Name (192.168.100.1:root): yuqinghao
331 Please specify the password.
Password:123
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir 123
257 "/123" created
ftp> exit
221 Goodbye.
//用baozi用戶測試
[root@node2 ~]# ftp 192.168.100.1
Connected to 192.168.100.1 (192.168.100.1).
220 (vsFTPd 3.0.3)
Name (192.168.100.1:root): baozi
331 Please specify the password.
Password:456
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir 456
550 Permission denied.
ftp> exit
221 Goodbye.
