<-
Apache > HTTP Server > 文档 > 版本 2.4 > FTP 协议支持

使用 TLS 保护 FTP

可用语言:  en 

对 FTP over TLS 的支持允许您通过 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 访问。SSL 握手必须在进行第一次 FTP 协议交换之前完成。这种方法被称为隐式 SSL,受 mod_ftp 支持。最后,一些 FTP 客户端和服务器支持通过 SSH 进行文件传输。这种方法不受 mod_ftp 支持。

top

FTP over TLS 支持

为了实现 TLS,mod_ftp 使用 Apache 的 mod_ssl。这意味着 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,列出所有客户端超出了本文档的范围。可以在 维基百科 上找到列表。在选择客户端时,请记住,mod_ftp 不支持FTP over SSH 协议(有时也称为SFTP)。

可用语言:  en 

top

评论

注意
这不是问答部分。此处放置的评论应针对改进文档或服务器的建议,如果我们的版主认为它们已实施或被认为无效/主题不相关,则可能会再次删除。有关如何管理 Apache HTTP Server 的问题应发送到我们的 IRC 频道 #httpd(在 Freenode 上),或发送到我们的 邮件列表