Samba 文件共享加固实战:SMB 服务安全配置

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 usershosts allow,任何域用户或来宾均可访问全部共享。
  • 传输加密缺失:不开启 smb encrypt 时凭据协商与文件内容在网段内明文可嗅探。

把上述四点串起来看,就是一条完整的入侵链:攻击者控制的办公终端先做一次匿名枚举,拿到共享列表与目录结构,再从中寻找 backup、数据库导出、运维脚本等高价值路径,随后把勒索程序写入可写共享目录,等待其他终端或定时任务执行。整条链路不需要任何漏洞利用,只依赖配置缺陷就能完成。加固的目的就是在枚举、写入、执行三个环节各设一道闸门:匿名枚举被 map to guest = never 掐断,写入被 read onlyveto 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

noexecnosuid 挂载选项可防止攻击者把共享盘当作落地执行目录。

第六步:连接限制与操作审计

   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:如何判断共享盘已经遭到勒索软件加密?

共享盘被批量加密时有三个可观测特征,建议纳入监控:一是短时间内大量 unlinkatrenameat 操作集中在同一用户名下,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 端口的内网监听纳入日常巡检,出现非预期来源的连接立即告警。