我希望使用 OpenSSH 的 internal-sftp、chroot 和 Match 指令实现以下目标:
属于组的用户sftp用户应该具有对 /srv/sftp/{username} 的读写权限(或类似地,可以采取某些技巧来向 chrooted 用户呈现更好看的目录结构)
属于组的用户sftp管理员应该具有对 /srv/sftp 及其子目录(即所有其他用户目录)的读写权限。
所有属于 sftpadmin 或 sftpuser 的用户都是 sftp 专用用户。因此无需担心 shell 等。
/srv/sftp 需要由 root 拥有,以便 sftpadmin 用户能够 chroot 到该文件夹。/srv/sftp/{username} 也需要由 root 拥有,以便将 sftpuser 用户 chroot 到该文件夹。
我应该如何最好地授予 sftpadmin 用户对 root 拥有的 /srv/sftp/{username} 目录的访问权限?
我可以在根权限之上使用 ACL 吗?
答案1
我最终这样做了:
/srv/sftp/testadmin (主目录测试管理员用户)
/srv/sftp/testuser/testuser (测试用户用户)
我将 sftpadmin 组 chroot 到 /srv/sftp:
Match Group sftpadmin
ChrootDirectory /srv/sftp
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp
我将 sftpuser 组 chroot 到 /srv/sftp/{username},并将其起始目录更改为 /srv/sftp/{username}/{username}(从 chroot 来看,这只是 /{username}):
Match Group sftpuser
ChrootDirectory /srv/sftp/%u
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp -d /%u
最后,我授予 sftpadmin 组对 /srv/sftp/testuser/testuser 目录的 rwx 权限:
setfacl -m g:sftpadmin:rwx /srv/sftp/testuser/testuser
这大致实现了我想要的。sftp管理员组可以读取、写入和更改工作目录到 /srv/sftp 下的任何内容(包括“主目录”sftp用户组)。sftp用户组只能写入 /srv/sftp/{username}/{username} 目录,而看不到其他目录sftp用户主目录,因为它们位于 sftpuser 组的 chroot 之外。
唯一不理想的是 /srv/sftp/{username}/{username} 结构。sftpuser 组的用户可以执行光盘 ..然后返回到 /srv/sftp/{username},该用户除了改回 /srv/sftp/{username}/{username} 外,无法执行任何有用的操作。可以通过删除 /srv/sftp/{username} 的执行位来阻止将目录更改为 /srv/sftp/{username},但这也会阻止 sftpadmin 组更改到该目录,从而有效地阻止他们列出 /srv/sftp/{username}/{username} 目录中的文件等。