我刚刚安装了一个基于 CentOS 的服务器作为 SFTP 服务器。
我需要所有传入文件都进入 /mnt/inbound/ 文件夹,因此我想确保通过 SFTP 登录的该主机的每个用户都将 /mnt/inbound/ 作为起点,并且我想确保他们无法进入其他任何地方。
我已经能够使用 SFTP 客户端与测试用户连接,并确保用户被监禁到各自的文件夹中 - 但用户无法上传文件......
这是我到目前为止所做的:
- 创建一个名为 sftponly 的组来包含所有客户入站用户:
$ groupadd sftponly
- 修改 /etc/ssh/sshd_config 以使用内部 sftp 子系统:
# Enable built-in implementation of SFTP Subsystem sftp internal-sftp
- 在 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
- 添加用户以使用 sftp:
$ sudo useradd -g sftponly testuser
- 必须在 /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 目录中工作 - 是的,这有点违背您使用非主文件夹的特定目标,但可能会帮助其他人尝试做类似的事情。
创建一个新的系统用户(在本例中我将此用户称为“yournewuser”)用于 SFTP 访问(Ubuntu 应该在“adduser”输入过程中自动生成主目录),设置密码,并将新用户添加到组中您将设置为 SFTP 的控制组,在此示例中我将其称为“yoursftpgroup”。
如果您不希望该用户登录,请设置以下内容: sudo usermod -s /sbin/nologon yournewuser
正如您所指出的,请确保新用户的目录由具有“CHOWN root”的 root 拥有。是的,这应该完成,并且 sudo 应该处理这个问题,但我明确地这样做了,以防万一......
将此新用户的目录“/home/newuser/”的权限 (CHMOD) 设置为 755 我不必使用 -R 开关(注意该开关)注意:这应该与其他用户具有相同的权限 -至少就我而言。如果不这样做,将导致 SFTP 登录时出现访问被拒绝的问题(使用 WinSCP 进行测试)
在 /home/yournewuser/uploads 中为您的上传创建一个新目录。您可能必须以 sudo 的方式执行此操作,因此现在您需要使用 yournewuser 将所有权转移回该用户:yoursftpgroup CHOWN /home/yournewuser/uploads
现在将该目录的权限设置为 700:CHMOD 700 /home/yournewuser/uploads。
更改 /etc/ssh/sshd_config 文件,并在末尾添加以下行(在本例中只需调整行):
Subsystem sftp internal-sftp Match Group yoursftpgroup ChrootDirectory /home/%u X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp -d /uploads
使用以下命令重新启动 SSH 服务: sudo service ssh restart
测试访问
答案3
您需要将 /mnt/inbound 文件夹的所有权交给 root 帐户,然后在 inbound 文件夹中创建与其他用户同名的文件夹并授予他们完全权限。
您可以使用 chroot 选项,这样每个用户将只有自己的文件夹并且无法上去。
但使用该解决方案无法拥有通用的上传文件夹。