容器中安全挂载CIFS/SMB共享的方式,不需要特权标志或SYS_ADMIN能力。

7
我想从Docker容器中访问Windows文件共享(SMB3),但不想危及主机的安全性。我阅读的所有指南都说明我需要使用--privileged标志或--cap-add SYS_ADMIN功能之一。
这是我使用的命令:

mount -t cifs -o username='some_account@mydomain.internal',password='some_password' //192.168.123.123/MyShare /mnt/myshare

这导致以下消息:

无法应用新的能力集。

当我应用--cap-add SYS_ADMIN功能时,挂载命令正常工作,但我知道这会暴露主机面临明显的安全漏洞。
我还阅读了此StackOverflow问题的建议(在Docker容器内挂载SMB/CIFS共享),将卷本地挂载到运行docker的服务器上。出于两个原因,这是不可取的:首先,容器由Rancher Kubernetes集群编排,我不知道如何使用Rancher实现nPcomp所描述的内容;其次,这意味着卷对docker主机是可访问的。我希望只有容器通过密钥库给予它的凭据才能访问此共享。
我的问题是:有没有一种方法可以在Docker容器(在Kubernetes中)中挂载CIFS/SMB3共享,而不会使主机面临权限升级漏洞并保护凭据?非常感谢。

不要在容器内尝试挂载(8);通常情况下,当容器启动时,应该期望容器的网络和文件系统环境已经设置好了。对于Kubernetes设置,您可以查看从Pod访问CIFS文件以及类似的问题,这些问题讨论安装CIFS Kubernetes卷驱动程序,然后您可以像任何其他卷一样挂载它。 - David Maze
嗨David - 謝謝你。該方法部署了一個shell腳本,該腳本再調用mount。這要求我手動在每個工作節點上安裝cifs-utils,並且還在主機上掛載了卷,而我原本希望避免這種情況。但這似乎是Kubernetes中的做法,所以感謝您的指南。我將嘗試使用https://github.com/fstab/cifs創建的解決方案。 - ben
1个回答

9

在进一步研究后,我发现了如何做到这一点。有一个名为Kubernetes的SMB Container Storage Interface(CSI)驱动程序SMB CSI Driver for Kubernetes (https://github.com/kubernetes-csi/csi-driver-smb)。

使用helm安装CSI驱动程序(https://github.com/kubernetes-csi/csi-driver-smb/tree/master/charts)后,您可以遵循示例https://github.com/kubernetes-csi/csi-driver-smb/blob/master/deploy/example/e2e_usage.md选项#2 Create PV/PVC)来创建持久卷(PV)和持久卷声明(PVC),用于挂载SMB3共享。

然后,您可以创建容器并指定相关的持久卷声明,并将它作为/mnt/myshare等挂载。

我测试过了,它自动部署到多个worker节点,并且运行良好,不需要对容器进行privileged标记或--cap-add SYS_ADMIN标记。

这支持SMB3甚至身份验证&加密。要启用加密,请转到Windows Server>文件和存储服务,选择共享,属性>设置>加密数据访问。

Wireshark显示所有SMB流量都已加密。我只记不清楚是否必须首先手动安装cifs-utils,因为我已经在所有节点上完成了这个操作,所以无法测试。

希望这对某些人有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接