如何设置一个SFTP服务器,并将用户限制在其家目录中?

我一直在尝试设置一个带有多个用户的SFTP服务器,这些用户chroot到自己的主目录中。我按照这个指南Archive.org链接)的建议进行操作,并在用户目录上执行了以下命令。

chown root:root /home/user/
chmod 755 /home/user/

每个用户的主目录中都有一个名为public的附加文件夹,该文件夹由用户拥有,以便允许他们根据需要创建目录、上传和删除文件。(这是我之前提到的指南中建议的)
现在当我执行sftp -P 435 user@localhost时,我遇到了以下错误:

写入失败:管道中断
无法读取数据包:连接被对等方重置

我该如何继续?最终的想法是让其他机器上的每个用户使用FileZilla登录到其限制主目录,并能够上传目录和文件。所有这些都在SFTP中进行(因为它更安全)。

提供的链接已经失效了,你能否更新一下? - Ash
1@ash:已更新,附上Archive.org链接 - Nitin Venkatesh
5个回答

那篇文章还描述了如何获得一个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用户添加到组中,他们就可以获得免费的shell访问权限。这并不是一个好的情况。因为SSH不能同时使用和(登录必须满足两个规则),所以你需要创建一个额外的组,比如。将被允许通过SSH登录的用户(下面的)添加到该组中:

sudo groupadd ssh-users
sudo gpasswd -a youruser ssh-users

并将下一行添加到/etc/ssh/sshd_config中:
AllowGroups ssh-users sftp

现在继续修改用户主目录的权限,以允许进行chroot操作(例如用户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。

这里的指示对我没有起作用,但是按照这个问题和答案中的指示却有效:http://askubuntu.com/questions/134425/how-can-i-chroot-sftp-only-ssh-users-into-their-homes/134442#134442 - Max Masnick
给匿名编辑者:Match块并不是添加在UsePAM行之前。相反,Match块是追加到文件中的,而UsePAM行则在此之前的某个位置。 - Lekensteyn
请确保在sshd_config文件中存在"UseLogin yes"选项。 - Peter Lozovitskiy
你需要在AllowTcpForwarding no之后加上Match all来关闭Match Group块。这样你就不需要注释掉UsePAM和后面出现的任何行了。 - Simon Woodside

只是想补充一下,文件夹权限在目录树上方需要以特定的方式设置。
sshd 的严格所有权/权限要求规定了 chroot 路径中的每个目录必须由 root 拥有,并且只能由所有者进行写入操作。 来源 我遇到了一个非常类似的错误,修复我的目录权限解决了这个问题。

4这是我的问题。我通过为我添加的用户添加具体信息来解决它:Match User ftpusername,然后 ChrootDirectory %h,最后 ForceCommand internal-sftp。除了设置 chown root /home/ftpusername 之外,我不需要注释 UsePAM 或进行任何其他更改。在执行 chown 之前,我无法通过 sftp 连接。 - james-see

我正在使用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
  1. 创建sftp组:

    groupadd sftp

  2. 直接创建带有新的sftp组的用户:

    sudo useradd -d /ftpusers/HomeFolder -m UserName -g sftp -s /bin/false

  3. 为sftp设置ssh权限:

    chown root:root HomeFolder

    chmod 755 HomeFolder

  4. 重启服务:

    service ssh restart

注意,新的sftp用户的主文件夹必须具有root所有者。


在执行sudo passwd UserName设置用户密码之前,您需要完成第二步后的另一步骤。 - jnunn
我认为第四条应该写成: service sshd restart - user162895
2不,12.04版本中是“ssh”,而不是“sshd”。 - jwbensley
sshd 适用于 Red Hat Linux。 - Deian

这是一个逐步指南,允许:
1. 用户bob对/home/bob/uploads进行SFTP访问 2. 将bob锁定在SSH之外 3. 使用用户名/密码而不是密钥:
首先,编辑您的/etc/ssh/sshd_config文件:
sudo nano /etc/ssh/sshd

向下滚动并进行修改:
PasswordAuthentication yes

并在底部添加这个:
Match Group sftpusers
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no  

按下Ctrl-X退出并保存。

现在添加用户:

sudo useradd bob
sudo passwd bob

现在添加组并禁用SSH。
sudo groupadd sftpusers
sudo usermod  -g sftpusers bob
sudo usermod -s /usr/bin/rssh bob
sudo usermod -d /home/bob bob

现在设置权限:
sudo chown root:root /home/bob/
sudo chmod 755 /home/bob/
sudo mkdir /home/bob/uploads
sudo chown bob /home/bob/uploads

sudo service sshd restart

所有这些都是在以root用户身份登录的情况下进行的(Amazon Linux AMIs上的ec2-user)。

PasswordAuthentication yes 对我来说是一个解决方案。 - Thamaraiselvam

此外,当将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