Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

16.2. FTP

文件传输协议(FTP )是当今 Internet 上最旧且最常用的协议之一。其用途是在网络上的计算机主机之间可靠地传输文件,而无需用户直接登录远程主机或了解如何使用远程系统。它允许用户使用一组标准简单的命令来访问远程系统上的文件。

本节概述了 FTP 协议的基础知识并介绍了 vsftpd,这是 Red Hat Enterprise Linux 中的首选 FTP 服务器。

16.2.1. 文件传输协议

FTP 使用客户端-服务器架构来通过 TCP 网络协议传输文件。由于 FTP 是相当陈旧的协议,因此它使用未加密的用户名和密码身份验证。因此,它被视为不安全的协议,除非绝对必要,否则不应使用。但是,由于 FTP 在互联网上很普遍,因此通常需要将其共享给公众。因此,系统管理员应了解 FTP 的唯一特征。

这部分论述了如何将 vsftpd 配置为建立受 TLS 保护的连接,以及如何使用 SELinux 保护 FTP 服务器的安全。完美替代 FTP 来自 OpenSSH 工具套件的 sftp。有关配置 OpenSSHSSH 协议的详情请参考 第 12 章 OpenSSH

与 Internet 上使用的大多数协议不同,FTP 需要多个网络端口才能正常工作。当 FTP 客户端应用发起与 FTP 服务器的连接时,它会在服务器上打开端口 21 - 称为 命令端口。此端口用于向服务器发出所有命令。从服务器请求的任何数据将通过数据端口返回到客户端数据连接的端口号和数据连接初始化方式也有所不同,具体取决于客户端是以主动模式还是被动 模式请求数据

以下定义了这些模式:

活动模式
Active 模式是 FTP 协议用于将数据传输到客户端应用的原始方法。当 FTP 客户端发起主动模式数据传输时,服务器打开从服务器上端口 20 到 IP 地址的连接,以及客户端指定的随机非特权端口(大于 1024)。这种安排意味着必须允许客户端计算机接受任何 1024 以上端口的连接。随着不安全的网络(如互联网)的增长,现在普遍使用防火墙来保护客户端机器。由于这些客户端防火墙通常拒绝来自主动模式 FTP 服务器的传入连接,因此建立被动模式。
被动模式

被动模式(如主动模式)由 FTP 客户端应用发起。从服务器请求数据时,FTP 客户端表示它希望以被动模式访问数据,服务器在服务器上提供 IP 地址和随机的非特权端口(高于 1024)。然后,客户端连接到服务器上的该端口,以下载请求的信息。

被动模式确实解决了客户端防火墙对数据连接干扰的问题,但可能会使服务器端防火墙的管理变得复杂。您可以通过限制 FTP 服务器上的非特权端口范围来减少服务器上的开放端口数量。这也简化了为服务器配置防火墙规则的过程。

16.2.2. vsftpd 服务器

高安全性 FTP 后台程序( vsftpd)设计为快速、稳定且最重要的是安全。vsftpd 是唯一随红帽企业 Linux 分发的独立 FTP 服务器,因为它能够高效而安全地处理大量连接。

vsftpd 使用的安全模式有三个主要方面:

  • 强隔离特权和无特权进程 - 独立进程处理不同的任务,其中每个进程使用任务所需的最小特权运行。
  • 需要升级特权的任务由必要的最少权限的进程处理 - 利用 libcap 库中找到的兼容 功能,通常需要完全 root 特权的任务可以从更低的特权进程中安全地执行。
  • 大多数进程在 chroot 存放位置中运行 - 只要可能,进程都会更改为正在共享的目录;然后,该目录被视为 chroot 存放位置。例如,如果 /var/ftp/ 目录是主共享目录,则 vsftpd/var/ftp/ 重新分配到新的根目录,称为 /。这不允许新根目录中未包含的任何目录的任何潜在的恶意黑客活动。

这些安全实践对 vsftpd 如何处理请求有以下影响:

  • 父进程以所需权限最少运行 - 父进程动态计算所需的特权级别,以最大程度降低风险。子进程处理与 FTP 客户端的直接交互,并以尽可能接近或无特权运行。
  • 所有需要升级特权的操作都由一个小的父进程来处理 - 与 Apache HTTP 服务器 一样,vsftpd 会 启动 非特权子进程来处理传入连接。这允许特权父进程尽可能小并处理相对较少的任务。
  • 来自非特权子进程的所有请求都不受父进程信任 - 父进程通过套接字接收与子进程的通信,并在操作之前检查来自子进程的所有信息的有效性。
  • FTP 客户端的大多数交互都由 chroot 存放中的非特权子进程来处理 - 由于这些子进程具有非特权且只能访问正在共享的目录,因此任何崩溃的进程都只允许攻击者访问共享文件。

16.2.2.1. 启动和停止 vsftpd

要在当前会话中启动 vsftpd 服务,以 root 用户身份在 shell 提示符后输入以下内容:

~]# systemctl start vsftpd.service

