跳到主要内容
版本:Current

SFTPGo 权限模型与核心概念

重要提示:这一章只讲"这是怎么一回事",不写操作步骤。如果你是第一次接触这套系统,先看完这一章再去看具体的操作文档。

为什么要先理解概念?

SFTPGo 的权限管理看起来复杂,但实际上它的逻辑是很清晰的。如果你不理解核心概念就直接去操作,很容易踩坑。花 5 分钟看完这一章,能帮你少走很多弯路。


核心认知:SFTPGo 的权限有两套体系

这是最容易混淆的地方,但也是最重要的认知:

Linux 文件系统权限 ≠ SFTPGo 权限

SFTPGo 不能绕过 Linux 文件系统权限。即使你在 SFTPGo 后台配置得再完美,如果 Linux 系统层面不允许访问,用户还是会被拒绝。

这两套权限是"且"的关系,不是"或"的关系:

  • Linux 允许 SFTPGo 允许 = 用户能访问 ✅
  • Linux 允许但 SFTPGo 不允许 = 用户不能访问 ❌
  • Linux 不允许但 SFTPGo 允许 = 用户不能访问 ❌

打个比方:

  • Linux 权限就像"大门的钥匙",决定你能不能进这栋楼
  • SFTPGo 权限就像"房间的门禁卡",决定你能进哪些房间

如果你连楼都进不了,有门禁卡也没用。但即使你进了楼,没有门禁卡也去不了特定房间。


Virtual Folder:它是个"映射",不是真正的目录

Virtual Folder 到底是什么?

Virtual Folder 不会创建真实的目录,它只是把服务器上的真实路径,"映射"成用户看到的一个虚拟路径。

举个例子:

  • 服务器真实路径:/srv/sftpgo/data/departments/tech/shared
  • 你创建一个 Virtual Folder,Virtual Path 设置为 /tech/shared
  • 用户登录后,看到的路径是 /tech/shared,但实际上访问的是服务器上的 /srv/sftpgo/data/departments/tech/shared

Virtual Folder 不会做什么?

很多人会误以为 Virtual Folder 能自动创建目录,这是不对的:

  • ❌ Virtual Folder 不会创建目录(需要在服务器层面先创建)
  • ❌ Virtual Folder 不会修改服务器权限(这是 Linux 层面的工作)
  • ❌ Virtual Folder 不会自动让用户看到(必须绑定到 Group 或 User)

Virtual Folder 的作用

Virtual Folder 的核心作用是"解耦":

  • 让用户看到的路径和服务器真实路径分离
  • 方便未来调整服务器目录结构,而不影响用户的访问路径
  • 一个服务器路径可以被多个 Virtual Folder 映射(虽然不常用)

Group:权限管理的核心载体

为什么 Group 这么重要?

Group 是权限管理的唯一推荐入口。你可以把它理解成一个"部门"或"权限集合"。

推荐的关系结构:

Virtual Folder → Group → User

为什么不直接 Virtual Folder → User?

虽然技术上可以,但不推荐,原因很简单:

  1. 难以批量管理:如果部门有 20 个人,你就要给 20 个用户分别配置。万一要改权限,你得改 20 次。
  2. 容易出错:人工操作多了,漏掉谁、加错权限都是常见的事。
  3. 不好扩展:新人加入部门,还要记得给他单独配置。万一忘了,他就有问题。

用 Group 的好处:

  • 一次配置,自动继承:Virtual Folder 绑定到 Group,用户加入 Group,自动获得权限
  • 批量管理:改一个 Group 的权限,所有成员都生效
  • 清晰的结构:一个 Group = 一个部门,一目了然

Group 的权限优先级

重要:Group 的权限优先级高于 Virtual Folder。

这是什么意思?

  • Virtual Folder 可能允许 upload(上传)
  • 但 Group 可以覆盖这个权限,设置为"只读"
  • 最终用户受到的限制,以 Group 的配置为准

