将 SFTP 的启动文件夹设置为 /home/username 之外的文件夹会引发权限问题

将 SFTP 的启动文件夹设置为 /home/username 之外的文件夹会引发权限问题

我刚刚安装了一个基于 CentOS 的服务器作为 SFTP 服务器。

我需要所有传入文件都进入 /mnt/inbound/ 文件夹,因此我想确保通过 SFTP 登录的该主机的每个用户都将 /mnt/inbound/ 作为起点,并且我想确保他们无法进入其他任何地方。

我已经能够使用 SFTP 客户端与测试用户连接,并确保用户被监禁到各自的文件夹中 - 但用户无法上传文件......

这是我到目前为止所做的:

  1. 创建一个名为 sftponly 的组来包含所有客户入站用户:

$ groupadd sftponly

  1. 修改 /etc/ssh/sshd_config 以使用内部 sftp 子系统:

# Enable built-in implementation of SFTP Subsystem sftp internal-sftp

  1. 在 sshd_conf 末尾添加以下内容:

Match Group sftponly # Force the connection to use the built-in SFTP support ForceCommand internal-sftp # Chroot the connection into the specified directory ChrootDirectory /mnt/inbound/%u # Disable network tunneling PermitTunnel no # Disable authentication agent forwarding AllowAgentForwarding no # Disable TCP connection forwarding AllowTcpForwarding no # Disable X11 remote desktop forwarding X11Forwarding no

  1. 添加用户以使用 sftp:

$ sudo useradd -g sftponly testuser

  1. 必须在 /mnt/inbound 下创建用户文件夹:

$ sudo mkdir /mnt/inbound/testuser

我现在可以使用 FileZilla(或任何其他客户端)与该主机建立 SFTP 连接,并且我可以看到用户被限制在 /mnt/inbound/testuser 文件夹中。但是用户无法上传文件。

我尝试更改 /mnt/inbound/test 文件夹的权限,以便用户 test 可以访问它,但这会破坏用户通过 SFTP 连接的能力。

我无法将文件夹的所有者更改为 root 以外的其他人,那么如何确保用户可以读取和写入各自的文件夹?

我在互联网上(包括 StackExchange)看到过多次尝试回答类似问题,但似乎都缺少一两点——因为当我尝试按照答案中提供的说明进行操作时,我总是会遇到 SFTP 设置损坏的情况。

问候,P.

答案1

是的,我设法在 #openssh IRC 频道获得了一些建议,这是我的解决方案中缺少的内容:

ChrootDirectory 中指定的目录必须由 root 所有。由于在上面的sshd_config文件中我已经指定了%u变量,因此每个用户都根据其用户名拥有自己的根目录(例如,testuser将是/mnt/inbound/testuser/),那么所有这些目录都必须由 root 拥有。这实际上是我创建目录时的默认设置,sudo mkdir /mnt/inbound/<username>因为mkdir命令是通过 提升的sudo

所以我需要做的是在下面创建一个子目录/mnt/inbound/<username>并为用户授予该目录权限。就我而言,我将此目录称为uploads

所以我稍微改变了我的配置如下:

Match Group sftponly # Chroot the connection into the specified directory ChrootDirectory /mnt/inbound/%u # Force the connection to use the built-in SFTP support ForceCommand internal-sftp -d /uploads

ForceCommand行已更改为 include -d /uploads,意味着用户登录后的默认目录是/uploads。请注意,它是/uploads而不是/mnt/inbound/%u/uploads因为它考虑到/mnt/inbound/%u已在配置中的上一行中指定为新根。

如果我执行ChrootDirectory /mnt/inbound/then 指定ForceCommand internal-sftp -d /%u,我可以使该/mnt/inbound/<username>文件夹由最终用户拥有,因为/mnt/inbound现在是必须由根帐户拥有的新根目录。但是,用户将能够导航到父文件夹并查看所有其他帐户的目录名称。我决定反对:)

答案2

感谢您发布更新的解决方案,@pmdci。我必须在我这边进行一些小小的修改,以使其在 Ubuntu 18 中给定用户的 /home 目录中工作 - 是的,这有点违背您使用非主文件夹的特定目标,但可能会帮助其他人尝试做类似的事情。

  1. 创建一个新的系统用户(在本例中我将此用户称为“yournewuser”)用于 SFTP 访问(Ubuntu 应该在“adduser”输入过程中自动生成主目录),设置密码,并将新用户添加到组中您将设置为 SFTP 的控制组,在此示例中我将其称为“yoursftpgroup”。

  2. 如果您不希望该用户登录,请设置以下内容: sudo usermod -s /sbin/nologon yournewuser

  3. 正如您所指出的,请确保新用户的目录由具有“CHOWN root”的 root 拥有。是的,这应该完成,并且 sudo 应该处理这个问题,但我明确地这样做了,以防万一......

  4. 将此新用户的目录“/home/newuser/”的权限 (CHMOD) 设置为 755 我不必使用 -R 开关(注意该开关)注意:这应该与其他用户具有相同的权限 -至少就我而言。如果不这样做,将导致 SFTP 登录时出现访问被拒绝的问题(使用 WinSCP 进行测试)

  5. 在 /home/yournewuser/uploads 中为您的上传创建一个新目录。您可能必须以 sudo 的方式执行此操作,因此现在您需要使用 yournewuser 将所有权转移回该用户:yoursftpgroup CHOWN /home/yournewuser/uploads

  6. 现在将该目录的权限设置为 700:CHMOD 700 /home/yournewuser/uploads。

  7. 更改 /etc/ssh/sshd_config 文件,并在末尾添加以下行(在本例中只需调整行):

     Subsystem       sftp    internal-sftp
    
     Match Group yoursftpgroup
    
     ChrootDirectory /home/%u
    
     X11Forwarding no
    
     AllowTcpForwarding no
    
     ForceCommand internal-sftp -d /uploads
    
  8. 使用以下命令重新启动 SSH 服务: sudo service ssh restart

  9. 测试访问

答案3

您需要将 /mnt/inbound 文件夹的所有权交给 root 帐户,然后在 inbound 文件夹中创建与其他用户同名的文件夹并授予他们完全权限。

您可以使用 chroot 选项,这样每个用户将只有自己的文件夹并且无法上去。

但使用该解决方案无法拥有通用的上传文件夹。

相关内容