rsync,第二部分

作者:Mick Bauer

上个月我们介绍了如何设置 rsync 服务器以进行匿名访问。列表 1 显示了上个月的示例 rsyncd.conf 文件,其中说明了一些特别有用的安全加固选项。回到我们的示例,这里简要介绍一下如何在文件系统级别设置 rsync 模块(目录)。执行此操作的指南与匿名 FTP chroot 环境的指南相同。唯一的例外是,与某些 FTP 服务器的情况一样,出于 chroot 目的,无需在其中复制任何系统二进制文件或配置文件。

列表 1. 示例 rsyncd.conf 文件

rsync 配置文件只需要稍微自定义路径和允许的主机,即可开始为匿名用户提供文件服务。但这只是一个非常狭隘的用途。如何接受匿名上传并为经过身份验证的用户添加模块呢?列表 2 概述了如何同时执行这两项操作。

列表 2. 额外的 rsyncd.conf 模块

首先,我们有一个名为 incoming 的模块,其路径为 /home/incoming。公开可写目录的指南(请参阅使用 Linux 构建安全服务器中的“保护匿名 FTP 的技巧”)适用,但有一个重要的区别:对于匿名 rsync,此目录必须是全局可执行的以及全局可写的,即模式 0733。如果未按此方式设置,则文件上传将失败,而不会向客户端返回任何错误或记录在服务器上。

一些适用于配置 FTP 的技巧是密切监视此目录是否被滥用,并且永远不要使其或其内容全局可读。此外,尽快将上传的文件移出此目录并移至文件系统中非全局可访问的部分,也许可以使用 cron 作业。

[incoming] 块中唯一的新选项是传输日志记录。这会导致 rsync 在尝试实际文件传输时记录更详细的日志。默认情况下,此选项的值为 no。此外,熟悉的选项 read-only 已设置为 no,覆盖了其全局设置 yes。没有类似的选项可以告诉 rsync 此目录是可写的;这由目录的实际权限决定。

示例的第二部分定义了一个名为 Audiofreakz 的受限访问模块。这里有三个新选项需要讨论。第一个选项 list 确定当远程用户请求服务器的可用模块列表时,是否应列出此模块。其默认值为 yes。

另外两个新选项 auth users 和 secrets file 定义了应如何对潜在客户端进行身份验证。rsync 的身份验证机制仅在以守护进程模式运行时可用,它基于相当强大的 128 位 MD5 质询-响应方案。这优于标准 FTP 身份验证,原因有二。首先,密码不会通过网络传输,因此不会受到窃听攻击。但是,理论上可以对服务器进行暴力破解哈希生成攻击。

其次,rsync 不使用系统的用户凭据;它有自己的用户名-密码组合文件。此文件仅供 rsync 使用,并且与 /etc/passwd 或 /etc/shadow 没有关联或关系。因此,即使 rsync 登录会话以某种方式被泄露,除非您在选择使用 rsync 提供的目录或设置这些目录的权限时做了一些糟糕的选择,否则没有用户的系统帐户会直接受到威胁或泄露。

但是,与 FTP 一样,数据传输本身是未加密的。充其量,rsync 身份验证验证了用户的身份,但它不能确保数据完整性或隐私免受窃听者的侵害。要实现这些目标,您必须通过 SSH 或 Stunnel 运行它。

secrets file 选项指定包含 rsync 用户名-密码组合的文件的路径和名称。按照惯例,通常使用 /etc/rsyncd.secrets,但该文件实际上可以具有任何名称或位置——例如,它不必以后缀 .secrets 结尾。此选项也没有默认值;如果您希望使用 auth users,则还必须定义 secrets file。此示例显示了示例密钥文件的内容

watt:shyneePAT3
bell:d1ngplunkB00M!
示例 /etc/rsyncd.secrets 文件的内容

列表 2 中的 auth users 选项定义了密钥文件中列出的哪些用户可以访问该模块。尝试连接到此模块的所有客户端,假设他们通过了任何适用的 hosts allow 和 hosts deny ACL,都会被提示输入用户名和密码。请记住仔细设置适用文件和目录的权限,因为这些权限最终决定了授权用户连接后可以执行的操作。如果未设置 auth users,则不需要用户进行身份验证,并且该模块可通过匿名 rsync 访问。这是 rsync 在守护进程模式下的默认行为。

这就是设置匿名和经过身份验证的 rsync 服务所需了解的大部分内容。有关命令行和配置文件选项的完整列表,请参阅 rsync(8) 和 rsyncd.conf(5) 手册页,包括我在此处未介绍的几个可用于自定义日志消息的选项。

