对于我的某些用户,我需要允许他们通过 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 个权限,然后您可以为每个用户应该能够访问的共享目录创建一个链接。