FTP服務器工作原理及配置詳解
FTP工作原理概述
FTP:file transfer protocol
它也是一個C/S架構的服務。server:監聽在套接字21/tcp端口。按照套接字監聽工作狀態可以分爲兩類:
命令連接:發送文件管理類命令,始終處於連接狀態,始終監聽在21/tcp端口。
數據連接:主要是實現數據傳輸,這種連接是按需連接的,而且在傳輸結束會立刻中斷。
對於數據連接還有兩種不同的工作模式:
主動工作的模式:服務器根據監聽在21端口接收到的命令,使用自己的20號端口,將數據傳輸給客戶端請求的端口加1那個端口。(例如:client使用6432端口請求,了一個ls命令。這時服務器監聽在21端口接收到了這個命令並給予相應的處理之後,通過自己的20端口把數據相應的發給客戶端的6433端口)。如圖:
但是這樣問題就來了:如果客戶端在自己的主機上施加了防火牆,那麼服務器端的信息就無法送達了,其實我們還有另外一種工作模式。
被動工作的模式:這種工作模式是由服務器根據每個用戶的請求對應開啓一個大於1023的隨機端口,這個端口與用戶請求存在着關聯關係(這個關聯關係是服務器自身用於判斷被客戶端連接時是否放行的)。當這個端口開啓之後,FTP服務器會通知client到這個開啓的隨機端口請求數據,爲了防止前來請求的用戶不是冒名頂替的壞蛋。服務器在此時會根據存在關聯關係做出判斷是否放行。(這種判斷方式就是連接追蹤)。由此,既保證了數據的有效傳輸,又保證了服務器的安全。
注意:服務器發送端口編號給客戶端不是直接一個端口編號給客戶端的。而是通過數字計算的兩個數字比如(234,12)。這兩個數字分別是端口號除以256所得的商數和餘數。(234,12)實際就是端口59916
服務器常見程序:wu-ftpd | proftpd | vsftpd 等。
客戶端常見程序:普通瀏覽器、filezilla 等
ftp服務單位響應碼,和httpd的響應碼是一樣的三位數字:
1XX:信息類
2xx:成功類
3XX:提示需要,進一步補全需求
4XX:客戶端錯誤。
5xx:服務器端錯誤。
VSFTP的主配置文件及幾種登陸方式
我這裏使用vsftp來搭建FTP服務,首先rpm -q vsftpd 查看是否安裝了這個用具。另外需要安裝的工具有ftp,和lftp.
#yum install vsftpd -y #yum install ftp -y #yum install lftp -y #rpm -ql vsftpd //查看生成了那些配置配置文件
/var/ftp/pub //這裏是ftp文件的共享存放位置。
/etc/rc.d/init.d/vsftpd //服務腳本
/etc/vsftpd/vsftpd.conf //這是主配置文件
其中在登陸FTP的用戶中可以分三類,在主配置文件中可以做出相應的配置。
#vim /etc/vsftpd/vsftpd.conf //這個配置文件主要包括下面一些配置。
1.匿名用戶配置:
匿名用戶:這類用戶是以映射爲ftp用戶的方式登陸的。
anonymous_enable=YES|NO --->此項開啓匿名用戶登陸權限。在這個權限開啓之後,對於匿名用戶還有三類附加的常用權限,有些權限可能沒有定義在文件中需要自己添加。
anon_upload_enable=NO|YES //允許匿名用戶上傳文件 anon_mkdir_write_enable=NO|YES //允許匿名用戶創建目錄 anon_other_write_enable=NO|YES //允許用戶刪除
注意:匿名用戶的登陸是通過映射爲FTP用戶的方式。如果匿名用戶想擁有以上某種執行權限,僅僅在配置文件中定義是不夠的,還需要FTP在文件系統中有執行權限,及屬主屬組爲ftp。
2.普通用戶配置:這是OS系統上的用戶,登陸時需要用戶名和密碼。
本地用戶登陸格式:例如:lftp -u USERNAME,PASSWORD 172,16.249.11
注意:-u 指定用戶逗號,後面緊跟密碼,中間不允許空格。
local_enable=YES|NO //此項開啓表示允許本地用戶登陸使用 local_umask=022 //本地用戶創建文件的權限使用的UMASK write_enable=YES|NO //允許本地上傳操作
注意:匿名用戶是默認只允許在ftp這個映射用戶的家目錄中執行操作,但是本地用戶只要有權限默認是可以在文件系統中游蕩的。那麼這樣就是很危險的,因此我們要對本地用戶的活動範圍進行限定。
禁錮用戶於家目錄的實現
chroot_local_user=YES //啓動禁止用戶於家目錄功能 chroot_list_enable=YES //啓用一個列表用於存放被禁止的用戶 chroot_list_file=/etc/vsftpd/chroot_list //想要禁止的用戶寫在這個指向的文件中
3.虛擬用戶配置:這類用戶不需要把自己額賬號和密碼放在,放在/etc/passwd 和/etc/shadow
虛擬用戶不是文件系統中的用戶,而是通過文件,或者關係型數據庫存儲的與OS無關的用戶。這些所有的用戶在登陸時是通過映射爲我們系統上一個普通用戶的方式登陸。儘管這些所有用戶都是通過映射爲系統上某一個用戶的方式登陸系統,我們依然可以實現對不同虛擬用戶的訪問權限控制。那麼究竟是如何玩實現的呢?最後會給出基於關係型數據庫存儲,及不同虛擬用戶權限設置。這裏先介紹一下這個主配置文件。
虛擬用戶的配置是在文件中加入以下兩行:
guest_enable=YES //允許虛擬賓客訪問 guest_username=vuser //定義虛擬賓客映射的用戶名
4.日誌:
xferlog_enable=YES|NO //是否啓用傳輸日誌 xferlog_std_format=NO //是否使用標準格式。 xfer_file=/var/log/xferlog //定義傳輸日誌的存放位置
5.改變上傳後文件的屬主和數組:
chown_uploads=YES|NO //開啓修改屬主屬組的功能 chown_username=whoever //whoever要修改爲自己指定的人
6.用於pam的認證限制
pam_service_name=vsftpd //這個文件是定義的認證的文件位置 userlist_enable=YES|NO //這個配置參數表示啓用用戶列表。 userlist_deny=YES|NO //加上這句表示這是判斷白黑名單的列表了,如果是yes這就是黑名單了
這個用戶列表在 /etc/vsftpd/userlist
listen=yes表示vsftpd使用套接字監聽。
注意:這個文件原來是有很多用戶名的,使用時全部清空就可以了。如果我們使userlist_deny=no 這裏表示這個名單是白名單,這樣之後匿名用戶就不可以登陸。
7.連接限制
max_clients //最大併發連接數; max_per_ip //每個IP可同時發起的併發請求數; anon_max_rate: //匿名用戶的最大傳輸速率; local_max_rate: //本地用戶的最大傳輸速率。
基於關係型數據庫的虛擬用戶訪問控制
思路:我們這裏實現的是基於關係型數據的存儲虛擬用戶,並實現對不通的虛擬用戶進行不同的權限控制。1.首先我們需要建立一個數據庫,並且在數據庫中鍵入我們授權的虛擬用戶,爲了讓ftp可以查看庫中的用戶和密碼。給予訪問的用戶一個授權。2.要給ftp進程建立一個存儲虛擬用戶列表查找路徑的文件,並且在主配置文件中定義這個文件的位置。3.創建一個虛擬用戶的映射用戶,並且給予授權家目錄。4.對不同的虛擬用戶進行權限限制。
配置前準備:因爲我們基於關係型數據庫存儲,需要用到pam的認證,因此需要安裝pam_mysql的插件。
安裝mysql和pam_mysql
#yum -y install pam_mysql
注意:pam_mysql由epel源提供。
1.準備數據庫及相關表
就是把我們用於ftp登陸的用戶放在數據庫中存儲。
首先請確保mysql服務已經正常啓動。而後,按需要建立存儲虛擬用戶的數據庫即可,這裏將其創建爲vsftpd數據庫。
mysql> create database vsftpd; mysql> grant select on vsftpd.* to [email protected] identified by 'password'; //爲了防止本地主機不能登陸,授權一個遠程主機。 mysql> flush privileges; mysql> use vsftpd; mysql> id int AUTO_INCREMENT NOT NULL, -> name varchar(20) NOT NULL, -> password char(48) NOT NULL, -> primary key(id) -> ); mysql> insert into users(name,password) values('ftpuser1',password('password')); mysql> insert into users(name,password) values('ftpuser2',password('password'));
2.建立虛擬用戶列表查找路徑的文件
#vi /etc/pam.d/vsftpd.mysql
添加如下兩行
authrequired /lib64/security/pam_mysql.souser=vsftpd passwd=password host=172.16.249.149 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2 accountrequired /lib64/security/pam_mysql.so user=vsftpd passwd=password host=172.16.249.149 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
注意:由於各主機不同,/lib64/security/pam_mysql.so模塊可能存在差異,使用rpm -ql pam_mysql查看具體的模塊路徑。另外如果如果加密使用了password函數,crypy=2。
修改vsftpd的配置文件,/etc/vsftpd/vsftpd.conf 指向這個文件
pam_service_name=vsftpd.mysql
3.建立虛擬用戶映射的系統用戶及對應的目錄
# useradd -s sbin/nologin -d /var/ftproot vuser # chmod go+rx /var/ftproot vim /etc/vsftpd/vsftpd.conf guest_enable=YES 允許虛擬用戶訪問 guest_username=vuser 定義映射的用戶名是vuser
另外確認主配置文件已經啓用了下列選項,沒有的需要自己添加。
vim etc/vsftpd/vsftpd.conf anonymous_enable=YES local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO chroot_local_user=YES
4.配置虛擬用戶具有不同的訪問權限
方法:在主配置文件中定義一個存放用戶虛擬用戶權限的目錄,在這個目錄中爲每個虛擬用戶的寫一個定義權限的文件,名字爲虛擬用戶的用戶名。
a.配置vsftpd爲虛擬用戶使用配置文件目錄
# vim vsftpd.conf user_config_dir=/etc/vsftpd/vusers_config //定義目錄位置
b.創建所需要目錄,併爲虛擬用戶提供配置文件
#mkdir /etc/vsftpd/vusers_config/ #cd /etc/vsftpd/vusers_config/ #touch ftpuer1 ftpuser2
c.配置虛擬用戶的訪問權限
虛擬用戶對vsftpd服務的訪問權限是通過匿名用戶的相關指令進行的。
anon_upload_enable= {YES|NO} 允許上傳? anon_mkdir_write_enable={YES|NO} 允許創建目錄? anon_other_write_enable={YES|NO} 允許下載和刪除? # service vsftpd start # chkconfig vsftpd on # netstat -tnlp | grep :21
下面可以使用虛擬用戶登錄,驗正配置結果了!
lftp -u ftpuser1,password 172.16.249.149