跳转到内容

常见权限方案 ​

这一篇把前面几篇的内容落到五个常见场景里:家庭的公共区和个人区、只读媒体库、访客共享、给容器用的目录、小团队的部门目录。每个方案告诉你建什么、怎么授权、限制落在哪一层。

先读完前提

读之前先弄懂 三层权限。下面的方案是按 OMV 的源码和官方文档推演出来的,还没有在真实设备上逐一验证,动手前请先用测试共享文件夹演练。

通用顺序都是:先 建用户和用户组,再 建共享文件夹,再 添加 SMB 共享,最后授权。每次改完设置,都要点击页面顶部黄色提示条上的 应用(Apply)才会生效。

方案一:家庭,公共区加个人区 ​

目标:全家共用的 family 可读写,每个人另有一个私人目录。

公共区:

  1. 用户 alice、bob、kid1 都在 users 组(界面创建的用户默认如此)。
  2. 共享文件夹 family 用默认权限 775,添加 SMB 共享,公开 选「否」,只读 不勾。
  3. 不设任何共享权限。没有条目时,所有已认证用户都能连上,并按文件系统权限读写。

个人区,有两种做法:

  • 用户主目录:每人一个同名共享,只有本人能进,见 用户主目录。人多、想省事时选它。
  • 每人一个共享文件夹:例如 alice,权限选 770,添加 SMB 共享,在共享权限里只给 alice 读/写。这样 valid users 里只有 alice,别人连不上。

第二种只在 SMB 层挡人。bob 和 alice 同在 users 组,用 SFTP 或 NFS 仍能走进 alice 的目录。家里一般可以接受;要在文件系统层也真正隔开:

  1. 建一个专用组 alice-only,成员只有 alice。
  2. 打开 alice 共享文件夹的 ACL 对话框,把 用户组 改成 alice-only,权限「读/写/执行」,其它 选「无」,保存。
  3. 此后 users 组的其他人在文件系统层就进不去了。只要目录的 setgid 位还在(默认的 2775 带着它),新建的文件也会继承 alice-only 这个组,保存后可以用 ls -ld 确认。

方案二:只读媒体库 ​

目标:全家只能看、只有一个人(uploader)能往里放。给容器(Jellyfin 之类)读也要方便。

做法 A:只靠共享权限,只对 SMB 有效。

  1. 建一个只读组 media-readers,成员是需要观看的人,不包含 uploader。
  2. 共享文件夹 media 用默认 775,添加 SMB 共享,公开 选「否」,不勾 只读。
  3. 共享权限:media-readers 设为「只读」,uploader 设为「读/写」。同一个人别同时出现在两个条目里,免得结果难以预料。

文件系统层 users 组仍然可写,所以 NFS、SFTP、容器都不受这个限制,只是 SMB 层不让读者写。

做法 B(推荐):落在文件系统层,对所有协议都生效。

  1. 共享文件夹 media 权限选 755。
  2. 打开 ACL 对话框:所有者 改成 uploader,权限「读/写/执行」;用户组 保持 users,权限改成「读/执行」;其它 设成「读/执行」或「无」。目录里已有大量文件时不要勾 递归,先只改目录本身。
  3. 在这个 SMB 共享上勾选 继承权限(Inherit permissions)。OMV 默认让 SMB 新建的文件是 664、目录是 775,组成员可写;继承权限让新内容跟随上级目录的权限,不会变成组可写。
  4. 容器以「其它」或 users 组的身份读,权限够了;挂载时再加只读标记(:ro),多一层保险。

这样只有 uploader 在任何协议下能写,其他人和容器都只读。

方案三:访客只读 ​

目标:来家里的朋友或电视盒,不输入密码就能看一个目录。

  1. 共享文件夹 public 权限选 755 或 775,保证「其它」有读权限。SMB 访客对应系统用户 nobody,属于「其它」。
  2. 添加 SMB 共享:公开 选「允许访客」,勾选 只读。
  3. 里面只放不敏感的内容。

访客共享无需密码,也不是所有 Windows 都能连

  • 影响范围:任何能连到你局域网的设备,都能读取这个共享。「允许访客」时共享权限不再限制谁能连。
  • Windows 兼容性:按微软的说明,Windows 10 1709 起,企业版、教育版和专业工作站版默认不允许 SMB2 和 SMB3 的访客登录,Windows 11 专业版的新构建(25267 之后)也是如此;Windows 11 24H2 起默认要求 SMB 签名,而访客连接不支持签名。这些客户端会连不上。
  • 前置条件:确认共享里没有敏感数据;确认只是局域网内使用,不要把 445 端口映射到公网。
  • 回退:把 公开 改回「否」并应用。
  • 更稳妥的做法:建一个只读账号,比如 visitor,设一个简单的密码,在共享权限里只给它「只读」,让访客用这个账号登录。

