Samba 文件共享加固实战:SMB 服务安全配置
Samba 文件共享加固是内网安全建设中最容易被忽略的一环。多数企业把 Linux 文件服务器暴露在办公网后,仍保留 SMBv1 兼容、匿名枚举与宽松的共享权限,一旦办公终端失陷,攻击者可用一条 smbclient 命令遍历全部共享目录,进而横向移动到备份与数据库节点。本文给出 Samba 从协议版本、认证方式、共享权限到审计的完整加固配置,全部命令可直接复制执行。
适用场景
- Linux 上以 Samba 4.x 提供 Windows 文件共享(部门盘、设计素材盘、备份中转盘)。
- 办公网与服务器网段互通,445/139 端口对内网全段开放。
- 出现过共享盘被勒索软件批量加密,或需要满足等保、ISO 27001 对访问控制的审计要求。
前置条件
- Samba 4.11 及以上(SMB 3.1.1 与 SMB 加密需要 4.11+),检查:
smbd -V。 - 具备 root 或 sudo 权限,可修改
/etc/samba/smb.conf并重启服务。 - 已确认客户端操作系统版本,避免加固后老终端无法挂载。
原理说明
Samba 的高危面集中在四处:
- 协议版本:SMBv1 使用已被彻底攻破的 NTLMv1 与弱加密,且不支持签名与加密,是永恒之蓝一类蠕虫的通行通道。
- 匿名与 guest 映射:默认配置下 map to guest 可能把认证失败映射成 guest,导致匿名用户获得目录读取权。
- 共享级权限:仅用文件系统权限控制,未使用 valid users 与 hosts allow,任何域用户或来宾均可访问全部共享。
- 传输加密缺失:不开启 smb encrypt 时凭据协商与文件内容在网段内明文可嗅探。
把上述四点串起来看,就是一条完整的入侵链:攻击者控制的办公终端先做一次匿名枚举,拿到共享列表与目录结构,再从中寻找 backup、数据库导出、运维脚本等高价值路径,随后把勒索程序写入可写共享目录,等待其他终端或定时任务执行。整条链路不需要任何漏洞利用,只依赖配置缺陷就能完成。加固的目的就是在枚举、写入、执行三个环节各设一道闸门:匿名枚举被 map to guest = never 掐断,写入被 read only 与 veto files 限制,执行被 noexec 挂载选项阻截。任何一环单独部署都不足以阻断链路,三层同时生效才有意义。
另一类容易被忽视的风险是 Samba 与其他服务的组合暴露。文件服务器往往同时运行 Web 控制面板、备份代理、数据库,共享目录又恰好是这些服务的输入目录。此时共享盘的写权限会直接转化为其他服务的攻击入口——攻击者上传一个配置文件即可改变备份任务的目标路径,或投放一个计划任务脚本实现持久化。因此共享加固必须同步梳理「谁在消费这些文件」,把所有消费方纳入白名单评估范围。
操作步骤
第一步:现状审计
先留档再改,出问题可快速回滚。
cp /etc/samba/smb.conf /etc/samba/smb.conf.bak.$(date +%F)
testparm -s # 输出生效配置
smbstatus -b # 当前会话
nmap -Pn -p445 --script smb-protocols,smb-security-mode,smb-enum-shares 192.168.1.20
若 smb-protocols 输出中出现 NT LM 0.12,说明 SMBv1 仍开启。
第二步:禁用 SMBv1 并强制 SMB3
编辑 /etc/samba/smb.conf,在 [global] 段首部加入:
[global]
server min protocol = SMB3
server max protocol = SMB3_11
client min protocol = SMB3
ntlm auth = ntlmv2-only
server smb encrypt = required
server signing = mandatory
smb ports = 445
disable netbios = yes
关键参数说明:server min protocol = SMB3 直接切断 SMBv1/v2;ntlm auth = ntlmv2-only 禁用 NTLMv1 响应;server smb encrypt = required 要求全量加密,未支持的客户端会被拒绝而非降级。
第三步:关闭匿名与来宾访问
map to guest = never
restrict anonymous = 2
guest ok = no
null passwords = no
usershare allow guests = no
map to guest = never 让认证失败直接断开,避免回落到 guest 身份读取共享。
第四步:共享级访问控制
以部门盘为例,[global] 之后追加:
[finance]
comment = Finance Share
path = /srv/samba/finance
browseable = no
valid users = @finance-group
write list = @finance-group
read only = yes
create mask = 0640
directory mask = 0750
force group = finance-group
hosts allow = 192.168.1.0/24 10.10.0.0/16
hosts deny = 0.0.0.0/0
veto files = /*.exe/*.scr/*.bat/*.vbs/*.js/*.hta/
delete veto files = yes
要点:valid users 限定身份,hosts allow/deny 限定来源网段,veto files 阻止通过共享盘分发可执行文件——这是阻断勒索软件在共享盘内横向投放的直接手段。
第五步:文件系统权限收紧
chown -R root:finance-group /srv/samba/finance
chmod -R 0750 /srv/samba/finance
mount -o remount,nodev,nosuid,noexec /srv/samba
noexec 与 nosuid 挂载选项可防止攻击者把共享盘当作落地执行目录。
第六步:连接限制与操作审计
max connections = 200
deadtime = 15
log level = 1 auth:3
log file = /var/log/samba/log.%m
max log size = 5000
vfs objects = full_audit
full_audit:prefix = %u|%I|%m|%S
full_audit:success = connect disconnect openat unlinkat renameat
full_audit:failure = connect
full_audit:facility = local7
full_audit:priority = notice
deadtime = 15 回收空闲连接,配合 max connections 抑制连接耗尽类攻击;full_audit 记录谁在什么时间对哪个共享做了删除或重命名。
第七步:防火墙收敛暴露面
# firewalld
firewall-cmd --permanent --zone=internal --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=445 protocol=tcp accept'
firewall-cmd --permanent --remove-service=samba
firewall-cmd --reload
# ufw
ufw allow from 192.168.1.0/24 to any port 445 proto tcp
ufw deny 445/tcp
只放行内网授信网段,公网与办公无线网段一律拒绝。检查无误后重启服务:
testparm -s
systemctl restart smbd nmbd
systemctl enable smbd
配置验证
nmap -Pn -p445 --script smb-protocols 192.168.1.20
# 期望:只输出 3.1.1 / 3.0.2,不再出现 NT LM 0.12
smbclient -N -L //192.168.1.20
# 期望:NT_STATUS_ACCESS_DENIED,匿名无法枚举共享
smbclient -U finance01%密码 //192.168.1.20/finance -c 'ls'
# 期望:授权账号可列出目录
smbstatus --locks
grep -i 'anonymous\|guest' /var/log/samba/log.* | tail -20
加密验证可在客户端抓包确认:tcpdump -i eth0 -A port 445 | grep -i 'password\|finance',不应出现明文路径或文件名。
常见问题
Q1:开启 SMB3 与强制加密后,老终端和扫描一体机连不上怎么办?
先确认客户端版本:Windows 7 与部分 2012 年前的一体机不支持 SMB3 加密。两种处理方式:一是终端升级(Win10 1809+ 原生支持 SMB3.1.1),二是在 Samba 侧为该共享单独放行,用 server smb encrypt = enabled 代替 required,即支持加密的客户端加密、不支持的降级为签名。降级方案会削弱强度,建议同时用 hosts allow 把该终端限制在单一网段,并列入淘汰计划。
Q2:加固后授权账号仍报「权限被拒绝」如何排查?
按以下顺序定位:
testparm -s | grep -A20 finance确认配置真正生效,避免改错段落。id finance01确认该账号已加入 finance-group,组名需与 valid users 中的 @ 前缀一致。getfacl /srv/samba/finance检查 POSIX ACL 是否存在显式拒绝项。- SELinux 环境需恢复上下文:
semanage fcontext -a -t samba_share_t "/srv/samba/finance(/.*)?" && restorecon -Rv /srv/samba/finance。 - 查看
/var/log/samba/log.smbd中的 NT_STATUS_ACCESS_DENIED 前后行,可定位到具体是共享级还是文件系统级拒绝。
Q3:SMB 445 端口被运营商封锁,远程办公无法访问共享怎么办?
不要把共享直接映射到公网。正确做法是通过 VPN 或零信任网关进入内网后再访问 SMB,或在文件服务器前置反向代理并启用 TLS。直接在公网开放 445 会在一周内收到大规模暴力探测。
Q4:如何判断共享盘已经遭到勒索软件加密?
共享盘被批量加密时有三个可观测特征,建议纳入监控:一是短时间内大量 unlinkat 与 renameat 操作集中在同一用户名下,full_audit 日志中会表现为同一 IP、同一账号的爆发式记录;二是目录中突然出现大量统一后缀文件(如 .locked、.enc),用 find /srv/samba -type f -newermt '-10 minutes' | wc -l 可快速量化;三是共享盘写入带宽在数分钟内飙升,配合 smbstatus 查看单会话吞吐即可定位来源主机。发现后应立即断开该主机的 SMB 访问(smbcontrol smbd close-share 或直接在防火墙封堵其 IP),再断网取证,切勿先重启服务器——重启会丢失内存中的会话与进程信息,使溯源难度大幅上升。
总结
Samba 加固的核心是四件事:砍掉 SMBv1、禁用匿名映射、共享级白名单控制、强制加密与审计。按本文步骤执行后,内网可达性从「任意主机匿名枚举」收敛为「授信网段 + 授信账号 + 授权组」,并且所有删除与重命名操作留有审计记录。建议同时把 445 端口的内网监听纳入日常巡检,出现非预期来源的连接立即告警。