我需要在 CentOS 7 上创建仅 SFTP 用户。我已经从各种来源阅读了如何执行此操作。该设置只需支持单个用户通过 SFTP 访问单个文件夹。
如果用户的主目录是/home/user
并且在sshd_config
我有ChrootDirectory
as %h
,考虑到 sshd 会将目录更改为/home/user
chroot 之后:
Chroot目录 指定身份验证后 chroot(2) 的目录路径名。路径名的所有组成部分必须是 root 拥有的目录,任何其他用户或组都不可写入。chroot 后,sshd(8) 将工作目录更改为用户的主目录。
这是如何运作的?它肯定会失败,因为 sshd 会尝试 CD 到/home/user/home/user
?
补充问题:是否有最佳实践来决定是否在创建用户时定义的主目录中 chroot 这样的用户,还是将其 chroot 到/home
eg之外/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
,但现在这似乎不是一个好主意。