Samba的valid users仅控制登录认证,不控制子目录访问权限,真正起作用的是Linux文件系统权限与Samba认证的双重叠加,必须通过独立系统组、正确用户归属及目录chmod/setgid/setfacl精确映射权限层级。

为什么直接用 smb.conf 的 valid users 做多级权限会失效
因为 Samba 的用户级权限(security = user)只控制“能否登录”,不控制“能访问哪个子目录”。哪怕你给不同用户配了不同 valid users,只要他们属于同一共享([work]),底层 Linux 文件系统权限没对齐,实际访问时就会互相穿透或被拒——常见现象是 A 用户能删 B 用户上传的文件,或 B 用户进不去自己有权限的子目录。
真正起作用的是两层叠加:Samba 认证只是第一道门,Linux 的 uid/gid 和目录 chmod 才决定具体读写行为。所以必须让每个权限层级对应一个独立的 Linux 组,并确保 Samba 用户归属正确。
- 每个“权限级别”(如管理员、编辑员、只读员)建一个系统组:
groupadd work_admin、groupadd work_editor、groupadd work_reader - Samba 用户必须用
smbpasswd -a添加,且其 Linux 用户主组要设为对应业务组(例如usermod -g work_admin alice) - 共享配置里禁用
force group或force user,否则会绕过组权限继承
如何用 path + force group 实现“同一共享名下的多级子目录权限”
不推荐为每个权限级别单独开一个 [share] 段——客户端映射麻烦,且 Windows 资源管理器里会显示多个盘符。更实用的做法是:共享根路径统一,靠子目录自身权限 + Samba 的 force group 控制写入身份。
例如共享 /srv/work,结构如下:
/srv/work/ ├── admin/ # 仅 work_admin 可写 ├── edit/ # work_admin + work_editor 可写 └── view/ # 所有组可读,但只允许 work_reader 写日志
关键配置片段:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
[work] path = /srv/work browseable = yes read only = no create mask = 0660 directory mask = 0770 # 不设 valid users,靠 Linux 权限兜底
-
admin/目录:chgrp work_admin admin/ && chmod 2770 admin/(2 表示 setgid,新文件自动继承组) -
edit/目录:chgrp work_editor edit/ && chmod 2775 edit/ && setfacl -m g:work_admin:rwx edit/(允许多组协作) -
view/目录:chmod 2755 view/ && setfacl -m g:work_reader:rwx view/,再用setfacl -d设默认 ACL
invalid users 和 read list/write list 的真实作用边界
这些参数不是“权限开关”,而是“覆盖式白名单/黑名单”。它们只在 Samba 层面做访问拦截,不改变文件系统权限。一旦用户通过认证,后续操作是否成功,完全取决于该用户的 Linux uid/gid 是否满足目标文件的 stat() 检查结果。
-
read list = @work_reader:只保证该组用户能列出目录内容,但若view/目录本身对work_reader是rx,则没问题;若误设成---,照样进不去 -
write list = @work_admin:只限制“是否允许写操作请求”,但若admin/目录属组不是work_admin或权限不含w,仍会报Permission denied -
invalid users = root这类配置,本质是防止高危账号走 Samba 登录,和业务权限无关
Windows 客户端连不上?先查 testparm 和 getent group
常见错误不是配置写错,而是 Linux 系统层没同步。Samba 启动时读取的是 /etc/group 快照,如果用 groupadd 新增组后没重启 smbd,或者用户没用 usermod -aG 加入组(只改了 /etc/group),Windows 就会提示 The specified network password is not correct 或 Access is denied。
- 运行
testparm -s确认配置语法无误,且没有隐式覆盖(比如全局read only = yes覆盖了局部read only = no) - 用
getent group work_editor查看组成员是否实时生效(输出应含用户名) - 检查 SELinux:若启用,需运行
setsebool -P samba_export_all_rw on,否则即使权限全开也会被拦 - Windows 端缓存凭据:用
cmd运行net use * /del清掉旧连接,再重新net use Z: \serverwork /user:alice
多级权限的核心不在 Samba 配置多复杂,而在 Linux 组与目录权限的映射是否严格一一对应。少一个 setgid 位,或漏一条 setfacl -d,就可能让某一级权限失效,而且问题往往只在特定操作路径下暴露。










