简介这份资源聚焦 Linux 环境下 Samba 共享目录的多用户权限配置面向需要打通 Linux 与 Windows 文件共享的运维人员、系统管理员及有一定 Linux 基础的进阶学习者。内容围绕用户与组管理、smb.conf 全局与共享段配置、目录属主与权限掩码设置、服务重启与客户端访问测试以及防火墙端口限制、密码加密等安全优化展开帮助读者解决不同角色用户按需访问特定共享目录的权限隔离问题。资源包共 1 个 doc 文档约 5.03MB以图文与配置示例形式呈现便于对照实操。目前已有 4514 人学习下载适合希望快速掌握 Samba 多用户权限控制、搭建安全灵活文件共享环境的读者参考借鉴。1. 从一次“全员可写”事故说起Samba 多用户权限到底难在哪某公司内部一台文件服务器跑的是 Samba共享目录挂给设计、财务、行政三个组用。最初图省事[share]段里直接写了writable yes、guest ok yes结果上线第三天行政组同事误删了设计组的源文件回收站里还找不回来。事后复盘问题不在 Samba 本身而在于共享级权限、目录级权限、用户级权限三层没有对齐。Samba 共享目录的多用户权限设置本质是让 Linux 文件系统权限owner/group/mode/ACL和 Samba 配置valid users、write list、force group、create mask形成一套一致的规则。它解决的是“同一目录下不同用户能看什么、能写什么、新建文件归谁”的问题。适合谁适合手里有一台 Linux 文件服务器、需要给多个部门或项目组分目录、又不想上域控的中小团队运维。下面这套方案是我在几台生产机上反复调过的版本参数可以直接抄。2. 先把权限模型立住Linux 侧和 Samba 侧怎么分工2.1 三层权限的职责边界很多人配 Samba 权限翻车是因为把三层混在一起改。我一般按这个顺序拆层级作用对象决定什么配置位置文件系统层目录/文件谁能进目录、谁能读写chmod、chown、setfaclSamba 共享层共享名哪些用户能连、能否写smb.conf的valid users、write listSamba 行为层新建文件新文件属主、权限位force user、force group、create mask关键原则Samba 层只做“准入”文件系统层做“最终裁决”。也就是说一个用户即使通过了valid users如果 Linux 目录权限不给他写他照样写不进去。反过来Linux 给了写权限但smb.conf里read only yes他也写不了。两层必须同时放行。2.2 用户和组的规划方式不要用系统自带用户直接堆。常见做法是建专用组再建用户挂进去# 建三个业务组 groupadd design groupadd finance groupadd admin # 建用户并指定主组-M 不建家目录-s 禁止登录 shell useradd -M -s /sbin/nologin -G design alice useradd -M -s /sbin/nologin -G finance bob useradd -M -s /sbin/nologin -G admin carol # 设置 Samba 密码和系统密码分离 smbpasswd -a alice smbpasswd -a bob smbpasswd -a carol逻辑说明-G把用户加入附加组这样后续可以用组来批量授权。smbpasswd -a是必须的Samba 有自己的密码库光有系统用户连不上。参数上-M避免生成无用家目录-s /sbin/nologin防止有人拿这些账号直接 SSH 登录减少攻击面。2.3 目录结构和初始权限假设共享根目录是/srv/samba下面按组分子目录mkdir -p /srv/samba/design /srv/samba/finance /srv/samba/public # 属主给 root属组给对应业务组 chown root:design /srv/samba/design chown root:finance /srv/samba/finance chown root:admin /srv/samba/public # 目录权限属主读写执行属组读写执行其他人无权限 chmod 2770 /srv/samba/design chmod 2770 /srv/samba/finance chmod 2775 /srv/samba/public这里2770前面的2是SGID 位作用是在这个目录里新建的文件和子目录属组自动继承父目录的组而不是创建者的主组。没有这个位alice 在 design 目录里建的文件属组会变成 alice 的主组同组其他人就可能读不到。这是最容易被忽略的一个参数。3. 写 smb.conf共享段里每个参数到底管什么3.1 全局段的最小配置先看全局段只保留必要项[global] workgroup WORKGROUP server string File Server security user map to guest never log file /var/log/samba/log.%m max log size 1000 logging file panic action /usr/share/samba/panic-action %dsecurity user表示用本地用户库认证适合没有域控的环境。map to guest never很关键它拒绝任何认证失败的连接以 guest 身份进入避免匿名访问。log file里的%m是按客户端机器名分日志排错时能快速定位是哪台机器出的问题。3.2 按组隔离的共享段写法下面以 design 共享为例finance 和 public 照抄改名字[design] path /srv/samba/design valid users design write list design read only no browseable yes create mask 0660 directory mask 2770 force group design inherit permissions yes逐项说明valid users design只有 design 组成员能连接这个共享表示组。write list design组内成员可写。如果只想让部分人写可以写write list alice。read only no共享级放开写但最终还要看文件系统权限。create mask 0660新建文件权限为 rw-rw----同组可读写其他人无权限。directory mask 2770新建目录带 SGID保证组继承。force group design强制新建文件属组为 design和 SGID 双保险。inherit permissions yes新文件继承父目录权限减少手动 chmod。注意force group和 SGID 同时用不冲突但如果你用了force user所有操作都会以那个用户身份执行审计日志里就看不到真实操作人了。除非是公共只读目录否则我不建议开force user。3.3 公共只读目录的写法public 目录给所有人看但只有 admin 组能写[public] path /srv/samba/public valid users design, finance, admin read only yes write list admin browseable yes create mask 0644 directory mask 0755read only yes配合write list admin效果是所有人可读只有 admin 组可写。这种组合比read only no加一堆 deny 更清晰排错时一眼能看懂意图。改完配置后用testparm检查语法再systemctl reload smbd。不要直接 restartreload 不会断开已有连接。4. 用 ACL 做细粒度授权同一目录里让两个人写、其他人只读4.1 什么时候必须上 ACL标准 mode 位只有 owner/group/other 三档遇到“design 目录里alice 和 bob 可写其他 design 组成员只读”这种需求mode 位就不够了。这时候用 POSIX ACL。先确认文件系统挂载时开了 acl 选项mount | grep /srv # 如果输出里没有 acl需要在 /etc/fstab 对应行加上 acl 再 remount4.2 setfacl 的具体命令# 给 alice 和 bob 在 design 目录上的读写执行权限 setfacl -m u:alice:rwx /srv/samba/design setfacl -m u:bob:rwx /srv/samba/design # 设置默认 ACL让目录里新建的文件自动继承 setfacl -d -m u:alice:rwx /srv/samba/design setfacl -d -m u:bob:rwx /srv/samba/design # 查看结果 getfacl /srv/samba/design-m是修改-d是设置默认 ACL只对目录有效影响新建内容。u:alice:rwx表示给用户 alice 赋 rwx。执行后ls -l会看到权限位后面多一个表示有扩展 ACL。4.3 ACL 和 Samba 的配合坑ACL 生效的前提是 Samba 没有把权限压平。检查smb.conf里有没有nt acl support no默认是 yes不要关。另外create mask如果设成0600会盖掉 ACL 的继承效果因为 mask 是上限。我一般把create mask设成0660或0770给 ACL 留空间。验证方法用 alice 账号通过smbclient连上去建文件然后在服务器上看getfacl结果确认属组和 ACL 条目都对。5. 避坑与排查五个我真实踩过的坑5.1 现象用户能登录但看不到共享原因browseable no或者用户不在valid users里。Samba 对未授权共享默认隐藏不是报错。解决先用smbclient -L localhost -U alice列出可见共享再对照testparm -s输出的valid users逐项核对。注意组名前必须带写成design会被当成用户名。5.2 现象能读不能写日志报 Permission denied原因九成是文件系统层没放行。Samba 的write list只做准入真正写盘时内核还要查 mode 和 ACL。解决切到目标用户身份测试sudo -u alice touch /srv/samba/design/test.txt。如果这条命令失败问题就在 Linux 权限跟 Samba 无关。重点查目录的属组、SGID 位、以及父目录每一级的执行权限x 位。5.3 现象新建文件同组人打不开原因缺少 SGID 或force group新文件属组变成了创建者的主组。解决chmod gs给目录加 SGID并在共享段加force group 对应组。改完后已存在的文件不会自动修正需要chgrp -R批量改一次。5.4 现象Windows 客户端提示“多重连接到一个服务器”原因同一客户端用不同账号连了同一台 Samba 的多个共享Windows 不允许。解决要么统一用一个账号要么在smb.conf全局段加map to guest never之外再确认没有guest ok yes的共享被匿名挂载。彻底办法是让用户注销后重新用单一账号连接。5.5 现象改了 smb.conf 不生效原因只改了文件没 reload或者testparm报错但被忽略。解决养成习惯改完先testparm看到 “Loaded services file OK” 再systemctl reload smbd。如果 reload 后仍不生效检查是否有多个 smb.conf 路径testparm -s会打印实际加载的文件。6. 验证与进阶用 smbclient 做回归测试把权限写进检查脚本配完不是结束得有一套可重复的验证方法。我习惯用smbclient模拟每个角色的读写行为把结果固化成脚本每次改配置后跑一遍。#!/bin/bash # 权限回归测试验证各角色对共享的实际读写能力 # 用法./smb_test.sh 共享名 用户 密码 期望:rw|ro SHARE$1 USER$2 PASS$3 EXPECT$4 # 尝试在共享里建文件 RESULT$(smbclient //localhost/$SHARE -U $USER%$PASS \ -c put /etc/hostname test_$$.txt; rm test_$$.txt 21) if echo $RESULT | grep -q NT_STATUS_ACCESS_DENIED; then ACTUALro else ACTUALrw fi if [ $ACTUAL $EXPECT ]; then echo PASS: $USER on $SHARE - $ACTUAL else echo FAIL: $USER on $SHARE - 期望 $EXPECT 实际 $ACTUAL fi逻辑说明smbclient的-c参数可以执行一串命令put上传再rm删除能同时验证写和删。NT_STATUS_ACCESS_DENIED是权限拒绝的标准返回。参数上%分隔用户名和密码避免交互输入。这个脚本可以放进 CI 或者 cron每次配置变更后自动跑。进阶技巧如果团队规模再大一点建议把valid users和write list里的组名统一维护在一个变量文件里用脚本生成 smb.conf 片段避免手改漏改。另外log level 2在排错时很有用但平时别开太高日志量会拖慢性能。我一般排错时临时调到 3定位完立刻改回 1。最后说个血泪经验权限配置改完一定要用真实用户身份验证不要用 root 测。root 能写不代表普通用户能写这个坑我踩过不止一次。每次动 smb.conf 之前先备份改完跑一遍上面的回归脚本比事后救火省心得多。希望帮到你。本文还有配套的精品资源点击获取