另外要知道,OMV 在存在访客共享时,会让 Samba 把用户名不存在的登录当成访客。输错用户名不会报错,而是直接以访客身份进来,这是 Samba 的 map to guest = Bad User 语义。

方案四:给容器用的目录 ​

目标:容器的配置和数据放在共享文件夹里,容器和 NAS 上的用户都能正确读写,数据能被备份。

  1. 为容器建专用用户,例如 appuser,Shell 选 /usr/sbin/nologin。用 id appuser 记下 UID 和 GID,作为容器的 PUID、PGID,详见 容器权限:PUID、PGID 与共享文件夹。
  2. 在 OMV 里建共享文件夹 appdata(不要让 Docker 自动创建,否则目录属主是 root:root),权限选 770。
  3. appuser 在 users 组里,对 770 的目录有读写权限。
  4. 注意容器里新建的文件默认是 644,同组的 SMB 用户改不了。可以在容器里设 UMASK=002:许多镜像(例如 LinuxServer.io 的镜像)有这个环境变量,具体以镜像文档为准。
  5. 媒体库这类只需要读的目录,给容器只读挂载。
  6. 不要对 appdata 或 Docker 目录递归使用 ACL 对话框或 resetperms 插件:它们会改写所有文件的属主和权限,容器可能因此无法启动,官方 wiki 也有同样的警告。

方案五:小团队的部门目录 ​

目标:每个部门只能访问自己的目录,经理能只读查看所有部门,另有全员公共区。

  1. 建用户组 dept-sales、dept-eng、managers,把成员加进去。managers 的成员不要再加进部门组,避免同一个人在两个组里权限冲突。
  2. 建共享文件夹 sales、eng,权限选 770;另建 all,用默认 775 作全员公共区。
  3. 文件系统层:打开 sales 的 ACL 对话框,用户组 改成 dept-sales,权限「读/写/执行」,其它 设「无」;在表格里给 managers 点 只读,保存。eng 同理。这样其他部门的人在文件系统层也进不去,并且新建内容继承部门组。
  4. 共享层:给 sales 的 SMB 共享,公开 选「否」,共享权限里 dept-sales 设「读/写」,managers 设「只读」。eng 同理。
  5. 在 SMB 共享上启用回收站,需要追溯时开审核,见 SMB 进阶。
  6. 人员变动:把成员移出组,点应用,让对方的客户端断开重连。
  7. 备份和恢复演练见 小团队文件服务器。

怎么选 ​

场景限制落在哪一层关键设置
家庭公共区默认,不用动775,不设共享权限
家庭个人区共享层,或加文件系统层主目录,或「770 加共享权限」,要隔开就加专用组
只读媒体库文件系统层属主改成 uploader、组改只读、SMB 勾继承权限
访客只读共享层加文件系统层公开选允许访客,勾只读,「其它」可读
容器目录文件系统层专用用户 PUID 与 PGID,770,必要时 UMASK 002
部门目录文件系统层加共享层专用组 + ACL,同时设共享权限

检查结果 ​

每个方案都用两类账号各验证一次:

  1. 应该能做的:用授权的账号连上,读、写、删,结果符合预期。
  2. 不应该能做的:用没授权的账号连,应该被拒绝,用只读账号写,应该失败。能进去说明权限配错了。

在 OMV 的 shell(SSH 或本机控制台,root 身份)里,用只读命令确认文件系统层的实际状态:

sh
ls -ld <共享文件夹的绝对路径>
getfacl <共享文件夹的绝对路径>

常见问题 ​

做完发现别人还能进。 先确认是通过 SMB 进的还是 SFTP、NFS:共享权限只管 SMB 和 FTP。再看目录属组是不是仍然是 users,以及 公开 是否被设成了「允许访客」。

新建的文件别人改不了。 看文件的权限位:如果是 644,说明创建者的 umask 没有给组写权限。SMB 创建的文件默认是 664,容器和 SFTP 创建的不一定。

权限被改乱了。 回头看 ACL 详解 里的恢复办法。

参考资料 ​

OpenMediaVault 非官方中文使用指南,与 openmediavault 项目及其开发者无隶属关系。