Ubuntu 14.04 配置vsftpd實現FTP服務器 - 通過FTP連接AWS

測試主機:亞馬遜AWS EC2
系統:Ubuntu 14.04

想用AWS來做服務器玩,結果發現其不能像簡單使用阿里雲服務器那樣用ftp連接,反正也不熟悉ftp服務器搭建,那就乘這個機會學習一下如何利用vsftpd配置FTP服務器,網上大多的教程是基於CentOS的,但給了我關於Ubuntu下配置的很多參考。

0.vsftpd是啥玩意

都不知道安裝了個啥東西,那就沒意思了,所以先去了解下什麼是vsftpd。vsftpd意思爲“very secure FTP daemon(非常安全的FTP進程)”,當然只有更安全沒有最安全。

那它到底安全在哪裏呢,主要體現在以下兩點:

  • 權限控制,vsftpd以一般用戶登錄,用戶權限相對較小,對於系統就越安全,對於用戶需要的系統級指令大部分被整合到vsftpd中了,用戶不需要申請更高權限就足以完成絕大部分ftp指令;此外對於ftp本身內部的讀寫控制,vsftpd也足以通過配置文件控制了;
  • 目錄限制,vsftpd通過chroot可以控制ftp登錄用戶所能看到的目錄範圍,即限定ftp用戶看到的根目錄爲系統中某一個目錄,如此一個ftp用戶就除了看到自己的ftp根目錄不能看到其他比如配置文件、系統更目錄等,保護了系統。

1.安裝vsftpd

sudo apt-get install vsftpd

至於要不要通過sudo apt-get update就看你的源本身夠不夠新了

2.配置vsftpd

ubuntu的vsftpd配置文件在\etc\vsftpd.conf

配置文件的詳細配置項如下(那麼多我們其實按需配置很少的幾項就好):

listen=<YES/NO> :設置爲YES時vsftpd以獨立運行方式啓動,設置爲NO時以xinetd方式啓動(xinetd是管理守護進程的,將服務集中管理,可以減少大量服務的資源消耗)
listen_port=<port> :設置控制連接的監聽端口號,默認爲21
listen_address=<ip address> :將在綁定到指定IP地址運行,適合多網卡
connect_from_port_20=<YES/NO> :若爲YES,則強迫FTP-DATA的數據傳送使用port 20,默認YES
pasv_enable=<YES/NO> :是否使用被動模式的數據連接,如果客戶機在防火牆後,請開啓爲YES
pasv_min_port=<n>
pasv_max_port=<m> :設置被動模式後的數據連接端口範圍在n和m之間,建議爲5000060000端口
message_file=<filename> :設置使用者進入某個目錄時顯示的文件內容,默認爲 .message
dirmessage_enable=<YES/NO> :設置使用者進入某個目錄時是否顯示由message_file指定的文件內容
ftpd_banner=<message> :設置用戶連接服務器後的顯示信息,就是歡迎信息
banner_file=<filename> :設置用戶連接服務器後的顯示信息存放在指定的filename文件中
connect_timeout=<n> :如果客戶機連接服務器超過N秒,則強制斷線,默認60
accept_timeout=<n> :當使用者以被動模式進行數據傳輸時,服務器發出passive port指令等待客戶機超過N秒,則強制斷線,默認60
accept_connection_timeout=<n> :設置空閒的數據連接在N秒後中斷,默認120
data_connection_timeout=<n> : 設置空閒的用戶會話在N秒後中斷,默認300
max_clients=<n> : 在獨立啓動時限制服務器的連接數,0表示無限制
max_per_ip=<n> :在獨立啓動時限制客戶機每IP的連接數,0表示無限制(不知道是否跟多線程下載有沒幹系)
local_enable=<YES/NO> :設置是否支持本地用戶帳號訪問
guest_enable=<YES/NO> :設置是否支持虛擬用戶帳號訪問
write_enable=<YES/NO> :是否開放本地用戶的寫權限
local_umask=<nnn> :設置本地用戶上傳的文件的生成掩碼,默認爲077
local_max_rate<n> :設置本地用戶最大的傳輸速率,單位爲bytes/sec,值爲0表示不限制
local_root=<file> :設置本地用戶登陸後的目錄,默認爲本地用戶的主目錄
chroot_local_user=<YES/NO> :當爲YES時,所有本地用戶可以執行chroot
chroot_list_enable=<YES/NO> 
chroot_list_file=<filename> :當chroot_local_user=NO 且 chroot_list_enable=YES時,只有filename文件指定的用戶可以執行chroot
anonymous_enable=<YES/NO> :設置是否支持匿名用戶訪問
anon_max_rate=<n> :設置匿名用戶的最大傳輸速率,單位爲B/s,值爲0表示不限制
anon_world_readable_only=<YES/NO> 是否開放匿名用戶的瀏覽權限
anon_upload_enable=<YES/NO> 設置是否允許匿名用戶上傳
anon_mkdir_write_enable=<YES/NO> :設置是否允許匿名用戶創建目錄
anon_other_write_enable=<YES/NO> :設置是否允許匿名用戶其他的寫權限(注意,這個在安全上比較重要,一般不建議開,不過關閉會不支持續傳)
anon_umask=<nnn> :設置匿名用戶上傳的文件的生成掩碼,默認爲077

