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。有关配置 OpenSSH 和 SSH
协议的详情请参考 第 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 启动为实例化服务。
vsftpd
@.service
要使用此服务单元,必须为 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
协议来验证连接并加密所有传输。请注意,支持 TLS
的 FTP
客户端需要与启用 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
文件。TheTUNING
文件包含基本的性能调优提示,SECURITY/
目录包含vsftpd
使用的安全模型的信息。 vsftpd
- 相关的 man page - 守护进程和配置文件有多个 man page。下表列出了一些更重要的 man page。- 服务器应用程序
{blank}
-
vsftpd(8)- 描述
vsftpd
的可用命令行选项。
-
vsftpd(8)- 描述
- 配置文件
{blank}
-
vsftpd.conf(5)- 包含适用于
vsftpd
的配置文件中可用选项的详细列表。 -
hosts_access(5)- 描述
TCP
打包程序配置文件中可用的格式和选项:host.allow
和hosts.deny
。
-
vsftpd.conf(5)- 包含适用于
- 与 SELinux 的交互
{blank}
-
ftpd_selinux(8)- 包含管理
ftpd
进程的 SELinux 策略的说明,以及 SELinux 标签的分配方式和布尔值设置的说明。
-
ftpd_selinux(8)- 包含管理
16.2.3.2. 在线文档
- 关于 vsftpd 和 FTP
{blank}
-
http://vsftpd.beasts.org/ -
vsftpd
项目页面非常适合查找最新的文档并联系软件作者。 -
http://slacksite.com/other/ftp.html - 这个网站简要解释了主动模式和被动模式
FTP
之间的区别。
-
http://vsftpd.beasts.org/ -
- Red Hat Enterprise Linux 文档
{blank}
-
红帽企业 Linux 7 联网指南 - 红帽企业 Linux 7 的网络指南记录了有关在此系统中配置和管理网络接口、网络和网络服务的相关信息。它介绍了
hostnamectl
实用程序,并说明了如何使用它在本地和远程命令行上查看和设置主机名。 -
Red Hat Enterprise Linux 7 SELinux 用户和管理员指南 - Red Hat Enterprise Linux 7 的 SELinux 用户和管理员指南 介绍了 SELinux 的基本原理,并详细介绍了如何配置和使用 SELinux 与 Apache HTTP 服务器、Post fix、PostgreSQL 或 OpenShift 等服务。它解释了如何为
systemd
管理的系统服务配置 SELinux 访问权限。 - 红帽企业 Linux 7 安全指南 - 红帽企业 Linux 7 安全指南 帮助用户和管理员学习保护工作站和服务器免受本地和远程入侵、攻击和恶意活动的流程和实践。它还说明了如何保护关键系统服务。
-
红帽企业 Linux 7 联网指南 - 红帽企业 Linux 7 的网络指南记录了有关在此系统中配置和管理网络接口、网络和网络服务的相关信息。它介绍了
- 相关的 RFC 文档
{blank}