我希望人们从 Docker 内部访问 NFS 共享。问题是在 Docker 内部,他们可以成为 root,然后他们可以通过成为该用户来对任何人的文件进行写访问。有解决办法吗?
答案1
一种可能的解决方案是将 NFS 共享安装在 docker 节点上而不是容器内。这样,容器只能访问您在撰写文件中指定的共享内的卷,而不是整个共享本身。这是我在我的公司采用的方法,它似乎非常适合我们的小规模部署。对我们来说的另一个好处是,通过 stunnel 更容易确保安全,因为安装共享的服务器数量大幅减少。
答案2
如果用户可以在容器中获得 root 权限并可以查看其他用户的文件,那么您实际上无法阻止他们更改这些文件。
因此,您必须防止这种情况发生:要么限制容器可以“看到”它可能被允许写入的文件,要么阻止容器获得根权限。
Jason 的建议很好 - 将容器“视图”限制在共享中,以便它只能访问应该允许写入的文件。
但是,如果您希望容器能够读其他人的文件,那么你就必须阻止root。
或者真正熟悉 SELinux、CGroups 以及其他此类精细控制。
我不认为这是您所希望的答案。如果有人给你一个方法来做到这一点,我会爱听到它。
答案3
您想要一个“来自可靠的官方来源”的答案,但问题是,可能有一些解决方案,“最佳”方案取决于整体配置和为了获得所需的结果,您愿意承受的复杂程度。
因此你应该描述至少有一个概述您当前的设置,我们可以尝试提供全面的答案。
到目前为止,我最多能说的是,作为一般想法,第一步是从 Docker 机器而不是容器安装 NFS 共享,然后通过可用的常用方法将该共享的部分分发到相应的容器在 Docker 中。如果您有一组托管容器的 Docker 机器,那么这可能不是一项简单的任务。
无论如何,这还不足以避免该容器的 root 用户自由访问该部分中的文件,并且要实现这种更精细的控制,您需要配置 ACL(访问控制列表),无论是在 NFS 级别还是在服务器的文件系统级别。对于这两个选项中的任何一个,您都需要成为 NFS 服务器的系统管理员,它必须具有以下概念(至少一些分配给每个容器的每个用户的用户 ID 的概念)。如果不是所有用户 ID,至少是一组用户 ID,然后为每组用户设置 ACL。
寻找 NFS-acls(NFSv4 更好)来了解 NFS 级别可以做什么(相当多),并寻找 POSIX-acls 来了解文件系统级别。您可以通过在命令提示符下使用setfacl
和命令轻松地试验后者。getfacl
要使用这些命令,您可能需要安装操作系统的相关软件包。
答案4
您是否看过在主机中安装 NFS 的保险丝。当我使用fuse通过ssh(sshfs)安装时。它是作为我安装的,root 对这些文件没有任何特殊权限。 (sudo 无效)。