身份验证后将 SFTP 用户转发到 chroot 子目录

身份验证后将 SFTP 用户转发到 chroot 子目录

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

经过身份验证后,用户会发现自己直接进入了/chroot,这是他们无权写入的目录。因此,我将 放入/subdirectory他们/chroot有写入权限的目录中(灵感来自这篇博文) 也运行良好。

但是,由于我正在从事的项目的性质,用户应该直接进入一个他们可以在身份验证后写入的文件夹。将他们转发到/chroot/subdirectory可能是最好的解决方案,但我没有找到任何资源来解释如何实现这一点。

能做到吗?怎么做?

答案1

[编辑]是的,我相信这是可能的,但我也相信使用 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.

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

Chroot目录

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

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

但我相信这不是所有 ssh 服务器的要求。我们还使用杉木属我观察到用户可以写入各自的根目录。但是我们只在需要 Windows 的地方运行它,因此很遗憾我无法轻松测试相应的 *nix 配置。Tectia sftp chrooting 支持页面没有明确指定在 Unix 环境中用户主目录需要由 root 拥有。因此我猜想对于 Tectia 来说这不是一项要求,但 chrooted 用户主目录 rootdir 的所有权可能属于实际用户。

答案2

Chroot目录 /upload/%u

ForceCommand 内部-sftp -d 数据

这会将 sftp 放入 /upload/UserXX/data 目录中。数据目录归 UserXX 所有,且可由其读写

答案3

在 user474056 的回答帮助下。它以这种方式很好地工作:

sudo addgroup exchangefiles

sudo mkdir /home/chroot/

sudo chmod g+rx /home/chroot/

sudo mkdir /home/chroot/exchangefiles/

sudo chmod g+rwx /home/chroot/exchangefiles/

sudo chgrp -R exchangefiles /home/chroot/exchangefiles/

sudo useradd -g exchangefiles -s /usr/bin/false -d /home/chroot/exchangefiles/username username

sudo passwd username

vi /etc/ssh/sshd_config

sshd_config引用A:

# override default of no subsystems
#Subsystem  sftp    /usr/lib/openssh/sftp-server
Subsystem      sftp    internal-sftp

sshd_config引文B:

Match Group exchangefiles
  # Force the connection to use SFTP and chroot to the required directory.
  ForceCommand internal-sftp -d %u
  ChrootDirectory /home/chroot/exchangefiles/
  # Disable tunneling, authentication agent, TCP and X11 forwarding.
  PermitTunnel no
  AllowAgentForwarding no
  AllowTcpForwarding no
  X11Forwarding no

sudo service sshd restart

相关内容