<-
Apache > HTTP 伺服器 > 文件 > 版本 2.4 > FTP 協定支援

透過 TLS 保護 FTP

可用語言:  en 

透過 TLS 的 FTP 支援,您可以透過 TLS 加密和憑證驗證支援,安全地執行 FTP 連線。Apache mod_ftp 支援透過 Apache 本身的 mod_ssl,與 RFC 相容的 TLS 支援。

另請參閱

top

簡介

由於 FTP 協定是在加密安全功能變得重要的考慮因素之前就已開發好,因此最初是以明文協定為設計基礎。控制通道和資料通道過去都是、而且在許多情況下仍然是未加密的。這在今日已不受歡迎,因為使用者的登入帳號和密碼會以明文方式在網路中傳遞,而且惡意入侵者可以輕易偵測到。反過來說,由於伺服器無法以憑證進行自我識別,使用者無法輕易偵測到偽造的伺服器地址。

為了解決這些限制,FTP over TLS 協定因而開發出來,並成為 RFC 4217 中所描述的網路標準。FTP over TLS 協定使用 TLS 連線升級功能,也就是在升級到加密連線前,客戶端與伺服器會先針對各自的功能和能力進行議定。

top

協定說明

Apache HTTP Server 的 mod_ftp 模組目標,是要實作符合 RFC 4217 所定義的 FTP over TLS。RFC 中說明了 FTP 客戶端與伺服器要如何找出彼此的安全能力,以及客戶端要如何升級 FTP 控制通道以使用 TLS 保護。這項連線升級行為類似 RFC 3207 中所描述的 SMTP over TLS 標準,它讓 FTP over TLS 伺服器可以在與純文字 FTP 伺服器相同的連接埠上執行,並能同時提供純文字和保護服務。

FTP 通訊協定規範說明,由客戶端指定工作階段屬性,例如保護等級。伺服器無法要求客戶端使用 TLS,但伺服器可以在客戶端傳送 AUTH TLS FTP 指令升級控制頻道至 TLS 保護之前,拒絕接受任何命令。請參閱 FTPOptions,主要是 RequireSSL 選項,讓伺服器拒絕所有 FTP 指令,直到建立 TLS 工作階段為止。

使用 TLS 讓伺服器和客戶端都能使用標準 SSL 憑證來辨識彼此身分。通常,伺服器會使用憑證,但伺服器也可以設定為要求使用客戶端憑證來認證。RFC 4217 要求客戶端即使已提供憑證,還是必須傳送 USER 指令,但伺服器可能免除要求客戶端輸入密碼。

由於 FTP over TLS RFC 直到 2005 年才發布,因此,出現了幾種不同的做法來確保檔案傳輸連線安全。除了 RFC 所定義的正常 FTP 連線上的 TLS 連線升級之外,另一種常見的做法是定義一個獨立的 FTP 控制頻道監聽程式,只能透過 SSL 存取。必須在執行第一次 FTP 通訊協定交換之前,就完成 SSL 交握。這種做法稱為「隱含式 SSL」,mod_ftp 支援這種做法。最後,有些 FTP 客戶端和伺服器支援透過 SSH 傳輸檔案。mod_ftp 不支援這種做法。

top

FTP over TLS 支援

mod_ftp 使用 Apache 的 mod_ssl 來實作 TLS。這表示 FTP over TLS 的組態選項與 HTTPS 的組態選項差異不大。事實上,對於基於 RFC 4217 的 FTP over TLS 支援來說,不需設定任何除了您用於設定 HTTP over SSL 虛擬主機之外的額外組態選項。不過,請注意,我們將顯式關閉 AcceptFilter。FTP 伺服器會啟動通訊協定對話,而不是客戶端,因此,這是必要的步驟。

LoadModule ftp_module /usr/local/apache2/modules/mod_ftp.so

Listen 21 ftp
AcceptFilter ftp none

LogFormat "%u [%a] %r %>s" ftp_command
LogFormat "%{%b %e %H:%M:%S %Y}t %T %a %B %U %M %F %d %W %u %S %Z %Y" ftp_transfer

<VirtualHost _default_:21>

FTP On
SSLEngine on
SSLCertificateFile conf/server.crt
SSLCertificateKeyFile conf/server.key

ErrorLog logs/ftps_error_log
CustomLog logs/ftps_command_log ftp_command
CustomLog logs/ftps_transfer_log ftp_transfer env=do_transfer_log

</VirtualHost>

以上顯示了啟用 TLS 的 FTP 虛擬主機最簡單可能的組態。除非加入足夠的認證和存取控制,否則,請勿在生產環境中使用這個組態。
top

隱含式 SSL 支援

以下設定與上方類似,只是 FTPImplicitSSL 不同,而傾聽埠號是 990AcceptFilter 設定為 data,因為會話會從客戶端 SSL 握手開始。

LoadModule ftp_module /usr/local/apache2/modules/mod_ftp.so

Listen 990 ftps
AcceptFilter ftps data

LogFormat "%u [%a] %r %>s" ftp_command
LogFormat "%{%b %e %H:%M:%S %Y}t %T %a %B %U %M %F %d %W %u %S %Z %Y" ftp_transfer

<VirtualHost _default_:990>

FTP On
SSLEngine On
FTPImplicitSSL On

SSLCertificateFile ssl/server.crt
SSLCertificateKeyFile ssl/server.key

ErrorLog logs/ftps_error.log

CustomLog logs/ftps_command.log ftp_command
CustomLog logs/ftps_transfer.log ftp_transfer env=do_transfer_log

DocumentRoot "/usr/local/apache2/htdocs"

</VirtualHost>

以上顯示了啟用 TLS 的 FTP 虛擬主機最簡單可能的組態。除非加入足夠的認證和存取控制,否則,請勿在生產環境中使用這個組態。
top

客戶端對於 FTP over TLS 的支援

愈來愈多 FTP 客戶端已實現 FTP over TLS,要列出所有這些客戶端已超出本文的範圍。您可在 Wikipedia 上找到這份清單。在選擇客戶端時,請記住 mod_ftp 不支援FTP over SSH 通訊協定(有時也稱為 SFTP)。

可用語言:  en 

top

留言

注意事項
此處並非問答集。放在此處的意見應旨在提出改善文件或伺服器的建議,我們的管理員會在建議得到實作或被視為無效/離題後再次移除意見。有關如何管理 Apache HTTP Server 的問題應傳送至我們的 IRC 頻道,也就是 Freenode 上的 #httpd,或傳送至我們的 郵寄清單