跳至主要内容

Kong decK:RBAC、Workspace 與 Service Account 設計

很多人第一次使用 decK 時會直接:

deck \
--headers "Kong-Admin-Token:<token>" \
gateway sync ...

容易誤以為:

Kong-Admin-Token 一定等於 Super Admin。

其實不是。

Kong-Admin-Token 是 Admin API 認證 Header 名稱;真正可以做什麼,是由該 identity 的 RBAC permission 決定。

因此 decK 完全可以使用:

  • 個人的 RBAC token。
  • Workspace Admin token。
  • 專門給 CI/CD 的 Service Account。
  • SSO / OIDC session cookie。

這也是 Kong decK APIOps Deployment Scripts 在正式環境中應採用的方式。

不要共用 Super Admin Token

最不建議:

Cow
Andy
Ken
GitLab SIT
GitLab QAS
GitLab PROD

└── 共用同一個 kong_admin token

問題:

  • Audit 無法區分操作者。
  • Token 外洩影響所有 Workspace。
  • CI 設定錯誤可能直接碰 PROD。
  • 無法做到 least privilege。
  • Token rotation 影響所有使用者與 pipeline。

建議 Identity Model

Kong Gateway

├── Human Identity
│ ├── Cow
│ ├── Andy
│ └── Ken

└── Automation Identity
├── deck-sit
├── deck-qas
└── deck-prod

每個 identity 都有自己的 permission。

Human Account

人工操作應使用個人 identity:

Corporate SSO / LDAP / OIDC

Kong Admin

RBAC

這樣 Audit Trail 可以知道:

Cow changed Route A
Andy changed Plugin B

而不是所有變更都顯示為:

kong_admin

個人 RBAC Token

如果 Kong Admin user 啟用了 RBAC token,可用自己的 token:

export DECK_KONG_ADDR="https://kong-admin.example.com:8444"
export DECK_KONG_ADMIN_TOKEN="$MY_KONG_TOKEN"

再:

deck gateway diff \
pos-kong.yaml \
--workspace QAS

雖然環境變數名稱叫:

DECK_KONG_ADMIN_TOKEN

token 本身並不一定是 Super Admin。

它可以只是:

QAS Workspace Developer

SSO Session

如果組織使用 Kong Manager + OIDC / SSO,也可以讓 decK 使用登入 session cookie。

概念:

User

SSO Login

Kong /auth

Session Cookie

decK

Admin API

這適合人工操作,因為 identity lifecycle 可以由企業 IdP 管理。

CI/CD 則仍建議使用 non-human Service Account。

一個 Workspace 一個 Service Account

建議:

deck-sit
└── SIT only

deck-qas
└── QAS only

deck-prod
└── PROD only

這比:

deck-ci
├── SIT
├── QAS
└── PROD

更安全。

即使 pipeline 寫錯:

QAS_TOKEN + --workspace PROD

Kong RBAC 仍應拒絕。

也就是:

CLI workspace parameter
+
server-side RBAC

兩層一起保護。

Workspace 是 Server-side Security Boundary

--workspace QAS 本身不是安全控制。

它只是告訴 decK:

我要操作 QAS

真正安全控制是:

deck-qas token
只能操作 QAS

因此:

QAS token + --workspace QAS → OK
QAS token + --workspace PROD → Forbidden

這才是可靠的權限模型。

Service Account 權限

一開始可以先給某個 Workspace 內較完整的 API deploy 權限,再逐步縮小。

原因是 decK 在 diff / sync 時不只呼叫:

/routes
/services
/plugins

還可能讀:

  • Gateway version。
  • schema。
  • plugin schema。
  • Workspace resource。
  • foreign-key entity。

因此如果一開始只猜:

Routes CRUD 應該就夠

很容易在 diff 階段遇到 403。

建議用 verbose log 觀察實際呼叫:

deck gateway diff \
pos-kong.yaml \
--workspace QAS \
--verbose 1

再逐步收斂 Role。

不讓 Deployment Account 建 Workspace

Workspace lifecycle 應由平台 Admin 管理:

Admin
├── create SIT
├── create QAS
└── create PROD

APIOps account 只管理 Workspace 內 API。

因此建議 decK 使用:

--skip-workspace-crud

這可避免 deployment account 嘗試建立不存在的 Workspace。

責任模型:

Platform Admin
└── Workspace lifecycle

Workspace Admin
└── Service / shared policy

APIOps Service Account
└── Route / API deployment

CI Credential

GitLab CI Variable:

KONG_SIT_ADDR
KONG_SIT_TOKEN

KONG_QAS_ADDR
KONG_QAS_TOKEN

KONG_PROD_ADDR
KONG_PROD_TOKEN

並搭配:

  • Masked variable。
  • Protected variable。
  • PROD token 只在 protected branch / protected environment 可取得。

QAS Job:

export DECK_KONG_ADDR="$KONG_QAS_ADDR"
export DECK_KONG_ADMIN_TOKEN="$KONG_QAS_TOKEN"

./kong-deploy.sh \
--state pos/qas/pos-kong.yaml \
--workspace QAS \
--expect-tag pos \
--apply \
--yes

PROD Job:

export DECK_KONG_ADDR="$KONG_PROD_ADDR"
export DECK_KONG_ADMIN_TOKEN="$KONG_PROD_TOKEN"

./kong-deploy.sh \
--state pos/prod/pos-kong.yaml \
--workspace PROD \
--expect-tag pos \
--apply \
--yes

Secret 不應寫進 Script

不要:

TOKEN="my-secret-token"

也不要 commit:

.deck.yaml

如果其中含 plaintext credential。

建議:

Local
→ password manager / environment variable / secure config

CI
→ GitLab masked protected variable

Production
→ secret manager / Vault / OpenBao

TLS

正式環境應驗證 Kong Admin API TLS:

export DECK_CA_CERT_FILE=/etc/pki/kong-ca.pem

而不是長期:

--tls-skip-verify

後者只適合測試或臨時診斷。

推薦 Role Matrix

IdentityWorkspace建議用途
Super AdminGlobalRBAC、Workspace、平台管理
Workspace Admin指定 WorkspaceService、shared policy、Consumer
Developer指定 WorkspaceRoute、route plugin
Viewer指定 WorkspaceRead only
Auditor跨 Workspace read onlyAudit
deck-sitSITCI/CD deploy
deck-qasQASCI/CD deploy
deck-prodPRODCI/CD deploy

CI account 不應等同 Super Admin。

Defense in Depth

整個 APIOps security boundary 應該有多層:

任一層出錯,都還有下一層可以降低風險。

與 Selective Sync 的關係

Kong decK Selective Sync and Tag Ownership 解決的是:

哪些 entity 屬於這份 state?

RBAC 解決的是:

這個 identity 能操作哪些 Workspace / resource?

兩者不是替代關係,而是互補:

select_tags
= desired-state boundary

RBAC
= authorization boundary

所以安全的 QAS deployment 應該同時具備:

state.select_tags = pos
service lookup tag = masa-service
token = deck-qas
RBAC = QAS only
workspace = QAS

相關文章

References