要在当前会话中停止该服务,以 root 用户身份输入

~]# systemctl stop vsftpd.service

要重启 vsftpd 服务,以 root 用户身份运行以下命令:

~]# systemctl restart vsftpd.service

此命令将停止并立即启动 vsftpd 服务,这是编辑此 FTP 服务器的配置文件后使配置更改生效的最有效方式。另外,您可以使用以下命令仅在 vsftpd 服务已在运行时重启它:

~]# systemctl try-restart vsftpd.service

默认情况下,vsftpd 服务在引导时 自动启动。要将 vsftpd 服务配置为在引导时启动,以 root 用户身份在 shell 提示符后输入以下内容:

~]# systemctl enable vsftpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.

有关如何在 Red Hat Enterprise Linux 7 中管理系统服务的详情请参考 第 10 章 使用 systemd 管理服务

16.2.2.2. 启动多个 vsftpd 副本

有时,一台计算机用于为多个 FTP 域提供服务。这是一款叫做多选的技术。使用 vsftpd 进行多主页的一种方法是运行 守护进程的多个副本,每个副本都有自己的 配置文件。

要做到这一点,首先将所有相关 IP 地址 分配给系统上的网络设备或别名网络设备。有关配置网络设备、设备别名和有关网络配置脚本的其他信息的详情,请参考 Red Hat Enterprise Linux 7 网络指南

接下来,必须将 FTP 域的 DNS 服务器配置为引用正确的计算机。有关 BIND、Red Hat Enterprise Linux 中使用的 DNS 协议实施及其配置文件的详情,请查看 Red Hat Enterprise Linux 7 网络指南

要让 vsftpd 应答不同 IP 地址 上的请求,必须正在运行 守护进程的多个副本。为了协助启动 vsftpd 守护进程的多个实例,vsftp 软件包中提供了一个特殊的 systemd 服务单元( vsftpd @.service),用于将 vsftpd 启动为实例化服务。

要使用此服务单元,必须为 FTP 服务器的每个必需实例创建单独的 vsftpd 配置文件,并将其放置在 /etc/vsftpd/ 目录中。请注意,每个配置文件都必须具有唯一名称(如 /etc/vsftpd/vsftpd-site-2.conf),并且必须仅可由 root 用户读取和写入。

在侦听 IPv4 网络的每个 FTP 服务器的每个配置文件中,以下指令必须是唯一的:

listen_address=N.N.N.N

使用所提供服务的 FTP 站点 的唯一 IP 地址 替换 N.N.N.N。如果站点使用 IPv6,则改为使用 listen_address6 指令。

/etc/vsftpd/ 目录中存在多个配置文件,即可以 root 用户身份执行以下命令来启动 vsftpd 守护进程的各个实例:

~]# systemctl start vsftpd@configuration-file-name.service

在以上命令中,将 configuration-file-name 替换为所请求服务器配置文件的唯一名称,如 vsftpd-site-2。请注意,命令中不应包含配置文件的 .conf 扩展名。

如果要一次启动多个 vsftpd 守护进程实例,您可以使用 systemd 目标单元文件(vsftpd.target),该文件在 vsftpd 软件包中提供。此 systemd 目标会使 /etc/vsftpd/ 目录中的每个可用的 vsftpd 配置文件启动独立的 vsftpd 守护进程。以 root 用户身份执行以下命令以启用目标:

~]# systemctl enable vsftpd.target
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.target to /usr/lib/systemd/system/vsftpd.target.

以上命令将 systemd 服务管理器配置为在启动时启动 vsftpd 服务(以及配置的 vsftpd 服务器实例)。要在不重启系统的情况下立即启动该服务,以 root 用户身份执行以下命令:

~]# systemctl start vsftpd.target

有关如何使用 systemd 目标管理服务的更多信息,请参阅 第 10.3 节 “使用 systemd 目标”

要考虑逐个服务器进行更改的其他指令有:

  • anon_root
  • local_root
  • vsftpd_log_file
  • xferlog_file

16.2.2.3. 使用 TLS 加密 vsftpd 连接

为了消除默认在不加密的情况下传输用户名、密码和数据的 FTP 本质上不安全的性质,可以将 vsftpd 守护进程配置为使用 TLS 协议来验证连接并加密所有传输。请注意,支持 TLSFTP 客户端需要与启用 TLS 的 vsftpd 通信。

注意

SSL (安全套接字层)是较旧安全协议实施的名称。新版本称为 TLS (Transport Layer Security)。只有较新版本(TLS)应使用,因为 SSL 遭受严重安全漏洞。vsftpd 服务器附带的文档以及 vsftpd .conf 文件中使用的配置指令,在引用与安全相关的事务时使用 SSL 名称,但在 ssl_enable 指令设置为 YES 时,默认支持并使用 TLS

