Skip to content

IAM Binding

對應主管要求 ② 零信任。 設計核心:最小權限可指派可撤銷可審閱Binding 永遠透過 audit log 留痕

模型

text
Principal  ──────  binding  ──────  Role  ──────  Permissions
 (user/group)    (with scope:     (預定義 or 自訂)   (bb.*.* 字串)
                  workspace 或
                  project)
名詞是什麼
Principaluser 或 group
Role一組 permission 的命名集合
Permission細粒度動作(bb.issues.create / bb.databases.update …)
Binding「在某個 scope 上,把某 role 賦給某 principal」
Scopeworkspaces/-(全域)或 projects/<p>(單一 project)

設計理念:Role 是工具Binding 才是授權。同一個 role 在不同 project 對不同人意義不同。

預定義 Role

通用角色(10 個)

RoleScope用途
workspaceAdminworkspace全權;管所有 setting / IAM / IdP
workspaceDBAworkspace跨 project DBA:可執行所有 rollout、管 instance
workspaceMemberworkspace一般成員(讀取大多數內容,不能改設定)
sqlEditorUserworkspaceSQL Editor 唯讀查詢者
projectOwnerproject該 project 全權(管成員、審批、釋出)
projectDeveloperproject該 project 提交變更、評論
projectReleaserproject該 project 觸發 rollout
projectQuerierproject該 project 唯讀查詢
projectExporterproject該 project 匯出資料
projectViewerproject該 project 唯讀(不含 SQL Editor)

審計流程專屬角色(3 個,由 backend/internal/role/seed.go 註冊)

RoleScope對應要求一句話
secondaryBusinessOpsworkspace 或 project④ 二線運維二線業務運維:讀 issue/plan/rollout,參與審批但不能改 SQL 也不能觸發 rollout
securityOfficerworkspace② 零信任 + ① 稽核資料安全官:管 IAM / 政策 / masking,讀全 audit log不參與審批
readOnlyAuditorworkspace① 完整稽核唯讀稽核員:跨所有 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在哪
projectDeveloperprojectViewer該 project

帳號建立後設 expires_at建立帳號)。

場景 2:稽核 / 法遵

需要:跨所有 project 看 audit log、IAM、policy;不能寫任何東西。

Binding在哪
readOnlyAuditorworkspace

場景 3:資安部門

需要:管 masking policy、管 IdP、管 IAM;不能參與業務 issue 審批。

Binding在哪
securityOfficerworkspace

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 而非保留權限

相關

Argus — 公司內部資料庫變更審計平台