基于连接客户端或共享的机会性 CIFS 协议版本(最小版本)选择?

基于连接客户端或共享的机会性 CIFS 协议版本(最小版本)选择?

问题)

  • 我如何(如果有的话)配置特定于客户端或特定于共享的异常,以允许 SMB1?
  • 我了解启用 SMB1 的安全风险,因此希望最大限度地减少攻击面。只要有配置为允许此类来宾访问的共享,是否启用 SMB1 是否有影响?

现在的情况

我有一个带有 Samba 4.11.6-Ubuntu ( ) 的 Ubuntu 20.04 机器,2:4.11.6+dfsg-0ubuntu1.3配置为接受匿名连接用户到特定共享的连接(security = usermap to guest = bad password共享级别guest only = yesguest ok = yes)。

这在其他 Ubuntu 机器上运行良好。确实如此不是工作从Android 应用程序称为 X-plore。该应用程序将失败并显示错误消息:

java.io.IOException:此客户端不支持协商的方言。

我的网络中有一个类似配置的 Ubuntu 18.04,其中配置了 Samba 4.7.6-Ubuntu ( 2:4.7.6+dfsg~ubuntu-0ubuntu2.17),其配置方式与上述服务器类似。

这在其他 Ubuntu 机器上也可以正常工作(无论使用较新还是较旧的 Samba)它确实可以在 Android 应用程序 X-plore 上运行。

好的,这表明 4.7.6 和 4.11.6 之间的版本差异是导致此问题的原因。差异归结smb.conf为路径差异和基于扩展变量(服务器名称等,例如%h)的差异,因此我可以高度确定地排除这种情况。

Android 应用程序SMB1在成功连接到 Samba 4.7.6 服务器后进行报告。所以似乎是导致该问题的一个可能原因4.11.6版本:

SMB1 默认禁用

“客户端最小协议”和“服务器最小协议”的默认值已更改为 SMB2_02。

这意味着不支持 SMB2 或 SMB3 的客户端将无法再连接到 smbd(默认情况下)。

/etc/fstab(1. 18.04 2. 20.04)中给出了两个远程 Samba 服务器的选项,如下所示:

$ awk '$3 ~ /cifs/ {print $4}' /etc/fstab|sed 's|'$(whoami)'|username|g'
nofail,user,guest,rw,uid=username,gid=username,forceuid,forcegid,file_mode=0664,dir_mode=0775,_netdev,x-gvfs-hide,noauto,x-systemd.automount
nofail,user,guest,rw,uid=username,gid=username,forceuid,forcegid,file_mode=0664,dir_mode=0775,_netdev,x-gvfs-hide,noauto,x-systemd.automount

...结果安装的条目看起来像(与以前的顺序相同):

$ awk '$3 ~ /cifs/ {print $4}' /proc/mounts 
rw,nosuid,nodev,noexec,relatime,vers=3.1.1,sec=none,cache=strict,uid=1000,forceuid,gid=1000,forcegid,addr=192.168.188.120,file_mode=0664,dir_mode=0775,soft,nounix,serverino,mapposix,rsize=4194304,wsize=4194304,bsize=1048576,echo_interval=60,actimeo=1
rw,nosuid,nodev,noexec,relatime,vers=3.1.1,sec=none,cache=strict,uid=1000,forceuid,gid=1000,forcegid,addr=192.168.188.130,file_mode=0664,dir_mode=0775,soft,nounix,serverino,mapposix,rsize=4194304,wsize=4194304,bsize=1048576,echo_interval=60,actimeo=1

显然选择了协议版本3.1.1在这两种情况下mount.cifs协商最近一些 Ubuntu 的协议版本时。

为了支持X-plore,似乎我需要启用SMB1。这可以通过以下smb.conf方式完成:

[global]
min protocol = SMB2

答案1

我发现答案在 AskUbuntu 上

要点是将服务器端的以下行添加到/etc/samba/smb.conf

server min protocol = NT1

...然后smbd使用以下任一命令重新启动(作为超级用户):

  • service smbd restart
  • systemctl restart smbd.service

之后 Android 端应该能够接受它。明显的区别在于 18.04 和 20.04 上两个 Samba 版本之间的默认最低协议版本。

相关内容