我已经使用 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