简介:这份文档面向需要在Linux环境下实现跨平台文件共享的运维人员与系统管理员,聚焦Samba共享目录的多用户权限控制这一常见难点。内容围绕用户与组的创建、smb.conf全局与共享段配置、valid users访问限制、目录属主与770权限划分、服务重启与Windows客户端验证等环节展开,并补充防火墙端口限制、密码加密与安全更新等优化建议,适合具备一定Linux基础、希望理清多用户隔离思路的读者参考。资源包共1个doc文件,约5.03MB,以图文文档形式完整记录配置案例与命令示例,便于对照实践。目前已有4521人学习,可作为搭建安全灵活共享环境的实操参照。
1. Samba 多用户共享目录:从装包到权限跑通的一次完整记录
上周帮某实验室把一台旧文件服务器重新拉起来,需求很朴素:一台 Linux 机器开 Samba 共享,Windows 客户端能访问,但不同的人只能看自己该看的那部分目录。听起来像入门题,实际动手才发现坑全在权限上——装包五分钟,配权限两小时。smb.conf里一个valid users写错,要么全员被挡在门外,要么所有人能翻别人的目录,前者是配置问题,后者是事故。这篇记录按我实际走的顺序写:先确认系统和 Samba 版本,再建用户组、写共享段、落目录权限,最后用testparm和客户端实测验证。适合刚接手文件共享、或者被 Samba 权限绕晕的开发者照着复现,熟手可以重点看版本差异和排查那几节。
2. 装前把环境列清:发行版、Samba 版本与目录规划
2.1 系统与 Samba 版本怎么选
Samba 的配置语法在 4.x 系列里基本稳定,但不同发行版打包的版本差异会直接影响你踩不踩坑。Debian/Ubuntu 系常见的是 4.13 到 4.19 之间的版本,CentOS/RHEL 7 自带 4.10 左右,RHEL 8/9 和较新的 Ubuntu 则普遍在 4.15 以上。我一般先跑一条命令确认底牌,再决定后面怎么写配置:
# 查看发行版与 Samba 版本,两个信息都要记下来 cat /etc/os-release | grep -E "^(NAME|VERSION)=" smbd --versionsmbd --version输出形如Version 4.15.13-Ubuntu,前半段是 Samba 版本,后半段是打包标识。为什么要看这个:4.11 之后smb.conf里部分旧参数(比如某些security取值组合)行为有调整,而map to guest这类参数在不同版本下的默认值也不完全一致。如果你照着网上老教程抄,版本对不上就会出现「配置没报错但行为不对」的玄学现象。我的习惯是:新装环境优先用发行版仓库里的稳定版,不追最新源码编译,除非有明确的功能需求。
2.2 目录结构先规划再动手
权限配不明白,十有八九是目录结构一开始就没想清楚。这次的需求是「一个公共共享根目录,下面按用户分私有子目录」,所以我在装包之前就把路径定死:
| 路径 | 用途 | 属主:属组 | 权限 |
|---|---|---|---|
/srv/share | 共享根目录 | root:users | 2770 |
/srv/share/user1 | 用户1私有目录 | user1:users | 2770 |
/srv/share/user2 | 用户2私有目录 | user2:users | 2770 |
这里有个关键取舍:根目录用2770而不是0770,开头的2是 setgid 位,作用是让这个目录下新建的文件和子目录自动继承父目录的属组users。没有它,用户 A 建的文件属组会变成 A 的私有组,用户 B 就算在users组里也读不了,后面还得手动chgrp补救。这个位我每次都会加,属于血泪经验。
2.3 安装 Samba 与依赖
确认环境后装包。Debian/Ubuntu 和 RHEL 系命令不同,但装的东西一样:samba主包加上客户端工具,方便本机自测。
# Debian/Ubuntu sudo apt-get update sudo apt-get install -y samba samba-common-bin smbclient # CentOS/RHEL sudo yum install -y samba samba-clientsamba-common-bin提供testparm和smbpasswd,smbclient用来在服务器本机模拟客户端访问,排错时非常有用——不用每次都跑到 Windows 那边试。装完先别急着改配置,跑一次systemctl status smbd确认服务能起来,起不来说明包或依赖有问题,先解决这个再往下走。
3. 用户、组与 Samba 密码库:三套身份别搞混
3.1 建 Linux 组和用户
Samba 的用户体系建立在 Linux 用户之上,但多了一层自己的密码库。先把系统层的组和用户建好:
# 建共享组 sudo groupadd users # 建用户并加入 users 组,-M 不建家目录(共享场景用不到),-s 指定不可登录 shell sudo useradd -M -s /sbin/nologin -G users user1 sudo useradd -M -s /sbin/nologin -G users user2 # 确认组成员 getent group users-M和-s /sbin/nologin是共享账号的常见做法:这些用户只用来做 Samba 认证,不需要登录系统,关掉 shell 能少一个攻击面。getent group users的输出应该能看到user1,user2都在组里,这一步没确认就往下走,后面valid users = @users不生效时你会怀疑人生。
3.2 设置 Samba 密码
Linux 密码和 Samba 密码是两套东西,useradd建完用户后 Samba 那边还是空的,必须单独设:
# 为每个 Samba 用户设置独立密码,会提示输入两次 sudo smbpasswd -a user1 sudo smbpasswd -a user2 # 查看已加入 Samba 的用户列表 sudo pdbedit -Lsmbpasswd -a的-a表示新增,如果用户已存在则是改密码。pdbedit -L列出的是 Samba 密码库里的账号,输出里能看到user1:1001:这样的行,说明账号已就绪。常见翻车点:只设了 Linux 密码没设 Samba 密码,客户端连接时一直弹认证框,日志里是NT_STATUS_LOGON_FAILURE,很多人会去查smb.conf,其实问题在密码库。
3.3 目录权限落地
用户和密码齐了,把 2.2 里规划的目录建出来并落权限:
# 建共享根目录和用户子目录 sudo mkdir -p /srv/share/user1 /srv/share/user2 # 根目录属主 root、属组 users,2770 带 setgid sudo chown root:users /srv/share sudo chmod 2770 /srv/share # 子目录归属各自用户,属组统一 users sudo chown -R user1:users /srv/share/user1 sudo chown -R user2:users /srv/share/user2 sudo chmod -R 2770 /srv/share/user1 /srv/share/user2chmod 2770里的2前面说过是 setgid,770表示属主和属组可读写执行、其他人无权限。这里要注意顺序:先chown再chmod,反过来的话chown -R可能把权限位重置掉。落完用ls -ld /srv/share /srv/share/user1看一眼,输出里权限位应该是drwxrws---,那个s就是 setgid 生效的标志。
4. 写 smb.conf:全局段与共享段的参数取舍
4.1 全局段:认证方式与日志
配置文件在/etc/samba/smb.conf,改之前先备份,这是后悔药:
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak.$(date +%F)全局段我保留发行版默认的大部分内容,只确认和调整这几项:
[global] workgroup = WORKGROUP server string = Samba Server %v netbios name = SAMBA_SERVER security = user map to guest = Bad User log file = /var/log/samba/log.%m max log size = 1000 log level = 1逐项说取舍:security = user是本地用户认证模式,多用户权限场景基本都用这个;map to guest = Bad User表示认证失败的用户按 guest 处理,配合共享段里的public = no和valid users,实际效果是未授权用户直接被拒,不会匿名混进来;log file = /var/log/samba/log.%m里的%m是客户端主机名,每个客户端一个日志文件,排错时能直接定位是哪台机器出的问题;log level = 1是常规信息,排查认证问题时临时调到3,看完记得调回来,不然日志涨得飞快。
4.2 共享段:valid users 与掩码
共享段是权限控制的核心,写法如下:
[shared_folder] path = /srv/share public = no browseable = yes writable = yes valid users = @users create mask = 0770 directory mask = 0770 force group = usersvalid users = @users里的@表示组,只有users组成员能访问这个共享,这是第一道门。create mask和directory mask控制新建文件和目录的权限上限,设成0770保证同组可读写、其他人无权限。force group = users让所有经 Samba 创建的文件属组强制为users,和前面目录的 setgid 形成双保险——setgid 管 Linux 本地操作,force group管 Samba 写入,两个都配上,属组基本不会跑偏。
提示:
writable = yes只表示共享可写,最终能不能写还取决于文件系统权限。两层都要对,缺一层就是「能连上但存不了文件」。
4.3 用 testparm 校验再重启
改完配置不要直接重启,先让testparm过一遍:
# 校验语法,-s 只输出非默认配置项,便于核对 sudo testparm -s输出里会列出你实际生效的配置,重点看[shared_folder]段下valid users、path、create mask是否和你写的一致。如果这里报Unknown parameter,说明参数名拼错或当前版本不支持,按提示改。校验通过再重启服务:
# 新系统用 systemctl,两个服务都要重启 sudo systemctl restart smbd sudo systemctl enable smbd # 老系统(无 systemd)用 service sudo service smb restart注意原文里写的systemctl restart smbd.nmbd是笔误,smbd和nmbd是两个独立服务,要分开写。nmbd负责 NetBIOS 名称解析,纯 IP 访问的场景可以不启,但 Windows 网络邻居里要看到主机名就得启它。
5. 避坑与排查:五条实际踩过的记录
5.1 能连上但看不到共享目录
现象:Windows 输入\\服务器IP能弹出认证框,认证也过了,但里面空空如也。原因通常是browseable被设成no,或者共享段名和访问路径对不上。解决:确认共享段里browseable = yes,并且客户端访问的路径名和[shared_folder]里的段名完全一致,大小写敏感。
5.2 认证一直失败,日志报 LOGON_FAILURE
现象:密码明明输对了,还是反复弹框。原因:只设了 Linux 密码,没跑smbpasswd -a,Samba 密码库是空的。解决:sudo pdbedit -L看账号在不在,不在就补设;在的话用smbpasswd -a user1重设一次,注意 Samba 密码和 Linux 密码可以不同。
5.3 同组用户互相读不了对方的文件
现象:user1建的文件,user2打开提示权限不足。原因:目录没开 setgid,新建文件属组变成了user1的私有组。解决:sudo chmod 2770 /srv/share补上 setgid,已有文件用sudo chgrp -R users /srv/share批量修正属组。
5.4 写入报「只读文件系统」或权限拒绝
现象:能进目录,新建文件失败。原因:SELinux 或文件系统权限拦截。RHEL 系先看getenforce,如果是Enforcing,用sudo setsebool -P samba_export_all_rw on放行,或者给目录打上samba_share_t标签。Debian 系一般没这个问题,重点查目录权限位是不是漏了组写权限。
5.5 改了配置不生效
现象:smb.conf改完重启了,行为还是旧的。原因:改错了文件(比如改的是smb.conf.bak),或者服务没真正重启。解决:testparm -s看生效配置里有没有你的改动,没有就是文件改错了;有的话systemctl status smbd看服务状态,必要时systemctl restart smbd再来一次。
6. 装完怎么验证:从本机 smbclient 到客户端实测
验证分三层,从内到外,哪层断了就停在哪层查。第一层是配置层,sudo testparm -s无报错、输出里参数正确,这层过了说明语法没问题。第二层是本机模拟客户端,用smbclient直接连自己:
# 以 user1 身份连接共享,-U 指定用户,回车后输 Samba 密码 smbclient //127.0.0.1/shared_folder -U user1 # 进入 smb: \> 提示符后,测试列目录和写文件 smb: \> ls smb: \> put /etc/hostname test_upload.txt smb: \> lsput成功说明认证、共享权限、文件系统权限三层都通了。再用user2重复一次,确认user2也能写自己的目录。第三层是跨用户隔离验证:用user1尝试进user2的目录,预期是被拒。这一步在smbclient里cd user2会报NT_STATUS_ACCESS_DENIED,报错才是对的,不报错说明隔离没做到位,回头查目录权限位。
最后到 Windows 客户端实测:资源管理器输入\\服务器IP\shared_folder,用user1认证,能进、能建文件、能看到user1目录;换user2认证,进不去user1目录。两边都符合预期,这套环境才算真正跑通。我一般还会在服务器上tail -f /var/log/samba/log.<客户端主机名>盯着日志做一遍,认证成功、文件创建这些事件在日志里都有记录,比只看客户端界面踏实。
从那以后我每次配 Samba 都强制走一遍「testparm 校验 → smbclient 本机自测 → 跨用户隔离验证」这三步,少一步都可能在上线后才发现权限漏了。希望帮到你。
本文还有配套的精品资源,点击获取