必须同时禁用 guest ok、public 和 map to guest,并设 read only = yes 与 writable = no,再收紧文件权限、selinux 策略及客户端缓存,四者缺一不可。

直接关掉 guest ok = yes,再确认 read only = yes 和 writable = no 同时生效——只改一个没用,Windows 客户端仍可能静默获得写权限。
为什么“关掉 guest ok”还不够
很多配置里只删了 guest ok = yes,但忘了 read only = no 或 writable = yes 仍残留。Samba 的权限判定中,read only = no 优先级高于 writable = yes;只要前者存在,即使没开访客,已认证用户也可能意外获得写权。
-
read only = no是显式放行写入的开关,必须设为yes才真正禁写 -
writable = no是等效写法,但建议和read only = yes共存,避免参数冲突 - 如果共享段里还留着
public = yes,它会隐式启用guest ok = yes,得一并删掉
检查并清理匿名相关参数
打开 /etc/samba/smb.conf,定位到对应共享段(比如 [shared]),确保以下三行都不存在或明确设为否定:
-
guest ok = no(不能只注释,要显式写) -
public = no(public = yes是guest ok = yes的别名) -
map to guest = bad user(这行会让认证失败的请求降权为访客,必须删或注释)
改完后运行 testparm -s | grep -E "(guest|public|map to)",确认输出里没有 yes 或 bad user 字样。
文件系统权限也要同步收紧
Samba 配置关了,但若共享目录本身是 chmod 777 或属组可写,且 Samba 用户属于该组,还是能绕过写入——这是最常被忽略的一环。
- 查当前共享路径归属:
ls -ld /path/to/share - 如果属组有写权(比如权限显示
drwxrwxr-x),且 Samba 用户在该组里,就仍可写 - 安全做法:用
chmod 750 /path/to/share+chown root:sambareadonly /path/to/share,再把合法只读用户加进sambareadonly组 - 别漏掉 SGID 位:
chmod g+s /path/to/share要关掉,否则新建文件自动继承组写权
SELinux 和防火墙不是背锅侠,但得验证
如果改完配置重启 smbd 后 Windows 还能匿名写入,大概率是 SELinux 策略没更新或防火墙透传了旧连接。
- 临时验证:
setenforce 0,再试一次匿名访问。如果这时写入失败了,说明 SELinux 的samba_export_all_rw布尔值开着,得关:setsebool -P samba_export_all_rw off - 防火墙不用关,但确认
firewall-cmd --list-services输出里没有samba-client或samba——它们会放行未认证流量 - Windows 客户端记得清缓存:
net use * /del,否则可能复用旧会话保持写权
真正起效的关键点不在“怎么关”,而在“关得够干净”:Samba 参数、Linux 文件权限、SELinux 策略、客户端状态,四者缺一不可。任意一层漏掉,匿名写入都可能复活。











