4. 组与角色设计原则

在 Atlassian 体系(Jira、Confluence、Bitbucket 等)中,权限并不是直接授予某个人的,而是通过一条“身份 → 组 → 角色 → 权限方案”的链路逐层传递。权限蔓延(Permission Creep)几乎总是源于这条链路的某一层被随意扩张:有人被临时加进一个高权限组却从未移除,有人被直接授予项目角色而绕过了组管理,有人为了省事把“所有人”加进了某个权限方案。要避免这些问题,核心不是事后审计,而是在设计阶段就确定组、角色与权限方案三者的边界与映射关系。

三层职责:组管人、角色管事、权限方案管能力

先把三个概念区分清楚,这是所有设计决策的基础:

  • 组(Group):回答“谁是谁”。组是用户的集合,是身份治理的最小单位。组本身不携带任何权限,它只是把人聚合起来,便于批量管理。例如 dept-rd-frontend、contractor-vendor-a、jira-administrators。
  • 项目角色(Project Role):回答“在这个项目里,这个人扮演什么角色”。角色是项目级的,同一个用户在不同项目中可以是不同角色。例如某人在 A 项目是 Developers,在 B 项目是 Administrators。
  • 权限方案(Permission Scheme):回答“这个角色/组能做什么”。它把权限(如 Browse Projects、Edit Issues、Administer Projects)授予角色、组或用户。

正确的映射方向是:用户 → 组 → 项目角色 → 权限方案 → 权限。任何“用户 → 项目角色”或“用户 → 权限方案”的直接授予,都是绕过治理链路的捷径,也是权限蔓延的高发点。

Atlassian 权限传递链路与蔓延风险点 用户 张三 / 李四 外包王五 组(Group) dept-rd-frontend contractor-vendor-a 项目角色 Developers Administrators 权限方案 Browse Edit / Admin 加入 映射 授予 ⚠ 直接授予项目角色(绕过组) ⚠ 直接授予权限方案(绕过组与角色) 设计原则速查 组:按来源划分 部门 / 职能 / 雇佣类型 不按项目建组 角色:按职责划分 Developers / Viewers 角色映射组,不映射人 权限方案:按项目类型 标准 / 敏感 / 公开 方案数量宜少而稳定 禁止直授 用户→角色 用户→权限方案

组的设计:按“来源”而非“项目”划分

最常见的错误是“一个项目建一个组”,比如 proj-alpha-members、proj-beta-members。这种做法的直接后果是:组数量随项目线性增长,人员调动时需要在多个组之间反复增删,且无法回答“这个人为什么在这个组里”。

更稳健的做法是按身份来源划分组,让组反映组织事实而非项目事实:

  • 部门/职能组:dept-rd、dept-qa、dept-ops,由 HR 系统或 IdP(如 Okta、Azure AD)自动同步。
  • 雇佣类型组:employee-fulltime、contractor、intern,用于区分权限上限。
  • 管理职能组:jira-administrators、confluence-admins,数量极少,成员需审批。

组名建议采用 来源-范围-用途 的命名约定,例如 dept-rd-frontend、contractor-vendor-a。这样在权限方案里看到组名时,能立刻判断其成员范围和风险等级。

如果使用 Atlassian Access + SCIM 自动同步,组应由 IdP 作为唯一事实来源(Single Source of Truth)。Atlassian 侧只读,不允许手工增删成员,否则下一次同步会覆盖手工变更,造成“改了又回来”的困惑。

项目角色的设计:角色映射组,不映射人

项目角色的成员来源有三种:用户、组、项目角色本身。设计原则是只使用“组”作为角色成员,把“用户”和“角色嵌套”都视为例外,需要审批和记录。

以一个典型研发项目为例,角色与组的映射可以这样规划:

项目角色 映射的组 典型权限
Administrators dept-rd-leads Administer Projects、Manage Sprints
Developers dept-rd-frontend、dept-rd-backend Edit Issues、Transition Issues、Log Work
Viewers dept-qa、dept-pm Browse Projects、View Read-Only Workflow
Customers ext-customer-portal Create Issues(仅服务台)

这样设计后,人员变动只需在 IdP 或组层面调整,项目角色自动跟随,无需逐个项目修改。角色数量也应保持克制:一个项目通常 3~5 个角色足够,超过 6 个往往意味着职责边界不清。

权限方案的设计:少而稳定,按项目类型复用

权限方案是权限蔓延的“放大器”——一个方案被多个项目共享,方案里多给一个组,所有共享项目都会受影响。因此权限方案的设计要点是:

  1. 按项目类型而非项目实例创建方案。例如“标准研发项目方案”“敏感合规项目方案”“公开社区项目方案”,而不是“Alpha 项目方案”“Beta 项目方案”。
  2. 方案内只引用组和角色,不引用具体用户。Jira 权限方案允许直接添加用户,这是最隐蔽的蔓延入口,应在管理规范中明确禁止。
  3. 定期做“方案-项目”影响面盘点。修改一个方案前,先查它被多少项目使用;影响面超过阈值(例如 20 个项目)时,应新建方案而非修改原方案。
“所有人(Anyone)”和“登录用户(Logged in users)”这两个内置组要特别警惕。把 Browse Projects 授予 Anyone,意味着未登录的互联网用户也能看到项目;把 Edit Issues 授予 Logged in users,意味着任何能登录的人都能改单。除非是公开社区类项目,否则不应在权限方案中使用这两个组。

落地检查:一份可执行的权限方案评审清单

设计完成后,用下面这份清单做一次自检,可以拦截绝大多数权限蔓延隐患:

检查项 通过标准 常见不通过表现
组是否按来源划分 组名可追溯到部门/职能/雇佣类型 存在 proj-xxx-members 类项目组
角色成员是否仅含组 角色成员列表中无具体用户 某角色里直接加了 3 个用户名
权限方案是否仅含组/角色 方案中无“用户”类型条目 Browse Projects 直接授予了某人
是否使用 Anyone / Logged in users 仅公开项目使用,且有标注 内部项目 Browse 授予了 Logged in users
方案复用影响面是否可控 单方案关联项目数 ≤ 20 一个方案被 80 个项目共用
管理员组是否最小化 jira-administrators 成员 ≤ 5 人 管理员组有 30 人,含外包

把这份清单固化为新项目开通时的必过流程,权限蔓延就从“事后救火”变成了“事前拦截”。下一阶段,当组织规模扩大、项目数量增长时,还可以进一步引入基于项目模板的自动化开通,让组、角色、权限方案的映射关系以代码形式固化下来,减少人工配置带来的偏差。