允许多个用户的 SFTP 访问一个或多个目录

允许多个用户的 SFTP 访问一个或多个目录

对于我的某些用户,我需要允许他们通过 SFTP 访问一个或多个目录。多个用户可以访问同一个目录。但对于他们没有权限的目录,他们既看不到目录的名称,也无法浏览它们;实现我的目标并维持未来变化的最佳(最简单和最安全)方法是什么?

我知道有以下方法可以实现这一点:chroot、mount bind、ACL。我试过了(也用过 chown 和 chmod),但用户仍然可以通过 Filezilla 查看和浏览其他目录。

有什么帮助吗?

我的配置:

All of my users (user1, user2 ...) are in the group "group_sftp_external_users".
Debian 10

我的目录结构:

   /var/temp/all/dir_1
   /var/temp/all/dir_2
   /var/temp/all/dir_3
   /var/temp/all/dir_4
   /var/temp/all/dir_5

在“/etc/ssh/sshd_config”中:

Match Group group_sftp_external_users
        ChrootDirectory /var/temp/all
        ForceCommand internal-sftp
        X11Forwarding no
        AllowTcpForwarding no
        AllowAgentForwarding no
        PermitTunnel no
        PubkeyAuthentication no
        PasswordAuthentication yes
        PermitEmptyPasswords no

答案1

首先要意识到,这样的设置将允许这些用户在彼此之间传递任何数据(包括 KP、国家机密、被盗信用卡……)。您正在这些用户之间托管一个开放中继,如果他们决定做一些地方政府不喜欢的事情,您可能会因帮助他们而承担法律责任。至少,您需要保留他们的文件活动日志并查看这些日志。

接下来,我强​​烈建议您使用 chroot,因为这些都是不受信任的用户。 https://www.the-art-of-web.com/system/sftp-logging-chroot/ 很好地解释了如何做到这一点,但我的需求并不完全符合。不过,我的需求大致符合您的描述,所以我认为我的解决方案可以作为一个很好的起点。

我的策略是为所有 sftp 用户创建一个 chroot,并使用文件权限来让他们彼此看不到对方的目录。具体来说,我的文件结构如下所示:

  • /sftp_files 755 root.root <- 带有 HPI 的驱动器的挂载点

    • /chroot_sftp 755 root.root <- chroot 适用于所有 sftp 用户。sshd 所需的权限
      • /dev 755 root
        • /log 4766 root.root <- 由 rsyslog 使用
      • /home 710 root.sftp
        • /用户1 700 用户1.sftp

通过此设置,sftp 组中的用户将 chroot 到 /sftp_files/chroot_sftp。/etc/rsyslog.d/25-sftp.conf 中的文件中有一个针对 /sftp_files/chroot/dev/log 文件的条目。由于 /sftp_files/chroot_sftp/home 具有不常见的 710 权限,因此用户无法列出该目录,但他们可以访问他们知道名称的任何文件,前提是该特定文件的权限允许这样做。此外,我创建了这些 sftp 用户,并将 sftp 作为他们的唯一(和共享)组。

我还使用公钥,因此常规的 /home/user1/.ssh/authorized_keys 文件存在。(我使用 /etc/skel 和一个空文件来创建具有适当权限的文件。)这可以改为放在 /sftp_files/authorized_keys/user1 中,其中 authorized_keys 为 root.sftp 710,user1 为 user1.sftp 700。但是,这会破坏 /etc/skel 中的 authorized_keys 文件。

我没有测试过以下内容。对于您的共享目录,我会添加一些其他项目:

          • /shared_dirs <- 链接到 /shared_dirs,在 chroot 内部将转到...
      • /shared_dirs 750 root.sftp <- 此处。内容对所有人都可见,但是...
        • /sd_1 770 root.sg1 <- 仅可供 sg1 组成员访问。

链接 /shared_dirs 很方便,这样用户就不必记住他们看不到的目录的名称。或者,shared_dirs 也可以有 710 个权限,然后您可以为每个用户应该能够访问的共享目录创建一个链接。

相关内容