认证后将 SFTP 用户转发到 chroot 子目录

zer*_*dot 6 ssh sftp file-permissions

我已经使用 OpenSSH 设置了 SFTP 服务器,一切正常,我创建的用户可以连接。

认证后,用户发现自己直接在里面/chroot,一个不允许他们写入的目录。所以我把/subdirectory/chroot他们有写权限(灵感来自这篇博客文章的正常工作以及)。

但是,由于我正在处理的项目的性质,用户应该会发现自己直接位于他们在身份验证后允许写入的文件夹中。将它们转发到/chroot/subdirectory可能是最好的解决方案,但我没有找到解释如何实现这一目标的资源。

可以做到吗?如何?

Eri*_*ikE 3

[编辑]是的,我相信这是可能的,但我也相信 openssh 不行:

以下是我如何使用 openssh chroot sftp:

sftponly我将 sftp 用户放入文件中标识的特殊组中sshd_config。我确保 sftp 用户没有 shell(因此他们无法使用 ssh 登录),并使用.%h环境变量强制他们使用指令进入以其主目录命名的 sftp chroot 子目录ChrootDirectory。sshd_config 解释的其他环境变量记录在sshd_conf 手册页中,如下所示:

路径名可能包含以下标记,一旦连接用户经过身份验证,这些标记将在运行时展开:%% 被替换为文字“%”,%h 被替换为正在验证的用户的主目录,%u 被替换通过该用户的用户名。

这是我在 OpenBSD 上实现此目的的笔记副本,如果您使用不同的系统,.%h环境变量当然可能会有所不同:

# 1. Create the sftp jail directories
# These directory permissions work with this /etc/ssh/sshd_config:
# drwxr-xr-x  4 root    wheel  512 May 14 16:20 /home/sftproot
# drwxr-xr-x  3 root  wheel  512 May 14 16:21 /home/sftproot/home
# drwxr-xr-x  3 root  wheel  512 May 14 16:37 /home/sftproot/home/User01
# drwxr-xr-x  3 User01  sftponly  512 May 14 16:39 /home/sftproot/home/User01/upload
# drwxr-xr-x  3 root  wheel  512 May 14 16:37 /home/sftproot/home/User02
# drwxr-xr-x  3 User02  sftponly  512 May 14 16:39 /home/sftproot/home/User02/upload

# 2. Make sure /etc/ssh/sshd_config jails /home/sftproot/.%h

# 3. Create a group whose members will only be allowed sftp access
# groupadd sftponly

# 4. Create User01 + User02 whom will only get sftp access
# useradd -s /sbin/nologin -m -G sftponly User01
# useradd -s /sbin/nologin -m -G sftponly User02

# 5. In /etc/ssh/sshd_config enable use of chroot(internal-sftp) then force chroot dirs per user:
# override default of no subsystems
# Subsystem     sftp    /usr/libexec/sftp-server
# Subsystem       sftp    internal-sftp
# Rules for sftponly members
# Match group sftponly
#         ChrootDirectory /home/sftproot/.%h
#         X11Forwarding no
#         AllowTcpForwarding no
#        ForceCommand internal-sftp

# [Comment] Make sure /etc/ssh/sshd_config jails /home/sftproot/.%h
# Which will translate .%h to /home/$username

# [Comment] The sftp users will not be able to log in outside of sftp (as they have no shell).
# As they sftp in they will land in the /home/sftproot/home/Userxx directory which
# will be named "./" and where they have no write access.
# However the directory ./upload is read/writable.
Run Code Online (Sandbox Code Playgroud)

[编辑第 2 部分]但是,sshd_conf 手册页还指定:

Chroot目录

指定身份验证后 chroot(2) 的目录路径名。在会话启动时,sshd(8) 检查路径名的所有组成部分是否为 root 拥有的目录,任何其他用户或组都无法写入这些目录。chroot 后,sshd(8) 将工作目录更改为用户的主目录。

因此,chroot 目录路径(包括变量扩展指定的部分)预计由 sshd 测试并由 root 独占拥有和写入。因此,openssh sftp chroot 服务的用户需要可写子目录才能写入主目录。

但我相信这并不是所有 ssh 服务器的要求。我们还使用Tectia,我观察到用户能够写入各自的根目录。然而,我们仅在需要 Windows 的情况下运行它,因此遗憾的是我无法轻松测试相应的 *nix 配置。Tectia sftp chrooting 支持页面没有明确指定用户 home 需要由 Unix 环境中的 root 拥有。因此,我猜测对于 Tectia,这不是一个要求,但 chrooted 用户主 rootdir 的所有权可能是实际用户的所有权。