我试图user2
仅授予对他的主目录的访问权限和对 的完全权限/cygdrive/e
。我Data/
在他的 中创建了一个目录$home
,bind
在 中添加了一条指令/etc/fstab
(见下文),并发出了mount -a
。
我已安装 cygwin 并运行 sshd (OpenSSH_6.1p1)。ChrootDirectory
在 sftp 子系统中启用连接时,~/Data
似乎没有内容。即使我将 的权限递归更改/cygdrive/e
为0777
,结果也是一样的。ChrootDirectory
在 中对该用户启用sshd_config
,则不会显示任何内容。
但是,使用相同的用户帐户进行连接而不更改任何权限,~/Data
在我注释掉Subsystem
底部的部分sshd_config
并重新启动 sshd 后,的内容将完全填充。
那么我该如何授予这只猫上帝模式权限,/cygdrive/e
而不授予他浏览文件系统任何其他部分的能力呢?我遗漏了什么?
我的底部sshd_config
如下:
Subsystem sftp internal-sftp
Match User user2
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
其中唯一一行内容/etc/fstab
如下:
/cygdrive/e /home/user2/Data none bind,posix=0,user
目前, 的递归所有权/cygdrive/e
属于Administrators:Users
。Windowsuser2
帐户是 的成员,Users
也是的成员Administrators
。所有目录的掩码为0755
。所有文件的掩码为0644
。
我并不热衷于user2
拥有机器的管理员权限,但我稍后会处理这个问题。一次解决一个问题。
答案1
回答
不幸的是,这是不可能的。许多因素会合谋在每个回合击败你。
为什么不在监狱内创建一个挂载点?
显然,mount
cygwin 中的行为与 POSIX 操作系统中的行为有很大不同。在 cygwin 中,mount
仅限于当前登录会话的范围。这意味着如果您将设备安装为用户1, 然后用户2将无法使用这个坐骑。
bind
挂载类型是、更传统的ntfs
类型挂载还是网络共享都无关紧要cifs
。没有哪种类型的绑定是持久的。即使您mount --change-cygdrive-prefix /path/to/jail
,sftp 用户也不会看到它——事实上,其他特权用户也不会看到它。
好的,那么,为什么不把监狱放在/cygdrive/e 里面呢?
当 sftp 客户端连接建立时,/cygdrive/e
还不存在。即使它存在,还有另一个问题。请记住,从 的开头到结尾的每个目录都/path/to/jail
必须由 拥有root
。由于 是/cygdrive
在运行时为用户会话安装的, 的所有者/cygdrive
是当前用户。 并且chown root:whatever /cygdrive
什么也不做——没有错误,但也没有效果。
那么主机操作系统解决方案呢?Windows 硬链接或连接是否可行?
不幸的是,从客户端交互的角度来看,mklink
这只是一种创建快捷方式的奇特方式。无论您是创建文件或目录符号链接、硬链接还是连接,都没有关系。sftp 客户端将它们全部视为带有箭头的图标, mklink
无法用其特定的欺骗方法欺骗 sftp 客户端。
接受失败
根本没有办法教internal-sftp
chroot 理解 cygwin 对 的笨拙模仿mount
。其他人也尝试过,但即使是专家们感到困惑。
那么,不要使用 internal-sftp。制作一个包装脚本以在连接时执行挂载。
这也许是可能的。我还没有尝试过,因为似乎没有简单的办法包装器需要区分特权用户和 chroot 监禁用户,我仍然希望能够使用自己的帐户浏览整个文件系统。此外,设置完整的 chroot 监禁环境会冒犯我微妙的审美感。我宁愿登录用户少迷路。如果有意义的话,我更喜欢低垃圾与内容比率。
你接下来打算怎么办?
在我的 Windows PC 上,我共享了我希望 sftp 可以访问的文件夹。在一台小型 Linux 设备 PC 上,我通过以下方式映射了相应的 cifs 共享自动文件系统,以及设置延迟 mount bind
在 fstab 中设置,将autofs
挂载中的目录绑定到 chroot jail 内的挂载点internal-sftp
。它工作得非常好!客户端连接到我的 Linux 设备以上传/下载 Windows 共享上的文件。对于用户来说,整个过程完全透明。对我来说,该设置可以容忍重新启动并且无忧无虑。
对于处于类似情况的人来说,这或许是一个很好的借口,可以买一台 Raspberry Pi 或某种类型的 Plug PC 并做同样的事情。