问题)
- 我如何(如果有的话)配置特定于客户端或特定于共享的异常,以允许 SMB1?
- 我了解启用 SMB1 的安全风险,因此希望最大限度地减少攻击面。只要有只配置为允许此类来宾访问的共享,是否启用 SMB1 是否有影响?
现在的情况
我有一个带有 Samba 4.11.6-Ubuntu ( ) 的 Ubuntu 20.04 机器,2:4.11.6+dfsg-0ubuntu1.3
配置为接受匿名连接用户到特定共享的连接(security = user
在map to guest = bad password
共享级别guest only = yes
和guest 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 版本之间的默认最低协议版本。