測試主機:亞馬遜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之間,建議爲50000-60000端口
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規則。