无法理解rsyncd.conf中的`use chroot`参数

时间:2018-06-05 18:09:30

标签: rsync

对于rsync守护程序模式,

rsyncd.conf具有以下选项:

  

使用chroot

     

如果"使用chroot"是的,rsync守护进程将chroot到   "路径"在与客户端开始文件传输之前。这有   为可能的实施提供额外保护的优势   安全漏洞,但它有需要超级用户的缺点   权限,无法遵循任何一个符号链接   绝对的或在新的根路径之外,并使其复杂化   按名称保存用户和组(见下文)。

     

另外一个   安全功能,您可以在模块"路径"中指定dot-dir。至   指出chroot应该出现的点。这允许rsync   在一个chroot中运行非" /"转移顶部的路径   层次结构。这样做可以防止非预期的库加载(因为   除非,这些绝对路径不在传输层次结构内   您使用了一个不明智的路径名),并允许您为其设置库   转移之外的chroot。例如,指定   "在/ var / rsync的/./模块1"将chroot到" / var / rsync"目录和   将inside-chroot路径设置为" / module1"。如果你省略了   dot-dir,chroot会使用整个路径,而且   内部chroot路径将是" /"。

我无法理解

  

你可以在模块"路径"中指定一个dot-dir。指出chroot应该发生的点。这允许rsync在chroot中使用非" /"传输层次结构顶部的路径。这样做可以防止意外的库加载

一部分。

是否意味着rsync(在守护程序模式下)在调用chroot()系统调用后尝试加载库?我试着测试一下,例如rsyncd.conf:

uid = 0
gid = 0
use chroot = yes

[backup]
path  = /home/minecraft/
read only = yes

rsync守护进程的strace显示chroot:

[pid 20018] geteuid()                   = 0
[pid 20018] chroot("/home/minecraft")   = 0
[pid 20018] chdir("/")                  = 0
[pid 20018] setgid(0)                   = 0
[pid 20018] setgroups(1, [0])           = 0
[pid 20018] setuid(0)                   = 0
[pid 20018] setresuid(-1, 0, -1)        = 0
[pid 20018] geteuid()                   = 0

但是在chroot()调用之后没有尝试加载库。

1 个答案:

答案 0 :(得分:0)

  

非预期的库加载

TLDR;

Rsyncd chroot模式可防止意外加载共享系统/用户库,而不是您在rsync连接阶段期间要使用的共享系统/用户库。由于您的chroot(如果正确定义),Rsync无法访问并意外加载不允许首先访问的内容(即/层次结构)。

How rsync works a practical overview让我们对chroot模式中连接阶段的执行流程有了一些了解。

  

当收到已定义模块的连接时,守护程序会分叉新的子进程来处理连接。然后,该子进程读取rsyncd.conf文件以设置所请求模块的选项,该选项可能会chroot到模块路径,并可能删除该进程的setuid和setgid。之后,它的行为就像采用发送者或接收者角色的任何其他rsync服务器进程一样。

我假设library指的是二进制系统/用户库(.so,.a)。例如,存在旧的环境变量,例如。 LD_LIBRARY_PATH等等,在运行rsync时可能会造成麻烦。我们从overview知道rsync执行以下操作:

  

守护进程会分叉一个新的子进程来处理连接。

这意味着如果你操纵了一些环境变量或者在你的例子中定义了一些特定的变量。 $HOME/.bashrc等等,这可能会导致意外的副作用,例如unintended library loading

Here是一些有趣且富有洞察力的解释,例如LD_LIBRARY_PATH如何导致奇怪和无法预料的副作用。

  

使用chroot

此外,此参数的主要思想是针对可能的实现安全漏洞提供额外保护。在较小程度上还可以防止通过rsync中断。