几年前,出于安全考虑,微软默认禁用了以访客身份连接 SMB 共享的功能。
在我的组织中,我有一些共享,我希望任何连接到网络的计算机都可以访问这些共享。我们没有域。每个人都带着自己的设备连接到网络,然后可以通过 IP 访问服务等等。我们有这个公共内容的网络共享,主要是安装套件,我希望每台计算机都能连接到它,而无需编辑客户端的配置以允许不安全的访客登录。
基本上,我想要但不知道如何做的是让 Samba 映射连接到服务器上特定用户的任何用户(我认为可以使用用户映射文件来完成),然后另外,我还没有找到如何让它接受任何密码作为有效密码(我们的 PC 具有相同的用户帐户名和不同的密码)。
能做到吗?还是说根本没人支持,没人想到过?这可能是一个 hack 解决方案,只要能工作就行。
最后,我想要实现的是使用任何 PC 连接到网络共享,无论用户名和密码组合如何,Samba 都会接受它,并且我选择的某个用户会在客户端上执行服务器操作、浏览等。这基本上相当于模拟以前允许的访客访问操作,而不必费力地在每台想要连接的 PC 上更改组策略设置,也不会让他们漫游到另一个位置/网络时面临风险。
谢谢
答案1
基本上,我想要但不知道如何做的是让 Samba 映射连接到服务器上特定用户的任何用户(我认为可以使用用户映射文件来完成),然后另外,我还没有找到如何让它接受任何密码作为有效密码(我们的 PC 具有相同的用户帐户名和不同的密码)。
两者都可以在 Samba 中使用相同的选项完成map to guest = bad user
,但不幸的是,以这种方式“模拟”访客访问正是“访客”访问是在 SMB 中。
一个问题是 SMB 服务器根本不接收密码;它们在 AD 域外使用 NTLM,在域内使用 Kerberos。NTLM 是一种质询/响应协议,它还会为双方生成会话密钥,SMB 随后使用该密钥对每个数据包进行身份验证(以及 SMBv3 中的整个握手 - 这在协商 SMBv3 的加密密钥时提供了一种 MITM 保护形式)。
但是,为了使 NTLM 或 CHAP 等质询/响应协议正常工作,服务器必须已经知道用户的密码(共享密钥)——没有它,服务器无法仅从客户端的响应中得出 NTLM 会话密钥(能够这样做会违背协议的意义),因此无法正确“签署” SMB 消息。
因此,SMB 中“访客”访问的工作方式是,服务器必须向客户端指示“您的凭据无效,但我还是接受您作为访客”,这样客户端就知道不需要 SMB 消息签名。如果服务器接受了任意 NTLM 响应,但没有发送“访客访问”指示(如果我正在读取协议文档对),这将导致客户端无论如何都无法连接。
简而言之,如果不实现实际的访客访问,就无法真正模拟访客访问。选择map to guest = bad user
意味着 Samba 必须表明这是一个访客会话。
(尽管根据文档,只有 Windows 10 的企业版或教育版默认禁用此功能,而家庭版/专业版则不会 - 如果您没有 AD 域,我认为您不太可能使用企业版...)
你可以而相反的做法是:Windows 不需要登录用户才能使用 SMB – 如果失败,它会提示您输入凭据(甚至允许您保存凭据),因此您可以使用正常的 SMB 身份验证,但创建一个带有每个人都知道的密码的帐户(将其写在办公室 Wi-Fi 密码旁边)。您可以使用批处理脚本预先保存密码cmdkey
。
(通过 Kerberos 访问加入域的文件服务器时这也有效。)