通常,在成功登录sftp
并执行put
命令后,我希望我的文件传输到登录用户的$HOME
目录中。这是开箱即用的,但我想将用户限制sftp
在他们的目录中(例如,$HOME
这样他们就无法再向上一级)。cd
这是我ChrootDirectory
按照文档使用的地方(https://linux.die.net/man/5/sshd_config)
ChrootDirectory:指定身份验证后 chroot(2) 的路径。此路径及其所有组件必须是 root 拥有的目录,任何其他用户或组都无法写入
我认为我已经正确设置了文件夹/权限。我认为文档中的下一句话没有按预期工作或表现。
chroot 之后,sshd(8) 将工作目录更改为用户的主目录。
修改sshd_config
为使用ChrootDirectory
并成功通过用户访问服务器后sftp
,工作目录并未设置为用户的 $HOME 目录,而是实际上设置为上一级。(例如,/home
而不是/home/userTest
)对用户来说,明显的解决方法是使用 cd 进入下一级的正确目录,但如果您使用某些自动化系统只是将数据通过 FTP 传输到当前工作目录,这可能会非常成问题。
我将首先展示一般情况,然后对其进行修改,以展示ChrootDirectory
引入默认工作目录行为后的行为如何变化sshd_config
这按预期工作:
- 创建用户(用于
-m
创建此用户的主目录):sudo useradd -m userTest
- 给用户一个密码:
sudo passwd userTest
- 注意
userTest
$HOME目录:cat /etc/passwd
->userTest:x:1002:1004::/home/userTest:/bin/sh
- 为您刚刚创建的用户通过 sftp 连接到您的服务器:
sftp userTest@<your-server>
- 注意登录成功后的工作目录:
pwd
->Remote working directory: /home/userTest
上面的例子完全按照预期工作,唯一的问题是userTest
没有锁定到工作目录并且可以cd ..
重置文件系统。
几本指南都对这个问题给出了相同的基本解决方案(https://linuxconfig.org/how-to-setup-sftp-server-on-ubuntu-20-04-focal-fossa-linux)
添加前面的步骤
- 添加一个 sftp 组(这将用作我们的
Match
块的密钥sshd_config
):sudo addgroup sftp
- 添加
userTest
用户到组:sudo usermod -a -G sftp userTest
- 编辑
sshd_config
:sudo nano /etc/ssh/sshd_config
- 将以下几行添加到文件末尾
Match group sftp
ChrootDirectory /home
ForceCommand internal-sftp
(这基本上意味着属于该sftp
组的任何用户都将受到ChrootDirectory
和ForceCommand
规则的约束)
保存文件并重新启动 ssh: sudo systemctl restart ssh
验证指定的目录是否ChrootDirectory
满足上述文档的要求: ls -ltr
-> drwxr-xr-x 4 root root 4096 Jun 10 09:02 home
(我相信这通过了)
再次比较开箱即用设置的结果和使用我们的新配置 sftp 的结果userTest
:sftp userTest@<your-server>
注意当前工作目录:pwd
->Remote working directory: /
这并不是说有什么问题,我们预计工作目录会发生变化……但是让我们快速检查一下当前工作目录的内容:
ls -ltr
-> drwxr-x--- 3 1002 1004 4096 Jun 10 09:10 userTest
(!!!)
根据文档:
chroot 之后,sshd(8) 将工作目录更改为用户的主目录。
ls -ltr
显示工作目录不在userTest
主目录中,它实际上位于上一级。
有没有办法配置ChrootDirectory
或其他方法使其按预期工作?
注意:ForceCommand
从 sshd_config 中删除实际上会导致这个 11 年前作为勘误表关闭的其他问题?
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=681202