这个设计很合理:Virtual Folder 定义"这个目录能做什么",Group 决定"这个部门在这个目录能做什么"。


User:永远不应该直接拿资源

User 的正确使用方式

User 应该通过加入 Group 来获得权限,而不是直接绑定 Virtual Folder。

推荐的流程:

  1. 创建 Virtual Folder(映射服务器路径)
  2. 创建 Group(部门)
  3. 将 Virtual Folder 绑定到 Group
  4. 将 User 加入 Group

User 会自动继承 Group 的所有 Virtual Folder 权限。

User 自己的 home_dir

User 有自己的 home_dir(个人目录),这个是例外。个人目录直接属于用户,不需要通过 Group。

但是共享目录,都应该通过 Group 来管理。


三层权限模型详解

SFTPGo 的权限实际上有三层检查,每一层都要通过,用户才能访问:

第一层:Linux 文件系统权限

检查者:Linux 操作系统

检查内容

  • 目录是否存在?
  • SFTPGo 运行用户是否有权限访问?
  • 文件/目录的读写权限是否正确?

这一层的责任人:服务器运维人员(System)

第二层:SFTPGo Virtual Folder 配置

检查者:SFTPGo 系统

检查内容

  • Virtual Folder 是否允许这个操作?(list、upload、download 等)
  • Virtual Folder 的 Mapped Path 是否正确?

这一层的责任人:Admin(网盘管理员)

第三层:Group 权限

检查者:SFTPGo 系统(Group 级别)

检查内容

  • User 是否属于能访问这个 Virtual Folder 的 Group?
  • Group 对这个 Virtual Folder 的权限设置是什么?
  • Group 的权限是否覆盖了 Virtual Folder 的设置?

这一层的责任人:Admin(网盘管理员)

三层权限的检查顺序

用户请求访问文件

【第一层】Linux 文件系统权限检查
↓ 通过
【第二层】Virtual Folder 配置检查
↓ 通过
【第三层】Group 权限检查
↓ 通过
允许访问 ✅

任意一层不通过,就会拒绝访问。

一个实际例子

假设用户要上传文件到 /tech/shared

  1. Linux 层检查/srv/sftpgo/data/departments/tech/shared 这个目录是否存在?SFTPGo 运行用户能写吗?→ 如果不行,直接拒绝 ❌

  2. Virtual Folder 层检查:Virtual Folder /tech/shared 是否配置了 upload 权限?→ 如果没有,拒绝 ❌

  3. Group 层检查:用户是否属于能访问这个 Virtual Folder 的 Group?Group 是否限制了写权限?→ 如果没有加入 Group,或者 Group 设置为只读,拒绝 ❌

只有三层都通过,用户才能上传文件 ✅


一句话记住这套系统

服务器管「能不能」,Group 管「该不该」,User 只负责「用」。

  • 服务器(Linux):决定文件/目录是否"真实存在"且"可访问"
  • Group(SFTPGo 中的权限组):决定用户"是否应该"有权限
  • User(最终用户):只负责使用,不直接配置权限

常见误解澄清

❌ 误解 1:"Virtual Folder 创建了,用户就能看到"

不对。Virtual Folder 只是定义了一个映射关系,必须绑定到 Group 或 User,用户才能看到。

❌ 误解 2:"Linux 权限配置好就够了"

不对。Linux 权限只是第一层,还要配置 SFTPGo 的 Virtual Folder 和 Group。

❌ 误解 3:"直接给 User 绑定 Virtual Folder 更方便"

不对。短期看可能快一点,但长期维护会很麻烦。用 Group 管理才是正确的方式。

❌ 误解 4:"Group 权限和 Virtual Folder 权限是分开的"

不对。Group 的权限是覆盖 Virtual Folder 的。如果 Virtual Folder 允许 upload,但 Group 设置为只读,最终用户就是只读。


接下来该看什么?

理解完这些概念后,你可以根据你的角色去看相应的操作文档:

如果你遇到问题,可以查看 故障排查速查表