使用 rsync 连接到 rsync 服务器

恐怕我会忘记,我还没有解释如何作为客户端连接到 rsync 服务器。这是一个简单的语法问题;在指定远程主机时,使用双冒号而不是单冒号,并使用相对于所需模块的路径,而不是绝对路径。

例如,要回顾上个月示例中的场景,其中客户端系统称为 near,远程系统称为 far,假设您希望检索文件 newstuff.tgz,并且 far 正在守护进程模式下运行 rsync。进一步假设您不记得 far 上存储新文件的模块名称。首先,您可以查询 far 以获取其可用模块的列表,如下所示

[root@near darthelm ]# rsync far::
public          Nobody home but us tarballs
incoming        You can put, but you can't take

(并非巧合的是,这些是我们在本月示例中设置的相同模块;正如我在上一节中预测的那样,模块 Audiofreakz 被省略了。)您需要的目录名为 public。假设您是对的,则将 newstuff.tgz 复制到当前工作目录的命令如下所示

[yodeldiva@near ~]# rsync far::public/newstuff.tgz .
双冒号和路径格式都与 SSH 模式不同。SSH 期望冒号后跟绝对路径,而 rsync 守护进程期望模块名称,该模块名称充当文件路径的“根”。为了说明这一点,让我们看一下使用 SSH 模式的相同命令
[yodeldiva@near ~]# rsync -e ssh \
far:/home/public_rsync/newstuff.tgz .
当然,这两者并不完全等效;虽然 far 上的 rsync 守护进程进程配置为为此目录中的匿名用户(即,无需身份验证)提供文件服务,但 SSH 始终需要身份验证(尽管可以使用空密码短语 RSA 或 DSA 密钥自动执行身份验证,这在使用 Linux 构建安全服务器的第 4 章中进行了描述)。但这确实显示了路径处理方式之间的差异。
使用 Stunnel 隧道化 rsync

我要提到的最后一个 rsync 用法是将以守护进程模式运行的 rsync 与 Stunnel 结合使用。Stunnel 是一个通用的 TLS 或 SSL 包装器,可用于将任何简单的 TCP 事务封装在加密的且可选的 X.509 证书身份验证会话中。尽管当您在 SSH 模式下运行 rsync 时,它会获得加密,但它会失去其守护进程功能,最显着的是匿名 rsync。使用 Stunnel 可以为您提供与 SSH 一样好的加密,同时仍然支持匿名事务。

关于递归呢?

使用 Linux 构建安全服务器的第 5 章深入介绍了 Stunnel,其中在大多数示例中都使用了 rsync。只需说明此方法在服务器端涉及以下步骤

  1. 像往常一样配置 rsyncd.conf。

  2. 使用 --port 选项调用 rsync,指定 873 以外的某个端口(例如,rsync --daemon --port=8730)。

  3. 在 TCP 端口 873 上设置 Stunnel 侦听器,以将 TCP 873 上的所有传入连接转发到上一步中指定的本地 TCP 端口。

  4. 如果您不希望任何人“以明文方式”连接,请配置 hosts.allow 以阻止到步骤 2 中指定的端口的非本地连接。此外,或者作为替代,您可以配置 iptables 来执行相同的操作。

在客户端,过程如下

  1. 以 root 用户身份,在 TCP 端口 873 上设置 Stunnel 侦听器(假设您的本地系统上没有已经使用它的 rsync 服务器),该侦听器将 TCP 端口 873 上的所有传入连接转发到远程服务器上的 TCP 端口 873。

  2. 当您希望连接到远程服务器时,请将 localhost 指定为远程服务器的名称。本地 Stunnel 进程现在打开与服务器的连接,并将您的 rsync 数据包转发到远程 Stunnel 进程。远程 Stunnel 进程解密您的 rsync 数据包,并将它们传递给远程 rsync 守护进程。回复数据包自然会通过相同的加密连接发回。

如您所见,在这种情况下,rsync 本身的配置与匿名 rsync 没有太大区别——大部分工作都在于设置 Stunnel 转发器。

资源

Mick Bauer (mick@visi.com) 是 Upstream Solutions, Inc. 的网络安全顾问,该公司位于明尼苏达州明尼阿波利斯市。他是 O'Reilly 出版的《使用 Linux 构建安全服务器》一书的作者,“网络工程波尔卡舞曲”的作曲家和一位自豪的家长(育有子女)。

加载 Disqus 评论