我有一个仅 sftp 用户的设置:
Match Group sftponly
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
我在 secure.log 中收到以下消息:
fatal: bad ownership or modes for chroot directory
使用 match 关键字会带来一些安全问题...目录需要由 root 拥有,并且目录需要 chmod 755 (drwxr-xr-x)。因此,如果由于 ssh 的安全性而只能对用户 root 可写,而对组设置为不可写,那么用户就不可能拥有对文件夹的写权限。
有人知道有什么好的解决办法吗?
答案1
我们最近找到了一个解决方法,如下所示:
/etc/ssh/sshd_config:
...
Subsystem sftp internal-sftp
Match Group sftponly
ChrootDirectory /home
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp
目录权限:
root@server:~ # chown root:root /home
root@server:~ # chmod 111 /home
root@server:~ # chmod 700 /home/*
现在/home
满足受限用户的要求ChrootDirectory
并且不能被受限用户列出,但是sftponly
如果用户的主目录照常设置,则用户将无法登录 ( /home/$LOGNAME
):在 chroot 环境下,他们的主目录不在内部/home
,而是直接在其下根 (/
)。
解决方法1
将受限用户的 home 设置为它们在 chroot 下的显示方式:
root@server:~ # usermod -d /username username
注意事项 1
如果任何不受限制的用户或某些管理脚本使用 bash 的波形符扩展,就像~username
它会扩展到/username
现在一样,这不是本意。
此外,创建用户的管理员sftponly
必须记住使用非默认主页。可以用脚本解决。管理员必须记住使用它。
解决方法2
这是我们最终使用的上一个的替代方案:
root@server:~ # ln -s . /home/home
即/home
在其自己的目录名中创建一个符号链接。现在,在 chroot 下/home/username
指向与没有 chroot 时相同的目录。对于使用 sftp 登录的受限用户,它将显示为/username
。该目录对其所有者(受限用户)是可写的。受限用户无法按名称列出任何同级用户的父目录或主目录。
用户唯一的特别之处sftponly
在于其对sftponly
群组的参与。我们发现它比解决方法 1 更容易处理。
注意事项 2
- 您不能让名为“home”的用户拥有主目录
/home/home
- 您必须小心遍历
/home
层次结构并遵循符号链接的脚本。
答案2
您需要在用户的主目录中创建一个结构,例如 in 和 out dirs。这些目录应该由用户拥有,他可以在那里放置和获取文件。
答案3
我在我们的服务器上有相同的设置。我们使用相同的 SSHD 配置。用户的主目录由 root 拥有,其中有文件夹documents
并由public_html
各自的用户拥有。然后,用户使用 SFTP 登录并写入这些文件夹(而不是直接写入主目录)。由于他们不允许使用 SSH,所以它完全可以工作。你可以在 /etc/skel/ 中调整为新用户创建哪些目录(至少在 openSUSE 中,我对其他发行版不太熟悉)。
另一种可能性是前交叉韧带(openSUSE 文档) - 它可以为各个用户添加对其主目录的写入权限。
答案4
参考“目录权限”部分在@artm(我刚刚测试过)的回答中..我发现:
root@server:~ # chmod 111 /home <- Does not work
它不允许 sftp 连接在 ubuntu 上工作,并且对所有内容(即 111)仅具有执行权限。
我找到:
root@server:~ # chmod 555 /home
可以使用读取和执行权限(即 555)连接到 sftp。不确定 debian 与其他风格是否不同,但这就是我安装的 ubuntu 上的功能。