我一直在尝试设置一个 SFTP 服务器,让多个用户 chroot 到他们的主目录。我遵循了本指南(Archive.org 链接),然后在用户目录上执行以下命令
chown root:root /home/user/
chmod 755 /home/user/
每个用户的主目录中都有一个名为的附加文件夹public
,该文件夹由其用户拥有,以便他们可以根据需要创建目录并上传和删除文件。(这是我之前提到的指南中建议的)
现在当我执行时sftp -P 435 user@localhost
,出现此错误:
写入失败:管道损坏,
无法读取数据包:对端重置连接
我该怎么做?最终的想法是让其他机器上的每个用户使用 FileZilla 登录到他们的 chrooted 主目录,然后能够上传目录和文件。所有这些都在 SFTP 中完成(因为它更安全)
答案1
该文章还描述了如何获取 chrooted shell 访问权限,但由于您只想要一个仅限 sftp 的帐户,只需按照以下说明操作:
编辑/etc/ssh/sshd_config
并添加以下行:
SubSystem sftp internal-sftp
Match Group sftp
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
找到这一行UsePAM yes
并注释掉:
#UsePAM yes
如果不禁用此功能,我的 SSH 服务器将在重新加载/重新启动时崩溃。由于我不需要 PAM 的花哨功能,所以这没问题。
为了提高安全性,请限制可以登录的用户。如果您忘记将 SFTP 用户添加到sftp
组中,则将授予他们免费的 shell 访问权限。这不是一个好的情况。由于 SSH 无法结合AllowUsers
和AllowGroups
(登录必须同时满足两个规则),因此您必须创建一个额外的组,例如ssh-users
。添加允许youruser
通过 SSH 登录(如下)的用户:
sudo groupadd ssh-users
sudo gpasswd -a youruser ssh-users
并添加下一行到/etc/ssh/sshd_config
:
AllowGroups ssh-users sftp
现在继续修改用户主目录的权限以允许 chrooting(示例用户sftp-user
):
sudo chown root:sftp-user /home/sftp-user
sudo chmod 750 /home/sftp-user
sftp-user
创建一个可以自由放置任何文件的目录:
sudo mkdir /home/sftp-user/public
sudo chown sftp-user: /home/sftp-user/public
sudo chmod 750 /home/sftp-user/public
如果您在运行中遇到任何问题,请检查/var/log/syslog
和/var/log/auth.log
了解详细信息。使用选项运行ssh
或sftp
以-vvv
查看调试消息。对于sftp
,选项必须出现在主机之前,如sftp -vvv user@host
。
答案2
只是想添加目录树中的文件夹权限需要以某种方式设置。
sshd 的严格所有权/权限要求规定 chroot 路径中的每个目录都必须由 root 拥有,并且只能由所有者写入。
我遇到了非常类似的错误,修复目录权限后,问题就解决了。
答案3
我正在使用 Ubuntu LTS 12.04,经过很多痛苦之后,这个对我有用。
我的设置/etc/ssh/sshd_config
Subsystem sftp internal-sftp -f AUTH -l VERBOSE
UsePAM yes
Match group sftp
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
创建组 sftp:
groupadd sftp
直接创建用户并附加新的 sftp 组:
sudo useradd -d /ftpusers/HomeFolder -m UserName -g sftp -s /bin/false
设置使用 ssh 进行 sftp 的权限:
chown root:root HomeFolder
chmod 755 HomeFolder
重启服务:
service ssh restart
请注意,新 sftp 用户的主文件夹必须被赋予 root 所有者。
答案4
还要注意,在将 Match 指令添加到配置文件时,任何与匹配无关的指令都可能停止工作。与其注释掉所有不兼容的内容,不如将包含 Match 指令的任何部分移到配置文件的末尾。
此外,可能需要将 chroot 目录及其父目录的权限设置为 755,并将所有者设置为 root:root。就我个人而言,我将 chroot 目录 sshd_config 设置为 %h,即用户的主目录,然后将他们的主目录设置为我想要的位置,例如 /var/www/examplewebsite.com。有些人可能更喜欢将 chroot 主目录配置为静态部分,后跟用户名,例如 /var/www/%u,但这当然需要确保用户的 chroot 目录与其用户名匹配。
要解决连接问题,请停止 ssh 服务,确保先打开一个或两个 SSH 会话进行测试,然后以调试模式交互启动守护程序以检查连接调试信息,因为这可以帮助您识别任何问题,并搜索如何修复它们。
命令:service ssh stop ; /usr/sbin/sshd -d
完成后一定要重新启动 ssh!命令:service ssh start