Appearance
IAM Binding
對應主管要求 ② 零信任。 設計核心:最小權限、可指派可撤銷可審閱、Binding 永遠透過 audit log 留痕。
模型
text
Principal ────── binding ────── Role ────── Permissions
(user/group) (with scope: (預定義 or 自訂) (bb.*.* 字串)
workspace 或
project)| 名詞 | 是什麼 |
|---|---|
| Principal | user 或 group |
| Role | 一組 permission 的命名集合 |
| Permission | 細粒度動作(bb.issues.create / bb.databases.update …) |
| Binding | 「在某個 scope 上,把某 role 賦給某 principal」 |
| Scope | workspaces/-(全域)或 projects/<p>(單一 project) |
設計理念:Role 是工具、Binding 才是授權。同一個 role 在不同 project 對不同人意義不同。
預定義 Role
通用角色(10 個)
| Role | Scope | 用途 |
|---|---|---|
workspaceAdmin | workspace | 全權;管所有 setting / IAM / IdP |
workspaceDBA | workspace | 跨 project DBA:可執行所有 rollout、管 instance |
workspaceMember | workspace | 一般成員(讀取大多數內容,不能改設定) |
sqlEditorUser | workspace | SQL Editor 唯讀查詢者 |
projectOwner | project | 該 project 全權(管成員、審批、釋出) |
projectDeveloper | project | 該 project 提交變更、評論 |
projectReleaser | project | 該 project 觸發 rollout |
projectQuerier | project | 該 project 唯讀查詢 |
projectExporter | project | 該 project 匯出資料 |
projectViewer | project | 該 project 唯讀(不含 SQL Editor) |
審計流程專屬角色(3 個,由 backend/internal/role/seed.go 註冊)
| Role | Scope | 對應要求 | 一句話 |
|---|---|---|---|
secondaryBusinessOps | workspace 或 project | ④ 二線運維 | 二線業務運維:讀 issue/plan/rollout,參與審批但不能改 SQL 也不能觸發 rollout |
securityOfficer | workspace | ② 零信任 + ① 稽核 | 資料安全官:管 IAM / 政策 / masking,讀全 audit log,不參與審批 |
readOnlyAuditor | workspace | ① 完整稽核 | 唯讀稽核員:跨所有 project 唯讀(含 audit log 與 IAM 可見性);完全無 mutation |
詳細權限明細:
docs/modules/custom-roles.md(內部設計文件)。
Permission 命名
格式:bb.<resource>.<verb>
範例(節錄):
| Permission | 動作 |
|---|---|
bb.issues.create | 建 Issue |
bb.issues.update | 改 Issue |
bb.plans.create | 建 Plan |
bb.planCheckRuns.run | 觸發 plan check |
bb.rollouts.list | 看 Rollout 清單 |
bb.databases.update | 改 Database(含 transfer) |
bb.instances.create | 新增 instance |
bb.policies.update | 改 policy |
bb.auditLogs.search | 查 audit log |
bb.auditLogs.export | 匯出 audit log |
bb.settings.set | 改 workspace setting |
bb.workspaces.setIamPolicy | 改 workspace IAM |
bb.projects.setIamPolicy | 改 project IAM |
bb.identityProviders.create | 新增 IdP |
完整清單:backend/common/permission/permission.yaml。
Binding 操作
UI
| 範圍 | 位置 |
|---|---|
| Workspace 級 | Settings → Members & Roles |
| Project 級 | Projects → <p> → Members |
API
bash
# 讀 workspace IAM
curl -s -H "Authorization: Bearer $TOKEN" \
"$ARGUS/v1/workspaces/-:getIamPolicy" | jq
# 改 workspace IAM(需 bb.workspaces.setIamPolicy)
curl -X POST -H "Authorization: Bearer $TOKEN" \
-d '{
"policy": {
"bindings": [
{
"role": "roles/workspaceAdmin",
"members": ["user:login_id=alice"]
},
{
"role": "roles/readOnlyAuditor",
"members": ["user:login_id=external-auditor-2026"]
}
]
}
}' \
"$ARGUS/v1/workspaces/-:setIamPolicy"Binding 是整批覆寫(不是 incremental)。改之前先 GET 出當前 policy,本地改完再 SET 回去,避免覆蓋他人變更。
自訂 Role
Settings → Roles → Custom → New Role。
需要 bb.roles.create。
yaml
name: roles/dbReviewer
title: DB Reviewer
permissions:
- bb.issues.get
- bb.issues.list
- bb.issueComments.create
- bb.plans.get
- bb.planCheckRuns.get
- bb.databases.getSchema自訂 role 主要用於:上面 13 個預定義都不貼合的特殊組合。能用預定義就不要自訂,會增加維護成本。
三個典型場景
場景 1:契約工 / 外部協力
需要:能讀指定 project 的東西、不能讀 audit log、不能管 IAM。
| Binding | 在哪 |
|---|---|
projectDeveloper 或 projectViewer | 該 project |
帳號建立後設 expires_at(建立帳號)。
場景 2:稽核 / 法遵
需要:跨所有 project 看 audit log、IAM、policy;不能寫任何東西。
| Binding | 在哪 |
|---|---|
readOnlyAuditor | workspace |
場景 3:資安部門
需要:管 masking policy、管 IdP、管 IAM;不能參與業務 issue 審批。
| Binding | 在哪 |
|---|---|
securityOfficer | workspace |
securityOfficer故意不含審批權,避免「資安既批又審」的角色衝突。
審計
所有 IAM 變動會寫 audit log:
| Action | 含意 |
|---|---|
bb.role.assign | 指派 role |
bb.role.revoke | 撤銷 role |
bb.workspaces.setIamPolicy | 改 workspace IAM 政策 |
bb.projects.setIamPolicy | 改 project IAM 政策 |
bb.roles.create / update / delete | 自訂 role 異動 |
詳細 payload 結構與查詢方式見 查詢 audit log。
反模式
| 反模式 | 為什麼 |
|---|---|
全公司都給 workspaceAdmin | 違反最小權限;任何人都可以改 IdP / IAM |
| 用一個共用帳號讓多人共用 | audit log 上 actor 沒意義;無法究責 |
為了趕時間直接給 workspaceDBA | 該 user 將能跑所有 project 的 prod rollout,遠超業務需要 |
| 給離職 user 留 binding 「以防需要」 | 違反 零信任;正確做法是 deactivate user 而非保留權限 |