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

jam*_*ell 8 chroot sshd

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

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

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

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

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

tel*_*coM 6

您需要注意对用作目录的其他限制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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

这也将允许像 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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