FTP
簡介
ftp(file transfer protocol,文件傳輸協議)是 Internet 上仍常用的最老的網絡協議之一 , 它爲系統提供了通過網絡與遠程服務器進行傳輸的簡單方法。FTP是一個客戶機/服務器系統
ftp是文件共享服務。工作在應用層。
linux中三種常用的文件服務:
(1)ftp:工作在應用層的文件共享協議,在client端和server端的通信是通過tcp/ip協議的上層服務來實現的。
(2)nfs(Netwok File System網絡文件系統):基於rpc(remote Procedure Call遠程過程調用)的文件共享服務。rpc:讓兩臺主機間的進程直接依賴於二進制協議完成通信。如hadoop
(3)samba:基於CIFS(通用文件系統)/SMB文件共享。實現文件跨平臺傳輸。讓linux支持cifs協議。讓linux出現在windows的網上鄰居中
linux實現ftp協議的軟件:
服務器端的程序(紅帽中):
Vsftpd(Very Secure File Transfer Protocol Damon)注重安全
客戶端程序:
命令行格式(CLI):ftp,lftp
FTP有兩個連接:
命令連接(控制連接):接收用戶發來的命令並檢查文件發來的命令;一直在線。服務端端口21/tcp
數據連接:進行傳輸文件;按需打開,按需關閉。
按數據傳輸的請求由誰發起分爲主動模式和被動模式。主動、被動模式是站在服務器端的角度。
主動模式:當客戶端請求數據傳輸時,服務器打開20/tcp端口主動向客戶端發送數據。此時服務器端的端口是20/tcp。如果客戶端有防火牆則不能進行數據傳輸。因爲主動連接時,服務器端主動連接客戶端的請求會被客戶端的防火牆擋掉,所以連接不上。
被動模式:當客戶端請求數據傳輸時,服務器端通過命令連接給客戶端發送一個報文,告訴客戶端自己已經打開了一個端口,讓客戶端主動連接這個端口,從而進行傳輸數據。此時服務器端口隨機。
主動模式:
Server
Client
2121221
0222
被動模式:
Server
Client
防火牆:“擋掉進來的連接”。當主機接入互聯網,防火牆將屏蔽“不請自來的請求和連接。關閉不需要的端口。端口就相當於“門”
防火牆的“連接追蹤”功能:自行判斷連接和連接的關係。
追蹤來回請求的特徵
客戶端發起的新建立的連接請求:new
建立連接的響應:established
每一個數據連接和每一個命令連接有關係:related(相關聯的會放行)
兩種模式的比較:
共同點:都是通過21/tcp端口進行用戶驗證及管理
不同點:傳輸數據的方式不同
關於端口:tcp/ip協議中,Tcp 65535個端口,Udp 65535多個端口
一般用到的端口是1~65535。
1~1023爲系統端口(BSD保留端口),只有系統特許的進程才能使用;
1024~65535爲用戶端口;
1024~5000爲BSD臨時端口,一般的應用程序使用1024~4999來進行通信;
5001~65535爲BSD服務器(非特權)端口,用戶自定義端口
Vsftpd
vsftpd(Very Secure FTP Deamon):非常安全的ftp後臺服務。
21/tcp(/etc/services查看端口號)
配置文件目錄:/etc/vsftpd(rpm包)
服務腳本:/etc/init.d/vsftpd
主程序:/usr/sbin/vsftpd
匿名用戶文件根目錄(ftp用戶的家目錄):/var/ftp(不允許除了root外用戶其他用戶有對此目錄的寫權限,包括ftp用戶)。不能允許運行這個服務的用戶擁有寫權限,所以在/var/ftp/下建立子目錄放置上傳的文件。setfacl -m u:ftp:rwx /var/ftp/upload
默認配置文件讓匿名用戶(anonymous)只能下載位於CHROOT(/var/ftp)目錄中的內容。意爲遠程FTP客戶端能以用戶anonymous或ftp身份連接到服務器(不需要密碼),並從/var/ftp目錄下載文件(其本地ftp用戶可以讀取這些文件)。getent passwd ftp ##查看ftp用戶的家目錄
支持上傳和下載
下載風險小
上傳風險大
基於PAM(可插入式認證模塊)實現用戶認證:
/etc/pam.d/*
/lib/security/* 模塊文件
ftp本身信息傳輸是明文的,包括認證機制都是明文的。抓包分析後就能得到用戶名和密碼
數據傳輸模式(自動):兩種傳輸都支持(遵循傳輸文件本身的模式)
二進制傳輸:
文本傳輸:
ftp的用戶:
匿名用戶anonymous(最終會映射爲系統用戶):ftp
虛擬用戶(最終會映射爲系統用戶):
系統用戶
(1)安裝vsftpd:yum install vsftpd 大小140k
安裝生成的文件:rpm –ql vsftpd
開啓服務
/etc/init.d/vsftpd start
(3)基本配置
文件服務權限:文件系統權限*文件共享權限
默認:匿名用戶可以登錄、可以下載;本地用戶可以登錄、上傳
【幾個常見報錯】
550:表示服務本身禁止使用某項功能
530:登錄系統時輸錯密碼,登錄失敗
553:本地文件的權限
【匿名用戶】
匿名用戶登錄:anonymous_enable=YES | NO ##默認情況下
匿名用戶上傳:
1.配置文件
write_enable=YES
anon_upload_enable=YES
2.上傳目錄權限:
Chgrp ftp /var/ftp/pub
Chmod 770 /var/ftp/pub或
Mkdir /var/ftp/upload
Chgrp ftp /var/ftp/upload
Chmod 770 /var/ftp/upload
3.selinux相關設置
setsebool -P allow_ftpd_anon_write on
setenforce 0
匿名用戶上傳文件權限修改:anon_umask=022 ##將文件權限改爲644
匿名用戶家目錄修改(注意家目錄除root用戶外,其他用戶不能有寫權限)
anon_root=/dir
匿名用戶建立目錄:anon_mkdir_write_enable=YES
匿名用戶刪除、重命名:anon_other_wtite_enable=YES
匿名用戶下載:anon_world_readable _only =NO(對於權限爲600的文件默認無法下載,必須使用此參數)
匿名用戶上傳身份的修改:不能爲root,不能爲系統不存在的用戶
Chown_uploads=YES
Chown_username=student
匿名用戶上傳限速(單位爲字節):anon_max_rate=102400
【本地用戶】注意此處selinux關閉或者設置相應規則
本地用戶登錄:新建用戶tom,並給tom一個密碼:本地用戶即能在/etc/passwd中找到的用戶。
# echo 'cyl&647308' |passwd --stdin tom
local_enable=YES
pam_service_name=vsftpd,這是本地用戶默認的認證模塊
本地用戶可寫:write_enable=YES
本地用戶上傳文件權限:local_umask=077
本地用戶家目錄更改:local_root=/dir
將所有本地用戶鎖在家目錄中:chroot_local_user=YES(注意本地用戶目錄權限小於755)
3.本地用戶登錄進去默認在自己的家目錄裏,eg:/home/tom
可以進入其他目錄查看文件等,可以獲取到自己想要的資源。
4.將某個用戶鎖定在自己的家目錄中:
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list(在此文件中寫入用戶名)
eg:vim /etc/vsftpd/chroot_list
tom
5.所有寫在/etc/vsftpd/ftpusers中的用戶被拒絕訪問ftp服務器(cat /etc/pam.d/vsftpd)
例如:jerry在此文件中,且在/etc/vsftpd/loginusers文件中,進行了用戶驗證
(2)啓用/etc/vsftpd/userlist文件:
userlist_enable=YES
白名單userlist_deny=NO
# Cat /etc/vsftpd/user_list
Jerry
(2)黑名單 userlist_deny=YES
6.守護進程:
獨立守護進程:xinetd是一個獨立守護進程。適用於訪問量特別大,用戶在線時間比較長的。
瞬時守護進程:由超級守護進程xinetd代爲管理。訪問量比較小,用戶連接時間不大長。
vsftpd配置爲瞬時守護進程時,在/etc/xinetd.d/下添加一個瞬時守護進程腳本或者配置文件(格式後文再說)
【虛擬用戶】
(1)創建虛擬賬號:
#vim /etc/vsftpd/loginusers //loginusers名稱任意取,注意一行用戶名一行密碼
ftpuser1
123
ftpuser2
123
#db_load -T -t hash -f /etc/vsftpd/loginusers /etc/vsftpd/loginusers.db
-T //指定執行動作爲transfer
-t //轉化方式哈希加密
-f //指定文件名
#vim /etc/pam.d/ckvsftpd
account required pam_userdb.so db=/etc/vsftpd/loginusers
auth requied pam_userdb.so db=/etc/vsftpd/loginusers
//用戶帳號 認證必須
目錄/etc/pam.d下的文件均爲認證文件,認證就是一個將外來信息與系統文件中記錄的信息匹配的一個過程,匹配通過則通過認證,認證是一個程序,需要相關的模塊來完成,這些模塊記錄在系統庫文件中
(2)創建本地用戶到虛擬用戶的映射:(默認ftp用戶爲虛擬用戶的本地用戶映射),可以登錄到其他目錄。
Useradd ftpuser
#vim /etc/vsftpd/vsftpd.conf
guest_username=ftpuser
guest_enable=YES
(3)虛擬賬號家目錄獨立設定:
mkdir /ftpusershome
chgrp ftpuser /ftpusershome
chmod g+s /ftpusershome
mkdir /ftpuserhome/ftpuser{1,2}
#vim /etc/vsftpd/vsftpd.conf
local_root=/ftpuserhome/$USER //指定本地用戶家目錄
user_sub_token =$USER //指定$USER是個shell中的變量,使其生效
(4)虛擬帳號配置獨立
打開賬戶獨立功能:user_config_dir=/etc/vsftpd/userconf
mkdir /etc/vsftpd/userconf
vim /etc/vsftpd/userconf/ftpuser1
在此文件中配置文件中的所有參數,此文件的優先級高
在每一個目錄下創建隱藏文件.massage:dirmassage_enable=YES,當客戶端切換到此目錄下,會先顯示.massage文件中的內容。
定義vsftpd的資源訪問:
Max_client=
Max_per_ip=
默認以文本模式上傳文件:ascii_upload_enable=YES(一般不要設置!)
默認以文本模式下載文件:ascii_download_enable=YES(一般不要設置!)
將vsftpd定義爲獨立守護進程:listen=YES
安全通信方式:
(1)ftps:ftp+ssl/tls
(2)sftp:OpenSSH,SubSystem,sftp
虛擬用戶映射到匿名用戶ftp。
基於mysql中的數據庫和表中的字段驗證用戶賬號。
虛擬用戶:
本地數據文件方式
1.添加虛擬用戶口令文件
[root@CentOS5 /]#vi /etc/vsftpd/vftpuser.txt
添加虛擬用戶名和密碼,一行用戶名,一行密碼,以此類推。奇數行爲用戶名,偶數行爲密碼。
ftpuser1
123
ftpuser2
123
將剛添加的vftpuser.txt虛擬用戶口令文件轉換成系統識別的口令認證文件。
首先查看系統有沒有安裝生成口令認證文件所需的軟件db4-utils。
[root@CentOS5 /]#rpm –qa |grep db4-utils
[root@CentOS5 /]#rpm –ivh db4-utils-4.3.29-9.fc6.i386.rpm
下面使用db_load命令生成虛擬用戶口令認證文件。
[root@CentOS5 /]#db_load –T –t hash –f /etc/vsftpd/vftpuser.txt /etc/vsftpd/vftpuser.db
3.編輯vsftpd的PAM認證文件
在/etc/pam.d目錄下,
[root@CentOS5 /]#vi /etc/pam.d/vsftpd
將裏面其他的都註釋掉,添加下面這兩行:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser
//64爲64,32位的是/lib/…..
4.建立本地映射用戶並設置宿主目錄權限
所有的FTP虛擬用戶需要使用一個系統用戶,這個系統用戶不需要密碼。
[root@CentOS5 /]#useradd –d /home/vftpsite –s /sbin/nologin vftpuser
[root@CentOS5 /]#chmod 700 /home/vftpsite
5.配置vsftpd.conf(設置虛擬用戶配置項)
[root@CentOS5 /]#vi /etc/vsftpd/vsftpd.conf
guest_enable=YES #開啓虛擬用戶
guest_username=vftpuser #FTP虛擬用戶對應的系統用戶
pam_service_name=vsftpd #PAM認證文件
6.重啓vsftpd服務
[root@CentOS5 /]#service vsftpd restart
7.測試虛擬用戶登錄FTP
C:\User\Administrator>ftp 192.168.120.240
連接到192.168.120.240。
220 Welcome to BOB FTP server
用戶(192.168.120.240(none)):ftpuser1
331 Please specify the password.
密碼:
230 Login successful.
實驗:
linux主機部署ftp服務,建立兩個ftp用戶t01,t02 屬於ftp組,不允許登陸linux系統,只能登陸ftp;要求能實現匿名用戶下載,限制同時最多連接3個用戶,FTP日誌文件放在 /var/log/FTP/ftp.log
安裝vsftpd並開啓服務,火牆selinux關閉
useradd -g ftp -d /var/ftp/pub/ -s /sbin/nologin t01
useradd -g ftp -d /var/ftp/pub/ -s /sbin/nologin t02
# cat /etc/passwd
t01:x:500:50::/var/ftp/pub/:/sbin/nologin
t02:x:501:50::/var/ftp/pub/:/sbin/nologin
max_clients=3 #允許的最大連接數3
vsftpd_log_file=/var/log/FTP/ftp.log #指定日誌文件位置
[root@linux-ceshi-12 pub]# ftp localhost
Trying ::1...
ftp: connect to address ::1Connection refused
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
500 OOPS: failed to open xferlog log file:/var/log/FTP/ftp.log
ftp> quit
解決
# vim /etc/vsftpd/vsftpd.conf
vsftpd_log_file=/var/log/FTP/ftp.log
[root@linux-ceshi-12 pub]# /etc/init.d/vsftpd restart
Shutting down vsftpd: [ OK ]
Starting vsftpd for vsftpd: [ OK ]
[root@linux-ceshi-12 pub]# ftp localhost
Trying ::1...
ftp: connect to address ::1Connection refused
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
220 (vsFTPd 2.2.2)
Name (localhost:root): t01
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 (127,0,0,1,31,70).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Aug 18 12:01 cyl
-rw-r--r-- 1 0 0 10240 Aug 19 02:43 shell.tar.gz
226 Directory send OK.
ftp> quit
221 Goodbye.