ChrootDirectory 和用户主目录如何协同工作?

ChrootDirectory 和用户主目录如何协同工作?

我需要在 CentOS 7 上创建仅 SFTP 用户。我已经从各种来源阅读了如何执行此操作。该设置只需支持单个用户通过 SFTP 访问单个文件夹。

如果用户的主目录是/home/user并且在sshd_config我有ChrootDirectoryas %h,考虑到 sshd 会将目录更改为/home/userchroot 之后:

Chroot目录 指定身份验证后 chroot(2) 的目录路径名。路径名的所有组成部分必须是 root 拥有的目录,任何其他用户或组都不可写入。chroot 后,sshd(8) 将工作目录更改为用户的主目录。

这是如何运作的?它肯定会失败,因为 sshd 会尝试 CD 到/home/user/home/user?

补充问题:是否有最佳实践来决定是否在创建用户时定义的主目录中 chroot 这样的用户,还是将其 chroot 到/homeeg之外/var/sftp/user?在 之外创建 chroot 时/home,用户主目录的用途是什么?还用来读书吗~/.ssh/authorized_keys

答案1

您需要注意对用作目录的其他限制ChrootDirectory路径名的所有组成部分必须是 root 拥有的目录,任何其他用户或组都不可写入。如果用户需要能够写入 chroot 内自己的主目录,则主目录不得与ChrootDirectory.

历史注释:

OpenSSH 的 chroot 支持最初是一个单独的补丁,即使在它集成到主要 OpenSSH 发行版之后,对用作 ChrootDirectory 的目录的确切要求也随着不同的 OpenSSH 版本而发生了变化。为了应对以前设置中发现的安全漏洞,新版本通常会比旧版本执行更严格的要求。

此外,在 chroot 内部和外部都适用相同的主目录路径的要求显然不是最理想的,并且某些发行版已经应用了补丁来修改行为。不幸的是,过去并非所有此类补丁都包含对手册页和其他相关文档的更新。

但为了满足书面要求,您可以这样做,例如:

mkdir -p /jail/username/home

# First, the chroot directory:
chown root:root /jail/username
chmod 755 /jail/username

# Then, the user's home directory:
chown username: /jail/username/home
chmod 750 /jail/username/home
usermod -d /jail/username/home username

# And here's the magic:
cd /jail/username
ln -s . jail       # this would normally be a silly thing to do
ln -s . username   # but with chroot it can be useful

现在,我们可以设置ChrootDirectory /jail/%u.

当在 chroot 外部查看时,用户的主目录将为/jail/username/home.有点偏离正常的命名约定,但没有什么特别的。

在 chroot 内部,相同的主目录路径确实会引用 /jail/username/jail/username/home...但是您看到上面那两个愚蠢的符号链接了吗?取消引用它们,您将得到/jail/username/././home,它最终与 完全相同/jail/username/home。因此,相同的路径最终指向 chroot 内部和外部的相同位置。

chroot 内的用户将看到他们的主目录为/jail/username/home== /././home/home并且他们可以正常使用它。他们将能够看到其主目录之上的一层,/但只有 root 可以在那里写入。

这也将允许像 syslog 风格的日志记录这样的事情:您可以创建一个 root 拥有的目录/jail/username/dev并告诉在...rsyslog创建一个额外的风格套接字,现在 chrooted 用户可以生成日志消息并让常规 syslog 子系统处理它们。/dev/log/jail/username/dev/log

这绝不是安排 chroot 环境的唯一方法,尽管上述样式的设置使用户的主目录对于 chroot 之外的进程尽可能正常(= 没有符号链接或其他怪异),如果这很重要的话。

如果您想要一个对于被监禁的用户来说最大程度无用的 chroot,您可以这样做:

mkdir -p /jail/username/username

# Prepare the chroot directory
chown root:root /jail /jail/username
chmod 755 /jail /jail/username

# Prepare the user's actual home directory
chown username: /jail/username/username
chmod 750 /jail/username/username

# Make it usable outside the chroot too
ln -s /jail/username/username /username

# And now it can be assigned to the user.
usermod -d /username username

我们再次设置ChrootDirectory /jail/%u.

在 chroot 之外,/username将有一个指向 的符号链接/jail/username/username,因此用户的主目录将有效。

对于 chroot 进程来说,/username这只是一个常规目录,完全可以用作用户的主目录。

是的,实际的路径名有点重复,并且符号链接会使系统的根目录变得混乱,但 chroot 环境中不会有任何无关的内容。

如果仅有的chroot 用户需要的是 SFTP,这个问题的公认答案描述了一种更简单的方法。

答案2

它肯定会失败,因为 sshd 会尝试 cd 到/home/user/home/user?

好吧,只有当该目录不存在时。

您确实提到您只需要 SFTP,但是类似的功能ChrootDirectory可用于为 chroot 环境提供更大的工具集,需要二进制文件和库,或者可能有多个用户使用相同的 chroot 环境。在这些情况下,您很可能会遇到/some/chroot/home/user。当然,ChrootDirectory %h在这种情况下似乎不太有用。

尽管这可能有点愚蠢,但您可以创建/home/user/home/user并让用户在那里工作。

在 之外创建 chroot 时/home,用户主目录的用途是什么?还用来读书吗~/.ssh/authorized_keys

事实上,这是一个非常好的观点。手册页说ChrootDirectory

ChrootDirectory
指定 chroot(2) 的目录路径名认证后

所以这似乎意味着它是authorized_keys从 chroot 外部读取的。

这阻止了我的另一种配置想法。我想过将用户的实际主目录设置为 just/并设置 ChrootDirectory /home/%u,但现在这似乎不是一个好主意。

相关内容