測(cè)試主機(jī):亞馬遜AWS EC2
系統(tǒng):Ubuntu 14.04
想用AWS來(lái)做服務(wù)器玩,結(jié)果發(fā)現(xiàn)其不能像簡(jiǎn)單使用阿里云服務(wù)器那樣用ftp連接流济,反正也不熟悉ftp服務(wù)器搭建,那就乘這個(gè)機(jī)會(huì)學(xué)習(xí)一下如何利用vsftpd配置FTP服務(wù)器,網(wǎng)上大多的教程是基于CentOS的莉钙,但給了我關(guān)于Ubuntu下配置的很多參考嵌莉。
0.vsftpd是啥玩意
都不知道安裝了個(gè)啥東西进萄,那就沒(méi)意思了,所以先去了解下什么是vsftpd锐峭。vsftpd意思為“very secure FTP daemon(非常安全的FTP進(jìn)程)”中鼠,當(dāng)然只有更安全沒(méi)有最安全。
那它到底安全在哪里呢沿癞,主要體現(xiàn)在以下兩點(diǎn):
- 權(quán)限控制援雇,vsftpd以一般用戶登錄,用戶權(quán)限相對(duì)較小椎扬,對(duì)于系統(tǒng)就越安全惫搏,對(duì)于用戶需要的系統(tǒng)級(jí)指令大部分被整合到vsftpd中了,用戶不需要申請(qǐng)更高權(quán)限就足以完成絕大部分ftp指令蚕涤;此外對(duì)于ftp本身內(nèi)部的讀寫控制筐赔,vsftpd也足以通過(guò)配置文件控制了;
- 目錄限制揖铜,vsftpd通過(guò)chroot可以控制ftp登錄用戶所能看到的目錄范圍茴丰,即限定ftp用戶看到的根目錄為系統(tǒng)中某一個(gè)目錄,如此一個(gè)ftp用戶就除了看到自己的ftp根目錄不能看到其他比如配置文件、系統(tǒng)更目錄等贿肩,保護(hù)了系統(tǒng)峦椰。
1.安裝vsftpd
sudo apt-get install vsftpd
至于要不要通過(guò)sudo apt-get update
就看你的源本身夠不夠新了
2.配置vsftpd
ubuntu的vsftpd配置文件在\etc\vsftpd.conf
配置文件的詳細(xì)配置項(xiàng)如下(那么多我們其實(shí)按需配置很少的幾項(xiàng)就好):
listen=<YES/NO> :設(shè)置為YES時(shí)vsftpd以獨(dú)立運(yùn)行方式啟動(dòng),設(shè)置為NO時(shí)以xinetd方式啟動(dòng)(xinetd是管理守護(hù)進(jìn)程的汰规,將服務(wù)集中管理汤功,可以減少大量服務(wù)的資源消耗)
listen_port=<port> :設(shè)置控制連接的監(jiān)聽(tīng)端口號(hào),默認(rèn)為21
listen_address=<ip address> :將在綁定到指定IP地址運(yùn)行控轿,適合多網(wǎng)卡
connect_from_port_20=<YES/NO> :若為YES冤竹,則強(qiáng)迫FTP-DATA的數(shù)據(jù)傳送使用port 20,默認(rèn)YES
pasv_enable=<YES/NO> :是否使用被動(dòng)模式的數(shù)據(jù)連接茬射,如果客戶機(jī)在防火墻后鹦蠕,請(qǐng)開(kāi)啟為YES
pasv_min_port=<n>
pasv_max_port=<m> :設(shè)置被動(dòng)模式后的數(shù)據(jù)連接端口范圍在n和m之間,建議為50000-60000端口
message_file=<filename> :設(shè)置使用者進(jìn)入某個(gè)目錄時(shí)顯示的文件內(nèi)容,默認(rèn)為 .message
dirmessage_enable=<YES/NO> :設(shè)置使用者進(jìn)入某個(gè)目錄時(shí)是否顯示由message_file指定的文件內(nèi)容
ftpd_banner=<message> :設(shè)置用戶連接服務(wù)器后的顯示信息在抛,就是歡迎信息
banner_file=<filename> :設(shè)置用戶連接服務(wù)器后的顯示信息存放在指定的filename文件中
connect_timeout=<n> :如果客戶機(jī)連接服務(wù)器超過(guò)N秒钟病,則強(qiáng)制斷線,默認(rèn)60
accept_timeout=<n> :當(dāng)使用者以被動(dòng)模式進(jìn)行數(shù)據(jù)傳輸時(shí)刚梭,服務(wù)器發(fā)出passive port指令等待客戶機(jī)超過(guò)N秒肠阱,則強(qiáng)制斷線,默認(rèn)60
accept_connection_timeout=<n> :設(shè)置空閑的數(shù)據(jù)連接在N秒后中斷朴读,默認(rèn)120
data_connection_timeout=<n> : 設(shè)置空閑的用戶會(huì)話在N秒后中斷屹徘,默認(rèn)300
max_clients=<n> : 在獨(dú)立啟動(dòng)時(shí)限制服務(wù)器的連接數(shù),0表示無(wú)限制
max_per_ip=<n> :在獨(dú)立啟動(dòng)時(shí)限制客戶機(jī)每IP的連接數(shù)衅金,0表示無(wú)限制(不知道是否跟多線程下載有沒(méi)干系)
local_enable=<YES/NO> :設(shè)置是否支持本地用戶帳號(hào)訪問(wèn)
guest_enable=<YES/NO> :設(shè)置是否支持虛擬用戶帳號(hào)訪問(wèn)
write_enable=<YES/NO> :是否開(kāi)放本地用戶的寫權(quán)限
local_umask=<nnn> :設(shè)置本地用戶上傳的文件的生成掩碼噪伊,默認(rèn)為077
local_max_rate<n> :設(shè)置本地用戶最大的傳輸速率,單位為bytes/sec氮唯,值為0表示不限制
local_root=<file> :設(shè)置本地用戶登陸后的目錄鉴吹,默認(rèn)為本地用戶的主目錄
chroot_local_user=<YES/NO> :當(dāng)為YES時(shí),所有本地用戶可以執(zhí)行chroot
chroot_list_enable=<YES/NO>
chroot_list_file=<filename> :當(dāng)chroot_local_user=NO 且 chroot_list_enable=YES時(shí)惩琉,只有filename文件指定的用戶可以執(zhí)行chroot
anonymous_enable=<YES/NO> :設(shè)置是否支持匿名用戶訪問(wèn)
anon_max_rate=<n> :設(shè)置匿名用戶的最大傳輸速率豆励,單位為B/s,值為0表示不限制
anon_world_readable_only=<YES/NO> 是否開(kāi)放匿名用戶的瀏覽權(quán)限
anon_upload_enable=<YES/NO> 設(shè)置是否允許匿名用戶上傳
anon_mkdir_write_enable=<YES/NO> :設(shè)置是否允許匿名用戶創(chuàng)建目錄
anon_other_write_enable=<YES/NO> :設(shè)置是否允許匿名用戶其他的寫權(quán)限(注意瞒渠,這個(gè)在安全上比較重要良蒸,一般不建議開(kāi),不過(guò)關(guān)閉會(huì)不支持續(xù)傳)
anon_umask=<nnn> :設(shè)置匿名用戶上傳的文件的生成掩碼伍玖,默認(rèn)為077
我們來(lái)定一個(gè)目標(biāo)吧诚啃,目標(biāo)是禁止匿名訪問(wèn),限制用戶ftp目錄私沮,允許用戶上傳,使用FTP被動(dòng)模式。
打開(kāi)配置文件sudo vim /etc/vsftpd.conf
仔燕,如下修改
#禁止匿名訪問(wèn)
anonymous_enable=NO
#接受本地用戶
local_enable=YES
#允許上傳
write_enable=YES
#用戶只能訪問(wèn)限制的目錄
chroot_local_user=YES
#設(shè)置固定目錄造垛,在結(jié)尾添加。如果不添加這一行晰搀,各用戶對(duì)應(yīng)自己的目錄(用戶家目錄)五辽,當(dāng)然這個(gè)文件夾自己建
local_root=/home/ftp
#如果使用主動(dòng)模式,下面幾行可以不配置
#使用被動(dòng)模式
pasv_enable=YES
#端口設(shè)置
pasv_min_port=1024
pasv_max_port=1048
pasv_address=你的訪問(wèn)IP(服務(wù)器外網(wǎng)IP)
這里補(bǔ)充一個(gè)知識(shí)點(diǎn)關(guān)于主動(dòng)模式和被動(dòng)模式外恕,F(xiàn)TP是基于TCP的服務(wù)杆逗,使用2個(gè)端口,一個(gè)數(shù)據(jù)端口和一個(gè)命令端口(也可叫做控制端口)鳞疲。通常來(lái)說(shuō)這兩個(gè)端口是21(命令端口)和20(數(shù)據(jù)端口)罪郊。但FTP工作方式的不同,數(shù)據(jù)端口并不總是20尚洽。這就是主動(dòng)與被動(dòng)FTP的最大不同之處悔橄。
-
主動(dòng)模式:數(shù)據(jù)連接上,服務(wù)端從20端口去連接客戶端大于1024的端口
命令連接:客戶端 (>1024端口) -> 服務(wù)器 21端口
數(shù)據(jù)連接:客戶端 (>1024端口) <- 服務(wù)器 20端口優(yōu)勢(shì):主動(dòng)FTP對(duì)FTP服務(wù)器的管理有利腺毫,但對(duì)客戶端的管理不利癣疟。因?yàn)镕TP服務(wù)器企圖與客戶端的高位隨機(jī)端口建立連接,而這個(gè)端口很有可能被客戶端的防火墻阻塞掉潮酒。
-
被動(dòng)模式:數(shù)據(jù)連接上睛挚,客戶端從大于1024端口去連接服務(wù)端大于1024的端口
命令連接:客戶端 (>1024端口) -> 服務(wù)器 21端
數(shù)據(jù)連接:客戶端 (>1024端口) -> 服務(wù)器 (>1024端口)優(yōu)勢(shì):被動(dòng)FTP對(duì)FTP客戶端的管理有利,但對(duì)服務(wù)器端的管理不利急黎。因?yàn)榭蛻舳艘c服務(wù)器端建立兩個(gè)連接扎狱,其中一個(gè)連到一個(gè)高位隨機(jī)端口,而這個(gè)端口很有可能被服務(wù)器端的防火墻阻塞掉叁熔。
3.為ftp服務(wù)器新建ftp用戶并新建ftp根目錄
新建用戶委乌,專門用于登錄ftp服務(wù)器進(jìn)行操作,并且新建配置文件中指定的ftp根目錄荣回,這里就有很多BUG了遭贸。
建立ftp根目錄
mkdir /home/ftp
建立新用戶和密碼
sudo useradd -d /home/ftp -M ftptest
sudo passwd ftptest
滿懷信心地測(cè)試一下,利用命令行連接一下心软,結(jié)果出現(xiàn)==530 login incorrect==錯(cuò)誤壕吹,解決方式如下:
sudo vim /etc/pam.d/vsftpd
注釋掉
#auth required pam_shells.so
然后sudo service vsftpd restart
重啟服務(wù)生效.
原因:
這是因?yàn)閱⒂昧诉@個(gè)模塊,只有帶有shell的用戶才能訪問(wèn)删铃,什么是帶有shell呢耳贬?你可以看一下\etc\shells
文件,這里列出的就是可用的shell列表猎唁,然后你再執(zhí)行一下cat \etc\passwd
咒劲,最后一行你可以看到你新添加的用戶,比對(duì)一下你可以看到新用戶沒(méi)有指定shell,因此不帶有shell腐魂,就被這個(gè)生效的模塊發(fā)好人卡了帐偎。
于是再次ftp連接一下,wtf蛔屹,結(jié)果出現(xiàn)==500 OOPS: vsftpd: refusing to run with writable root inside chroot()==削樊,解決方式:
sudo chmod a-w /home/ftp
sudo mkdir /home/ftp/data
原因:這是因?yàn)関sftpd的chroot不允許根目錄具有可寫權(quán)限,ftp根目錄下的目錄可以有寫權(quán)限兔毒,所以就只能這么解決漫贞。
連接成功進(jìn)入可以看到data目錄,并且你只能看到/home/ftp
下的內(nèi)容育叁,你發(fā)現(xiàn)你所在的根目錄就是它迅脐,不可能跳到其他目錄去,很安全
4.利用vsftpd的chroot
但其實(shí)我們想讓一些用戶(如管理員級(jí)別的)可以訪問(wèn)所有目錄擂红,限制另外的只能訪問(wèn)ftp根目錄(如其他一般用戶)仪际,那么我們就需要vsftpd的chroot功能。
執(zhí)行sudo vim /etc/vsftpd.conf
可以看到以下3行被注釋:
#chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd.chroot_list
解了這3行的注釋昵骤,我們看到有指定一個(gè)用戶列表“vsftpd.chroot_list”树碱,但是這個(gè)文件初始是不存在的,我們需要自己建立变秦。
如果是兩個(gè)YES(就上面那樣)成榜,那么是指,限制所有用戶蹦玫,開(kāi)放(列表中)特定赎婚,限制一切用戶,只解禁
/etc/vsftpd.chroot_list
的用戶樱溉,也即是只有這個(gè)列表中的用戶可以訪問(wèn)所有文件挣输,不在列表的只能訪問(wèn)指定目錄。如果是一個(gè)NO和一個(gè)YES福贞,那就是開(kāi)放所有撩嚼,限制特定,可指定一組用戶限制挖帘,即列表中的用戶受限完丽。
sudo vim /etc/vsftpd.chroot_list
一行一個(gè)用戶名,進(jìn)行添加拇舀,然后保存退出逻族,比如添加了我們剛才的ftptest用戶,并且設(shè)置兩個(gè)YES骄崩。
這時(shí)候你再去連接ftp時(shí)聘鳞,你會(huì)發(fā)現(xiàn)你居然能訪問(wèn)所有目錄了薄辅,為了驗(yàn)證有效性,你可以斷開(kāi)連接搁痛,再去設(shè)置chroot_local_user
為NO時(shí)长搀,你會(huì)發(fā)現(xiàn),你又只能訪問(wèn)ftp目錄了鸡典。
這就是chroot的作用。
附. 通過(guò)FTP連接AWS EC2
因?yàn)槲矣玫臏y(cè)試服務(wù)器是AWS EC2枪芒,所有這里也提一下當(dāng)服務(wù)器端通過(guò)終端配置好vsftpd后如何連接AWS彻况。
打開(kāi)AWS的EC2控制臺(tái):
添加自定義規(guī)則,1024-1048端口這里的配置要和vsftpd.conf
文件的被動(dòng)模式配置端口一致舅踪,然后還要打開(kāi)20-21端口纽甘,否則就沒(méi)法進(jìn)行ftp連接了。
配置好后就可以進(jìn)行ftp連接了抽碌,如果是SFTP悍赢,則需要添加ssh密鑰。
vsftpd詳細(xì)說(shuō)明參見(jiàn)這里