如何借助vsftpd在Linux上構(gòu)建安全的FTP服務(wù)?
譯文FTP(文件傳輸協(xié)議)是互聯(lián)網(wǎng)上廣泛使用的服務(wù)之一,主要用于將文件從一個(gè)主機(jī)傳輸?shù)搅硪粋€(gè)主機(jī)。FTP本身當(dāng)初不是作為一種安全協(xié)議而設(shè)計(jì)的;正因?yàn)槿绱耍湫偷腇TP服務(wù)很容易遭受諸如中間人攻擊和蠻力攻擊之類的常見(jiàn)攻擊。
許多具有安全功能的應(yīng)用程序可用來(lái)構(gòu)建安全的FTP服務(wù)。比如說(shuō),F(xiàn)TPS(安全Secure)使用SSL/TLS證書(shū),對(duì)端到端數(shù)據(jù)進(jìn)行加密。基于客戶端的需求,F(xiàn)TPS可加以配置,以支持經(jīng)過(guò)加密及/或未經(jīng)過(guò)加密的連接。SFTP(SSH文件傳輸協(xié)議)是另一種為傳輸中數(shù)據(jù)確保安全的方法。SFTP是作為SSH的一種擴(kuò)展技術(shù)而開(kāi)發(fā)的,同樣可以結(jié)合其他安全協(xié)議使用。
本教程將著重介紹借助SSL/TLS已被啟用的vsftpd,構(gòu)建和保護(hù)FTP服務(wù)。
先稍微介紹一下背景:典型的FTP服務(wù)器偵聽(tīng)TCP端口20以監(jiān)視數(shù)據(jù)、偵聽(tīng)TCP端口以監(jiān)視命令(又叫控制端口)。連接的建立和命令參數(shù)的交互都通過(guò)端口21來(lái)完成。FTP連接支持兩種方法:主動(dòng)模式和被動(dòng)模式。在主動(dòng)模式下的連接建立過(guò)程中,服務(wù)器建立一條從其端口20(數(shù)據(jù))到客戶機(jī)的連接。在被動(dòng)模式下,服務(wù)器為每一個(gè)客戶機(jī)會(huì)話專門指定了隨機(jī)性數(shù)據(jù)端口,并將該端口通知客戶機(jī)。隨后,客戶機(jī)建立一條通向服務(wù)器隨機(jī)性端口的連接。
據(jù)RFC 1635顯示,F(xiàn)TP支持通過(guò)特殊用戶anonymous進(jìn)行的公眾訪問(wèn),不需要任何密碼,或者通過(guò)用戶ftp、使用密碼ftp來(lái)進(jìn)行訪問(wèn)。除了這類公眾用戶外,vsftpd還支持本地Linux用戶進(jìn)行的登錄。Linux用戶可以通過(guò)使用FTP連接到服務(wù)器,并提供登錄信息,訪問(wèn)其主目錄,即/home/user。
把vsftpd安裝到Linux上
如果想把vsftpd安裝到Ubuntu、Debian或Linux Mint上,可以使用apt-get命令。系統(tǒng)一啟動(dòng),vsftpd服務(wù)就會(huì)自動(dòng)啟動(dòng)。
$ sudo apt-get install vsftpd
如果想把vsftpd安裝到CentOS、Fedora或RHEL上,我們可以使用yum來(lái)輕松完成安裝。服務(wù)啟動(dòng)后,還被添加到系統(tǒng)啟動(dòng)項(xiàng)。
# yum install vsftpd # service vsftpd start # chkconfig vsftpd on
使用vsftpd的一種最基本的FTP服務(wù)現(xiàn)已準(zhǔn)備好使用。我們只要將瀏覽器指向URL ftp://[ServerName/IP],或者使用FileZilla等FTP客戶軟件、使用用戶名anonymous,無(wú)需密碼來(lái)連接,或使用用戶名ftp、密碼ftp來(lái)連接,就可以訪問(wèn)FTP服務(wù)。
vsftpd安裝完畢后,系統(tǒng)用戶ftp連同主目錄/var/ftp已被添加到系統(tǒng)中。只要建立了匿名FTP連接,會(huì)話總是默認(rèn)使用/var/ftp目錄。所以,我們可以將該目錄用作FTP公眾用戶的主目錄。放在/var/ftp下面的任何文件/目錄都可以通過(guò)ftp://[ServerName/IP]加以訪問(wèn)。
vsftpd配置文件的位置出現(xiàn)在下面兩個(gè)地方:
•Ubuntu、Debian或Linux Mint:/etc/vsftpd.conf •CentOS、Fedora或RHEL:/etc/vsftpd/vsftpd.conf
在本教程的其余部分,使用你Linux系統(tǒng)上的對(duì)應(yīng)位置的vsftpd.conf文件。
調(diào)整FTP用戶
如果想禁用公眾訪問(wèn),我們就要在vsftpd.conf中明確禁止用戶anonymous。注釋掉這一行不管用,因?yàn)関sftpd使用默認(rèn)值運(yùn)行。你還需要重啟vsftpd。
anonymous_enable=NO # service vsfptd restart
因而就要啟用強(qiáng)制性驗(yàn)證;只有現(xiàn)有的Linux用戶才能夠使用其登錄信息來(lái)進(jìn)行連接。
若想啟用/禁用本地用戶,我們可以修改vsftpd.conf文件。如果我們禁用本地用戶,就得確保用戶anonymous已被授予訪問(wèn)權(quán)限。
local_enable=YES/NO # service vsfptd restart
如果想使用特定用戶連接到系統(tǒng),我們只要將URL改成ftp://username@[ServerName/IP]。相應(yīng)用戶的主目錄可使用這種方法,通過(guò)FTP來(lái)加以訪問(wèn)。
將用戶限制在各自的主目錄
用戶使用FTP訪問(wèn)遠(yuǎn)程服務(wù)器時(shí),用戶可以瀏覽整個(gè)系統(tǒng),只要文件/目錄是可讀取的。根本不建議這么做,因?yàn)槿魏斡脩舳寄芡ㄟ^(guò)FTP會(huì)話,讀取和下載/etc、/var、/usr 及其他位置下面的系統(tǒng)文件。
想限制本地用戶在FTP會(huì)話期間只能訪問(wèn)各自的主目錄,我們可以修改下面這個(gè)參數(shù)。
chroot_local_user=YES # service vsftpd restart
現(xiàn)在,本地用戶只能夠訪問(wèn)其主目錄了,無(wú)法訪問(wèn)系統(tǒng)中的其他任何文件或目錄。
啟用SSL/TLS加密
FTP原本是一種明文協(xié)議,這意味著誰(shuí)都可以輕松窺視在客戶機(jī)與遠(yuǎn)程FTP服務(wù)器之間所傳輸?shù)奈募O雽?duì)FTP通信內(nèi)容進(jìn)行加密,可以啟用vsftpd中的SSL/TLS。
第一步是創(chuàng)建SSL/TLS證書(shū)和私鑰,如下所示。它會(huì)將所創(chuàng)建的證書(shū)/私鑰存放在目標(biāo).pem文件中。
在Debian/Ubuntu上:
$ sudo openssl req -x509 -days 365 -newkey rsa:2048 –node s -keyout /etc/vsftpd.pem -out /etc/vsftpd.pem
在CentOS/Fedora/RHEL上:
$ sudo openssl req -x509 -days 365 -newkey rsa:2048 –node s -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem
然后,將下面這些參數(shù)添加到vsftpd.conf配置文件中。
# 啟用TLS/SSL ssl_enable=YES # 強(qiáng)迫客戶機(jī)在登錄時(shí)使用TLS allow_anon_ssl=NO force_local_data_ssl=YES force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO require_ssl_reuse=NO ssl_ciphers=HIGH # 指定SSL證書(shū)/私鑰(Debian/Ubuntu) # 如果是CentOS/Fedora/RHEL,將其換成/etc/vsftpd/vsftpd.pem rsa_cert_file=/etc/vsftpd.pem rsa_private_key_file=/etc/vsftpd.pem # 為被動(dòng)模式下的連接定義端口范圍 pasv_max_port=65535 pasv_min_port=64000
最后重啟vsftpd。
# service vsftpd restart
控制連接和帶寬
vsftpd提供了幾種方法來(lái)控制連接和用戶帶寬。我們將使用幾種方法來(lái)調(diào)整我們的FTP服務(wù)器。
## 為每個(gè)匿名會(huì)話分配的帶寬設(shè)置為大約30 KB/s ## anon_max_rate=30000 ## 每個(gè)本地用戶被授予大約30 KB/s的帶寬## local_max_rate=30000 ## 客戶機(jī)會(huì)話閑置300秒后被終止## idle_session_timeout=300 ## 每個(gè)源IP地址的最大連接數(shù)量,這有助于防范拒絕服務(wù)(DoS)和分布式拒絕服務(wù)攻擊(DDoS)# max_per_ip=50
調(diào)整防火墻
最后,如果你在系統(tǒng)(比如CentOS)上運(yùn)行iptables防火墻,就要確保調(diào)整防火墻規(guī)則,允許FTP流量通過(guò)。下面這些規(guī)則應(yīng)當(dāng)有助于你開(kāi)始上手。
# iptables -I INPUT -p tcp --dport 20 -j ACCEPT # iptables -I INPUT -p tcp --dport 21 -j ACCEPT # iptables -I INPUT -p tcp --dport 64000:65535 -j ACCEPT
頭兩條規(guī)則允許流量通過(guò)FTP數(shù)據(jù)/控制端口。最后一條規(guī)則允許被動(dòng)模式下的連接,其端口范圍已經(jīng)在vsftpd.conf中予以定義。
啟用日志功能
萬(wàn)一你在本教程的FTP服務(wù)構(gòu)建過(guò)程中遇到任何問(wèn)題,可以啟用日志功能,為此只需修改vsftpd.conf中的下面這個(gè)參數(shù):
xferlog_enable=YES xferlog_std_format=NO xferlog_file=/var/log/vsftpd.log log_ftp_protocol=YES debug_ssl=YES # service vsftpd restart
借助FileZilla連接到FTP服務(wù)器
現(xiàn)在有幾款FTP客戶軟件支持SSL/TLS,尤其是FileZilla。想通過(guò)FileZilla連接到支持SSL/TLS的網(wǎng)站,就要為FTP主機(jī)使用下列設(shè)置。
你頭一次連接到支持SSL/TLS的FTP服務(wù)器后,會(huì)看到該網(wǎng)站的證書(shū)。只管信任證書(shū)、登錄上去。
為sftpd排查故障
1. 如果你在連接到FTP服務(wù)器的過(guò)程中遇到了下面這個(gè)錯(cuò)誤,這可能是由于你的防火墻阻止FTP流量。為此,確保你在防火墻上打開(kāi)了必要的FTP端口,如上所述。
ftp: connect: No route to host
2. 如果你連接到在CentOS/RHEL上運(yùn)行的使用chroot改變根目錄的FTP服務(wù)器時(shí)遇到了下面這個(gè)錯(cuò)誤,禁用SELinux是一個(gè)辦法。
500 OOPS: cannot change directory:/home/dev
Login failed.
雖然關(guān)閉SELinux是一個(gè)快速的解決辦法,但在生產(chǎn)環(huán)境下這么做可能不安全。所以,改而打開(kāi)SELinux中的下列布爾表達(dá)式可以解決這個(gè)問(wèn)題。
$ sudo setsebool -P ftp_home_dir on
3. 如果你通過(guò)FileZilla訪問(wèn)支持SSL/TLS的FTP服務(wù)器時(shí)遇到了下列錯(cuò)誤,就要確保在vsftpd.conf中添加“ssl_ciphers=HIGH”。FileZilla并不支持默認(rèn)密碼(DES-CBC3-SHA)。
Trace: GnuTLS alert 40: Handshake failed Error: GnuTLS error -12: A TLS fatal alert has been received. "SSL_accept failed: error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher"
總而言之,使用vsftpd構(gòu)建FTP服務(wù)器并非難事。針對(duì)用戶anonymous的默認(rèn)安裝應(yīng)該能夠支持小型的常見(jiàn)FTP服務(wù)。Vsftpd還有許多可以調(diào)整的參數(shù)(詳見(jiàn)http://linux.die.net/man/5/vsftpd.conf),讓它顯得用途廣泛。
但愿本文有所幫助。
原文地址:http://xmodulo.com/2014/06/secure-ftp-service-vsftpd-linux.html