- FTP協議簡介
- FTP軟件介紹
- vsftpd服務簡介
- vsftpd配置
- vsftpd虛擬用戶
一、FTP協議簡介
(一)特點
基于C/S架構
雙通道協議:數據和命令連接
-
數據傳輸格式:二進制(默認)和文本
- 注意:傳輸非文本時使用文本格式可能因操作系統不同導致文件內容變化,故應慎用
(二)兩種模式
從建立數據連接時服務器的角色,分為主動模式(PORT Style) 和被動模式(PASV Style)
無論主動模式還是被動模式,命令連接都是相同的,服務器端口為21
(1)被動模式(linux客戶端默認)
建立數據連接時,先由服務器端通過命令連接將198和165兩個隨機數發送給客戶端,客戶端據此計算出服務器的端口號50853=198*256+165,并主動向服務器發出數據連接請求
(2)主動模式(windows客戶端默認)
建立數據連接時,服務器主動在20端口向客戶端發起請求
二、FTP軟件介紹
(一)FTP服務器
- Wu-ftpd, Proftpd, Pureftpd, ServU, IIS
- vsftpd(Very Secure FTP Daemon): CentOS默認FTP服務器
高速,穩定,下載速度是WU-FTP的兩倍
(二)客戶端軟件
命令行工具
ftp, lftp, lftpget, wget, curl
ftp -A ftpserver:port -A主動模式 -p 被動模式
lftp -u username ftpserver
lftp username@ftpserver
lftpget ftp://ftpserver/pub/file圖形界面工具
filezilla, CuteFtp, FlashFXP, LeapFtp
瀏覽器 ftp://username:password@ftpserver
(三)FTP狀態碼
- 1XX:信息
125:數據連接打開 - 2XX:成功類狀態
200:命令OK ;230:登錄成功 - 3XX:補充類
331:用戶名OK - 4XX:客戶端錯誤
425:不能打開數據連接 - 5XX:服務器錯誤
530:不能登錄
(四)用戶認證:三種方式
匿名用戶:ftp, anonymous, 對應Linux用戶ftp
系統用戶:Linux用戶, 用戶/etc/passwd, 密碼/etc/shadow
-
虛擬用戶:特定服務的專用用戶,獨立的用戶/密碼文件,需要配合的組件
- nsswitch: network service switch名稱解析框架
- pam: pluggable authentication module 用戶認證
/lib64/security /etc/pam.d/ /etc/pam.conf
三、vsftpd服務簡介
用戶認證配置文件:/etc/pam.d/vsftpd
服務腳本:
CentOS 7:/usr/lib/systemd/system/vsftpd.service
CentOS 6:/etc/rc.d/init.d/vsftpd-
配置文件:/etc/vsftpd/vsftpd.conf
- 查詢幫助:man 5 vsftpd.conf
- 格式:option=value
注意:=前后不要有空格
-
共享文件位置:
- 匿名用戶(映射為系統用戶ftp)共享文件位置:ftp用戶家目錄/var/ftp
- 系統用戶共享文件位置:用戶家目錄
- 虛擬用戶共享文件位置:為其映射的系統用戶的家目錄
四、vsftpd配置
(一)端口設置
(1)命令端口
listen_port=21
(2)主動模式端口
- 配置條目
connect_from_port_20=YES` // 主動模式端口為20
// 注意即使指定其他端口此時值仍是YES,不可修改為NO
ftp_data_port=20` // 指定主動模式的端口
- 實驗1-1:將主動模式的端口修改為2020
// 服務器編輯配置文件
vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES //本行下添加如下內容
ftp_data_port=2020
service vsftpd restart
// 服務器增加共享文件
cd /var/ftp/pub
dd if=/dev/zero of=file1 bs=1M count=1024
// 客戶端匿名登錄,下載文件
ftp 192.168.136.229
Name (192.168.136.229:root): ftp
Password:
ftp> cd pub
ftp> ls
ftp> passive //關閉被動模式,開啟主動模式
ftp> get file1
// 服務器端查看端口活動,數據傳輸時打開了2020端口
ss -ntp
(3)被動模式端口范圍
- 配置條目
pasv_min_port=6000` // 端口起始范圍,0為隨機分配
pasv_max_port=6010` // 端口結束范圍
- 實驗1-2:設置被動模式的端口范圍為6000-6010
// 服務器編輯配置文件
vim /etc/vsftpd/vsftpd.conf
connect_from_port_20=YES //本行下添加如下內容
pasv_min_port=6000
pasv_max_port=6010
service vsftpd restart
// 服務器增加共享文件
cd /var/ftp/pub
dd if=/dev/zero of=file1 bs=1M count=1024
dd if=/dev/zero of=file2 bs=1M count=512
dd if=/dev/zero of=file3 bs=1M count=256
// 分別在三個客戶端匿名登錄,下載文件
ftp 192.168.136.229
Name (192.168.136.229:root): ftp
Password:
ftp> cd pub
ftp> get file1|file2|file3 //三個客戶端各自下載file1/2/3
// 服務器端查看端口活動,數據傳輸時打開了3個在設置范圍內的端口
ss -ntp
(二)時間設置
-
use_localtime=YES
:使用當地時間(默認為NO,使用GMT,但當前設置值NO為正確時間)
(三)匿名用戶
(1)配置條目
anonymous_enable=YES // 支持匿名用戶
no_anon_password=YES // 匿名用戶略過口令檢查,默認NO
anon_world_readable_only=NO // 只能下載所有者、所屬組、其他人都有讀權限的文件,默認YES
anon_upload_enable=YES // 匿名上傳,注意文件系統權限
anon_mkdir_write_enable=YES // 匿名創建目錄
anon_other_write_enable=YES // 可刪除和修改上傳的文件
anon_umask=077 // 指定匿名上傳umask
// 指定上傳文件的默認所有者和權限
chown_uploads=YES //默認NO
chown_username=wang
chown_upload_mode=0644
(2)實驗:修改vsftpd服務匿名登錄配置
-
實驗3-1,輸入用戶名ftp后,自動登陸成功
vim /etc/vsftpd/vsftpd.conf no_anon_password=YES service vsftpd restart
-
實驗3-2,實現匿名上傳文件
vim /etc/vsftpd/vsftpd.conf anon_upload_enable=YES // 取消行首的注釋符 mkdir /var/ftp/upload setfacl -m u:ftp:rwx /var/ftp/upload/ service vsftpd restart
匿名登錄的根目錄不能上傳文件,創建子目錄并賦予相應權限,實現文件上傳
注意匿名登錄時根目錄不能擁有所屬組和其他人的寫權限,否則會報錯
-
實驗3-3,實現匿名環境下:上傳、刪除、下載文件,建立目錄,上傳文件權限為644
vim /etc/vsftpd/vsftpd.conf anon_world_readable_only=NO anon_mkdir_write_enable=YES anon_other_write_enable=YES anon_umask=022 service vsftpd restart
- 實現匿名上傳文件的權限被設定為644(umask 022)
- 實現匿名下載文件
- 實現匿名刪除ftp共享的文件
- 實現匿名建立目錄
-
實驗3-4,實現確定匿名上傳文件的所有者和權限
chown_uploads=YES chown_username=hellopeiyang chown_upload_mode=0644
- 上傳后的文件的權限符合設置要求
(四)系統用戶
- 配置條目
guest_enable=YES // 所有系統用戶都映射成guest用戶
guest_username=ftp // 配合上面選項才生效,指定guest用戶
local_enable=YES // 是否允許linux用戶登錄
write_enable=YES // 允許linux用戶上傳文件
local_umask=022 // 指定系統用戶上傳文件的默認權限
local_root=/ftproot // 非匿名用戶登錄所在目錄
// 禁錮所有系統用戶在家目錄中
chroot_local_user=YES // 禁錮系統用戶,默認NO
// 禁錮或不禁錮特定的系統用戶在家目錄中,與上面設置功能相反
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
// 當chroot_local_user=YES時,則chroot_list中用戶不禁錮,白名單
// 當chroot_local_user=NO時,則chroot_list中用戶禁錮,黑名單
-
實驗4-1:將用戶hellopeiyang禁錮在家目錄
vim /etc/vsftpd/vsftpd.conf chroot_local_user=NO chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list echo "hellopeiyang" > /etc/vsftpd/chroot_list service vsftpd restart
- 以hellopeiyang賬戶登錄,被禁錮在家目錄,顯示目錄為根目錄,無法再向上切換
- 以bob賬戶登錄,沒有禁錮目錄,很輕松切換到了/etc目錄,非常危險
(五)日志
- wu-ftp日志:默認啟用
xferlog_enable=YES // (默認)啟用記錄上傳下載日志
xferlog_std_format=YES // (默認)使用wu-ftp日志格式
xferlog_file=/var/log/xferlog // (默認)可自動生成
- vsftpd日志:默認不啟用
dual_log_enable=YES // 使用vsftpd日志格式,默認不啟用
vsftpd_log_file=/var/log/vsftpd.log // (默認)可自動生成
-
實驗5-1:開啟vsftpd.log日志文件
vim /etc/vsftpd/vsftpd.conf dual_log_enable=YES service vsftpd restart
- vsftpd.log文件內容:記錄登錄情況
- xferlog文件內容:記錄上傳下載情況
(六)提示信息
- 登錄提示信息
ftpd_banner=“welcometo mage ftp server"
banner_file=/etc/vsftpd/ftpbanner.txt //本條記錄優先生效
- 目錄訪問提示信息
dirmessage_enable=YES // (默認)
message_file=.message // (默認)信息存放在指定目錄下.message
- 實驗6-1:設置歡迎信息,登錄時顯示:"this is hellopeiyang ftp service", 進入pub子目錄時顯示"public directory",進入upload子目錄時顯示"upload directory"
vim /etc/vsftpd/vsftpd.conf
banner_file=/etc/vsftpd/ftpbanner.txt
echo "this is hellopeiyang ftp service" > /etc/vsftpd/ftpbanner.txt
echo "public directory" > /var/ftp/pub/.message
echo "upload directory" > /var/ftp/upload/.message
service vsftpd restart
(七)登錄控制
- 使用pam完成用戶認證
- 在/etc/vsfptd/vsftpd.conf配置文件中:
pam_service_name=vsftpd
:指明引用的pam配置文件路徑 - pam配置文件路徑:/etc/pam.d/vsftpd,格式如下
- 在/etc/vsfptd/vsftpd.conf配置文件中:
auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
// 當sense=deny時,拒絕/etc/vsftpd/ftpusers文件中用戶登錄
// 當sense=allow時,允許/etc/vsftpd/ftpusers文件中用戶登錄
- 啟用控制用戶登錄的列表文件
userlist_enable=YES // 默認有此設置
userlist_deny=YES // 黑名單,默認值,不提供輸入口令的機會,NO為白名單
userlist_file=/etc/vsftpd/users_list // 用戶列表文件,此為默認值
- 連接限制
max_clients=0 // 最大并發連接數,0為無限制
max_per_ip=0 // 每個IP同時發起的最大連接數,0為無限制
vsftpd服務指定用戶身份運行:
nopriv_user=nobody
-
實驗:實現用戶登錄控制
- 實驗7-1:使用pam禁止用戶hellopeiyang登錄ftp服務
vim /etc/pam.d/vsftpd // 保證sense=deny auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed echo "hellopeiyang" >> /etc/vsftpd/ftpusers //追加用戶hellopeiyang service vsftpd restart
- 實驗7-2:使用用戶列表禁止用戶bob登錄ftp服務
echo bob >> /etc/vsftpd/user_list service vsftpd restart
- 實驗7-3:限制最大并發連接數為2,相同IP同時連接數為2
vim /etc/vsftpd/vsftpd.conf max_clients=5 max_per_ip=2 service vsftpd restart
(八)傳輸控制
- 傳輸速率:字節/秒
anon_max_rate=0 // 匿名用戶的最大傳輸速率
local_max_rate=0 // 本地用戶的最大傳輸速率
- 連接時間:秒為單位
connect_timeout=60 // 主動模式數據連接超時時長
accept_timeout=60 // 被動模式數據連接超時時長
data_connection_timeout=300 // 數據連接無數據傳輸超時時長
idle_session_timeout=60 // 無命令操作超時時長
- 優先以文本方式傳輸
ascii_upload_enable=YES
ascii_download_enable=YES
- 實驗8-1:限制匿名登錄用戶傳輸速度為1M/s,限制系統登錄用戶傳輸速度為2M/s
vim /etc/vsftpd/vsftpd.conf
anon_max_rate=1024000
local_max_rate=2048000
service vsftpd restart
// 準備bob家目錄的共享文件,設置相關權限
mkdir /home/bob/pub
setfacl -m u:bob:rwx /home/bob/pub/
cp /var/ftp/pub/file1 /home/bob/pub/
(九)vftpd服務配置
實現CentOS 6環境下vsftpd以非獨立服務方式運行(CentOS 7所有服務由systemd管理,都是以非獨立方式運行)
- 修改vsftpd配置文件
vim /etc/vsftpd/vsftpd.conf
listen=NO
- 配置xinted服務
vim /etc/xinetd.d/vsftpd
{
flags = REUSE
socket_type = stream
wait = no
user = root
server = /usr/sbin/vsftpd
log_on_failure += USERID
disable = no
}
service vsftpd stop
service xinetd start
ss -ntlp
(十)實現基于SSL的ftps
- 查看是否支持SSL,確實存在
ldd `which vsftpd`
- 創建自簽名證書
cd /etc/pki/tls/certs
make vsftpd.pem // 生成自簽名證書
openssl x509 -in vsftpd.pem -noout -text // 查看證書內容
cp vsftpd.pem /etc/vsftpd/
- 配置vsftpd服務
/etc/vsftpd/vsftpd.conf
ssl_enable=YES
allow_anon_ssl=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
rsa_cert_file=/etc/vsftpd/vsftpd.pem
service vsftp restart
- 使用FileZilla建立ftp連接
- 核實證書信息正確
- 登錄成功
五、vsftpd虛擬用戶
(一)vsftpd虛擬用戶介紹
(1)定義
所有虛擬用戶會統一映射為一個指定的系統帳號
訪問共享位置:此系統帳號的家目錄
各虛擬用戶可被賦予不同的訪問權限,通過匿名用戶的權限控制參數進行指定
(2)虛擬用戶賬號的存儲方式
文件:編輯文本文件,此文件需要被編碼為hash格式
奇數行:用戶名,偶數行:密碼
將文本轉換為berkerly db數據庫格式:db_load -T -t hash -f vusers.txt vusers.db
關系型數據庫中的表中:
實時查詢數據庫完成用戶認證
(二)實現基于DB的FTP虛擬用戶
(1)創建DB數據庫文件,存放虛擬用戶和密碼
vim /etc/vsftpd/ftpvusers
ftpuser1
ftp1
ftpuser2
ftp2
cd /etc/vsftpd/
db_load -T -t hash -f ftpvusers ftpvusers.db
chmod 600 ftpvusers.db
(2)建立系統用戶
useradd -d /var/ftpsite -s /sbin/nologin ftpvuser
chmod 555 /var/ftpsite/ //CentOS 7下根目錄誰也不能有寫權限
// 建立專屬上傳子目錄upload
mkdir /var/ftpsite/upload
setfacl -m u:ftpvuser:rwx /var/ftpsite/upload/
(3)創建pam配置文件
vim /etc/pam.d/vsftpd.vuser // 指定虛擬用戶DB數據庫文件目錄
auth required pam_userdb.so db=/etc/vsftpd/ftpvusers
account required pam_userdb.so db=/etc/vsftpd/ftpvusers
(4)指定pam配置文件
vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.vuser // 指定pam配置文件路徑
guest_enable=YES
guest_username=ftpvuser // 將虛擬用戶映射為系統用戶ftpvuser
user_config_dir=/etc/vsftpd/ftpvusers.conf.d/ //指定每個虛擬用戶獨立配置文件路徑
(5)建立每個虛擬用戶的獨立配置文件
mkdir /etc/vsftpd/ftpvusers.conf.d
cd /etc/vsftpd/ftpvusers.conf.d/
vim ftpuser1 // 配置文件名稱必須與虛擬賬戶名稱完全相同
anon_upload_enable=YES
anon_mkdir_write_enable=YES
vim ftpuser2 // 配置文件名稱必須與虛擬賬戶名稱完全相同
local_root=/app/ftp2 // 指定共享根目錄為/app/ftp2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
(6)配置共享根目錄,重啟vsftpd服務
touch /var/ftpsite/ftp1file //用于測試時驗證是否登錄進入了相應的目錄
mkdir -p /app/ftp2/upload
chmod 555 /app/ftp2
setfacl -m u:ftpvuser:rwx /app/ftp2/upload/
touch /app/ftp2/ftp2file //用于測試時驗證是否登錄進入了相應的目錄
systemctl restart vsftpd
(7)測試
- 從根目錄下文件ftp1file證明ftpuser1登錄到了相應的目錄
- ftpuser1登錄ftp服務可以在/upload子目錄下建立目錄,上傳文件
- 從根目錄下文件ftp2file證明ftpuser2登錄到了相應的目錄
- ftpuser2登錄ftp服務可以在/upload子目錄下建立目錄,上傳文件
(三)實現基于MYSQL的FTP虛擬用戶
- 本實驗需要兩臺主機,一臺充當FTP服務器,一臺充當MySQL服務器
FTP服務器:CentOS 7系統,IP地址為192.168.136.230
MySQL服務器:CentOS 7系統,IP地址為192.168.136.130
(1)FTP服務器上安裝vsftpd和pam_mysql
CentOS 6的epel源中存在pam_mysql安裝包,可以直接安裝
yum install vsftpd pam_mysql
在CentOS 7中需要編譯安裝pam_mysql,即在本實驗中需要編譯安裝
// 安裝并啟動vsftpd服務
yum install vsftpd
systemctl start vsftpd
// 編譯安裝pam_mysql
yum groupinstall "development tools"
yum install mariadb-devel pam-devel
tar xvf pam_mysql-0.7RC1.tar.gz -C /usr/local/src/
cd /usr/local/src/pam_mysql-0.7RC1/
./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/lib64/security
make && make install
(2)FTP服務器上建立系統用戶
useradd -d /app/ftpsite -s /sbin/nologin ftpvuser
chmod 555 /app/ftpsite/
cd /app/ftpsite/
mkdir /app/ftpsite/upload
setfacl -m u:ftpvuser:rwx /app/ftpsite/upload
(3)MySQL服務器上配置虛擬用戶的數據庫
// 安裝MariaDB并啟動服務
yum install mariadb-server
systemctl start mariadb
mysql_secure_installation
// 建立虛擬用戶數據庫
mysql -uroot -pmagedu
MariaDB [(none)]> create database ftpdb;
MariaDB [(none)]> use ftpdb;
MariaDB [ftpdb]> create table ftpvusers (id int unsigned auto_increment primary key,username char(30),password char(48));
// 使用password()函數加密密碼,避免明文存儲密碼
MariaDB [ftpdb]> insert ftpvusers (username,password) values ('ftpuser1',password('centos')),('ftpuser2',password('centos'));
MariaDB [ftpdb]> grant all on ftpdb.* to ftpuser@'192.168.136.%' identified by 'centos';
MariaDB [ftpdb]> flush privileges;
(4)FTP服務器上創建pam配置文件
vim /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=ftpuser passwd=centos host=192.168.136.130 db=ftpdb table=ftpvusers usercolumn=username passwdcolumn=pas
sword crypt=2
account required pam_mysql.so user=ftpuser passwd=centos host=192.168.136.130 db=ftpdb table=ftpvusers usercolumn=username passwdcolumn=
password crypt=2
- crypt是加密方式,0表示不加密,1表示crypt(3)加密,2表示使用mysql password()函數加密,3表示md5加密,4表示sha1加密
(5)FTP服務器上指定pam配置文件
vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.mysql
guest_enable=YES
guest_username=ftpvuser
user_config_dir=/etc/vsftpd/vusers.conf.d/
(6)FTP服務器上建立每個虛擬用戶的獨立配置文件
mkdir /etc/vsftpd/vusers.conf.d
vim /etc/vsftpd/vusers.conf.d/ftpuser1
anon_upload_enable=YES
vim /etc/vsftpd/vusers.conf.d/ftpuser2
anon_upload_enable=YES
local_root=/app/ftpsite2/
(7)FTP服務器上配置共享根目錄,重啟vsftpd服務
mkdir -p /app/ftpsite2/upload
chmod 555 /app/ftpsite2
setfacl -m u:ftpvuser:rwx /app/ftpsite2/upload/
touch /app/ftpsite/ftpfile1
touch /app/ftpsite2/ftpfile2
(8)測試
- ftpuser1賬戶登錄測試,進入了正確的目錄,可以在子目錄/upload上傳文件
- ftpuser2賬戶登錄測試,進入了正確的目錄,可以在子目錄/upload上傳文件