使用安全凭证或令牌将 SMB 共享 (CIFS) 安装到容器

使用安全凭证或令牌将 SMB 共享 (CIFS) 安装到容器

我有一个 docker-compose 设置,可以在 Windows 上运行我的 Linux 开发环境。许多容器需要使用 LDAP 凭据挂载 smb 驱动器。现在,此方法的工作原理是向容器入口点添加如下命令:

mount -t cifs -o username=$USERNAME,password=$PASSWORD \\\\myshare.domain.com\\path_to_shared\\directory /mnt/z

环境变量$USERNAME$PASSWORD以纯文本形式保存在名为 的文件中auth.env。这是在我的 Windows 主目录中,docker-compose 将其作为环境文件添加到容器中。

我无法在每次容器启动时都有提示,因为作为我的工作流程的一个过程,它们会不断地被重新启动。

我的理解是,cifs 的身份验证方式是生成令牌,然后在整个会话期间使用该令牌。我想知道我是否可以检索此令牌,将其保存在内存中(如果需要,甚至可以保存到磁盘),然后使用它来挂载这些驱动器。

答案1

我的理解是,cifs 的身份验证方式是通过生成令牌,然后在整个会话过程中使用该令牌。

SMB(以及过时的 CIFS)主要使用 NTLMv2 身份验证,这是一种质询-响应协议。这意味着响应是故意动态的——每次连接时,您都会收到新的质询,并且必须发送新的响应,而不是您(或攻击者)可以反复重复的内容。

此协议中唯一的静态步骤是“NTLM 哈希”(密码的 MD4 哈希)。某些 SMB 客户端可能允许使用它代替密码;不幸的是,它并没有太大帮助,因为任何通过 NTLM 接受此帐户的服务将涉及相同的哈希值——如果您在五个文件服务器和两个 RDP 服务器上使用相同的密码,则知道 NTLM 哈希值即可登录所有这些服务器。换句话说,哈希值与密码等效。

如果您的文件服务器连接到 Active Directory,SMB 也支持 Kerberos,但情况大致相同。尽管 SMB 向服务器提供的 Kerberos 票证仅绑定到该服务器,它也被设计为快速过期——通常为 10 小时(尽管可以将其续订最多 7 天)。要获取新票,您仍然需要访问帐户的主要凭据(密码本身或其哈希/密钥表)。

因此,短期答案是使用 Kerberos:使用获取 TGT kinit,将整个 krb5cc 文件复制到容器,它的有效期为 10 小时,并将在第二天过期。

长期解决方案是让 Docker 使用独立账户只具有所需的访问权限。那么将其存储在磁盘上就没那么麻烦了,因为窃取它只能获得容器已安装内容的访问权限。

相关内容