vsftpd.conf 文件中的 ssl_enable 配置指令设置为 YES 以启用 TLS 支持。启用 ssl_enable 选项时自动激活的其他 TLS相关指令的默认设置提供了配置合理的、配置良好的 TLS 设置。此外,这包括要求仅将 TLS v1 协议用于所有连接(默认禁用使用不安全 SSL 协议版本)或强制所有非匿名登录以使用 TLS 发送密码和数据传输。

例 16.14. 配置 vsftpd 使用 TLS

在本例中,配置指令在 vsftpd.conf 文件中明确禁用了旧的安全协议的 SSL 版本:

ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

在修改了 vsftpd 服务的配置后重启它:

~]# systemctl restart vsftpd.service

有关由 vsftpd 调整 TLS的使用,请参阅 vsftpd.conf(5)手册页以了解其他与 TLS 相关的配置指令

16.2.2.4. vsftpd 的 SELinux 策略

SELinux 策略管理 vsftpd 后台程序(以及其他 ftpd 进程 ),定义了强制访问控制,默认情况下,它基于最少所需的访问权限。要允许 FTP 守护进程访问特定文件或目录,需要为其分配适当的标签。

例如,为了能够以匿名方式共享文件,必须将 public_content_t 标签分配给要共享的文件和目录。您可以使用 chcon 命令作为 root 用户 完成此操作:

~]# chcon -R -t public_content_t /path/to/directory

在以上命令中,将 /path/to/directory 替换为您要为其分配该标签的目录的路径。同样,如果要设置用于上传文件的目录,则需要为特定目录分配 public_content_rw_t 标签。此外,allow _ftpd_anon_write SELinux 布尔值选项必须设置为 1。以 root 用户身份使用 setsebool 命令进行此操作:

~]# setsebool -P allow_ftpd_anon_write=1

如果您希望本地用户能够通过 FTP 访问其主目录(这是 Red Hat Enterprise Linux 7 中的默认设置),则需要将 ftp_home_dir 布尔值选项设置为 1。如果允许 vsftpd 以单机模式运行(Red Hat Enterprise Linux 7 上默认启用),则还需要将 ftpd_is_daemon 选项设置为 1

有关如何配置与 FTP 相关的 SELinux 策略的更多信息,请参阅 ftpd_selinux(8)手册页,包括其他有用的标签和布尔值选项示例。另外,请参阅 Red Hat Enterprise Linux 7 SELinux 用户和管理员指南中有关 SELinux 的详情

16.2.3. 其它资源

有关 vsftpd 的更多信息,请参阅以下资源。

16.2.3.1. 安装的文档

  • /usr/share/doc/vsftpd-version-number/ 目录 - 使用已安装的 vsftpd 软件包版本替换 version -number。此目录包含一个含有软件基本信息的 README 文件。The TUNING 文件包含基本的性能调优提示,SEC URITY/ 目录包含 vsftpd 使用的安全模型的信息。
  • vsftpd- 相关的 man page - 守护进程和配置文件有多个 man page。下表列出了一些更重要的 man page。

    服务器应用程序
    {blank}
    • vsftpd(8)- 描述 vsftpd 的可用命令行选项。
    配置文件
    {blank}
    • vsftpd.conf(5)- 包含适用于 vsftpd 的配置文件中可用选项的详细列表。
    • hosts_access(5)- 描述 TCP 打包程序配置文件中可用的格式和选项:host .allowhosts.deny
    与 SELinux 的交互
    {blank}
    • ftpd_selinux(8)- 包含管理 ftpd 进程的 SELinux 策略的说明,以及 SELinux 标签的分配方式和布尔值设置的说明。

16.2.3.2. 在线文档

关于 vsftpd 和 FTP
{blank}
Red Hat Enterprise Linux 文档
{blank}
  • 红帽企业 Linux 7 联网指南 - 红帽企业 Linux 7 的网络指南记录了有关在此系统中配置和管理网络接口、网络和网络服务的相关信息。它介绍了 hostnamectl 实用程序,并说明了如何使用它在本地和远程命令行上查看和设置主机名。
  • Red Hat Enterprise Linux 7 SELinux 用户和管理员指南 - Red Hat Enterprise Linux 7 的 SELinux 用户和管理员指南 介绍了 SELinux 的基本原理,并详细介绍了如何配置和使用 SELinuxApache HTTP 服务器Post fix、PostgreSQL OpenShift 等服务。它解释了如何为 systemd 管理的系统服务配置 SELinux 访问权限。
  • 红帽企业 Linux 7 安全指南 - 红帽企业 Linux 7 安全指南 帮助用户和管理员学习保护工作站和服务器免受本地和远程入侵、攻击和恶意活动的流程和实践。它还说明了如何保护关键系统服务。
相关的 RFC 文档
{blank}
  • RFC 0959 - IETF FTP 协议的原始 注释请求( RFC)。
  • RFC 1123 - 小型 FTP相关部分可扩展并阐明 RFC 0959。
  • RFC 2228 - FTP 安全扩展.vsftpd 实施支持 TLSSSL 连接所需的小子集。
  • RFC 2389 - 建议 FEATOPTS 命令.
  • RFC 2428 - IPv6 支持.