我們來定一個目標吧,目標是禁止匿名訪問,限制用戶ftp目錄,允許用戶上傳,使用FTP被動模式。

打開配置文件sudo vim /etc/vsftpd.conf,如下修改

#禁止匿名訪問
anonymous_enable=NO
#接受本地用戶
local_enable=YES
#允許上傳
write_enable=YES
#用戶只能訪問限制的目錄
chroot_local_user=YES
#設置固定目錄,在結尾添加。如果不添加這一行,各用戶對應自己的目錄(用戶家目錄),當然這個文件夾自己建
local_root=/home/ftp

#如果使用主動模式,下面幾行可以不配置
#使用被動模式
pasv_enable=YES
#端口設置
pasv_min_port=1024
pasv_max_port=1048
pasv_address=你的訪問IP(服務器外網IP)

這裏補充一個知識點關於主動模式被動模式,FTP是基於TCP的服務,使用2個端口,一個數據端口和一個命令端口(也可叫做控制端口)。通常來說這兩個端口是21(命令端口)和20(數據端口)。但FTP工作方式的不同,數據端口並不總是20。這就是主動與被動FTP的最大不同之處。

  • 主動模式:數據連接上,服務端從20端口去連接客戶端大於1024的端口
    命令連接:客戶端 (>1024端口) -> 服務器 21端口
    數據連接:客戶端 (>1024端口) <- 服務器 20端口

    優勢:主動FTP對FTP服務器的管理有利,但對客戶端的管理不利。因爲FTP服務器企圖與客戶端的高位隨機端口建立連接,而這個端口很有可能被客戶端的防火牆阻塞掉。

  • 被動模式:數據連接上,客戶端從大於1024端口去連接服務端大於1024的端口
    命令連接:客戶端 (>1024端口) -> 服務器 21端
    數據連接:客戶端 (>1024端口) -> 服務器 (>1024端口)

    優勢:被動FTP對FTP客戶端的管理有利,但對服務器端的管理不利。因爲客戶端要與服務器端建立兩個連接,其中一個連到一個高位隨機端口,而這個端口很有可能被服務器端的防火牆阻塞掉。

3.爲ftp服務器新建ftp用戶並新建ftp根目錄

新建用戶,專門用於登錄ftp服務器進行操作,並且新建配置文件中指定的ftp根目錄,這裏就有很多BUG了。

建立ftp根目錄

mkdir /home/ftp

建立新用戶和密碼

sudo useradd -d /home/ftp -M ftptest
sudo passwd ftptest

滿懷信心地測試一下,利用命令行連接一下,結果出現==530 login incorrect==錯誤,解決方式如下:

sudo vim /etc/pam.d/vsftpd

註釋掉

#auth    required pam_shells.so

然後sudo service vsftpd restart重啓服務生效.

原因:
這是因爲啓用了這個模塊,只有帶有shell的用戶才能訪問,什麼是帶有shell呢?你可以看一下\etc\shells文件,這裏列出的就是可用的shell列表,然後你再執行一下cat \etc\passwd,最後一行你可以看到你新添加的用戶,比對一下你可以看到新用戶沒有指定shell,因此不帶有shell,就被這個生效的模塊發好人卡了。

於是再次ftp連接一下,wtf,結果出現==500 OOPS: vsftpd: refusing to run with writable root inside chroot()==,解決方式:

sudo chmod a-w /home/ftp
sudo mkdir /home/ftp/data

原因:這是因爲vsftpd的chroot不允許根目錄具有可寫權限,ftp根目錄下的目錄可以有寫權限,所以就只能這麼解決。

連接成功進入可以看到data目錄,並且你只能看到/home/ftp下的內容,你發現你所在的根目錄就是它,不可能跳到其他目錄去,很安全

4.利用vsftpd的chroot

但其實我們想讓一些用戶(如管理員級別的)可以訪問所有目錄,限制另外的只能訪問ftp根目錄(如其他一般用戶),那麼我們就需要vsftpd的chroot功能。

執行sudo vim /etc/vsftpd.conf可以看到以下3行被註釋:

#chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd.chroot_list

解了這3行的註釋,我們看到有指定一個用戶列表“vsftpd.chroot_list”,但是這個文件初始是不存在的,我們需要自己建立。

  • 如果是兩個YES(就上面那樣),那麼是指,限制所有用戶,開放(列表中)特定,限制一切用戶,只解禁 /etc/vsftpd.chroot_list 的用戶,也即是隻有這個列表中的用戶可以訪問所有文件,不在列表的只能訪問指定目錄。

  • 如果是一個NO和一個YES,那就是開放所有,限制特定,可指定一組用戶限制,即列表中的用戶受限。

sudo vim /etc/vsftpd.chroot_list

一行一個用戶名,進行添加,然後保存退出,比如添加了我們剛纔的ftptest用戶,並且設置兩個YES。

這時候你再去連接ftp時,你會發現你居然能訪問所有目錄了,爲了驗證有效性,你可以斷開連接,再去設置chroot_local_user爲NO時,你會發現,你又只能訪問ftp目錄了。

附. 通過FTP連接AWS EC2

因爲我用的測試服務器是AWS EC2,所有這裏也提一下當服務器端通過終端配置好vsftpd後如何連接AWS。

打開AWS的EC2控制檯:

設定相應的安全組的tcp規則。
發佈了58 篇原創文章 · 獲贊 19 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章