- Plan-01 marked ✅ DONE (INDEX table + P3 tier + BACKLOG row + plan header). - Plan-06 / Plan-12 dependency on 01 satisfied → 🔓 unblocked (headers + BACKLOG rows). - Repoint command/path refs in all plans (except Plan-01's migration narrative): .specify/{scripts,tests,security,config,templates,governance} -> packages/casan-harness/...; golden-runs/traceability-map/docs-input -> apps/okr/domain/...; `cd AINative_OKR_CASAN5` -> `cd $(git rev-parse --show-toplevel)`; fix relative links + Plan-13 control-plane location. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
89 lines
5.5 KiB
Markdown
89 lines
5.5 KiB
Markdown
# KẾ HOẠCH 14 — RBAC & Quản trị đa dự án (Multi-tenant governance)
|
||
|
||
> Status 2026-07-06: **� core implemented + tested (harness-owned).**
|
||
> RBAC decision engine đã dời/đặt trong harness: `packages/casan-harness/scripts/bash/rbac-check.py`
|
||
> (role×resource:action, scope org/project, deny-by-default fail-closed, tenant
|
||
> isolation, sensitive-settings-write chỉ org-admin, SoD chống tự duyệt). Test
|
||
> `packages/casan-harness/tests/phase-rbac-tests.sh` **10/0 (WSL)**, nối CI (`phase-rbac`).
|
||
> Còn lại: ánh xạ IdP claim → role thật (nối 07-C4), enforcement point trong web app
|
||
> Control Plane (Plan-13), audit mọi quyết định RBAC vào H5, quản lý role qua UI.
|
||
>
|
||
> Nhãn trạng thái: xem legend ở `CASAN_BACKLOG_STATUS.md`.
|
||
> Phụ thuộc: **07 C4** (IdP/OIDC — nguồn danh tính) · **13** (Control Plane tiêu thụ
|
||
> RBAC) · **06** (đa dự án — phạm vi tenant). **Chặn mềm** phần quản lý của 13.
|
||
|
||
## 1. Bối cảnh
|
||
- **Đã có:** IdP/OIDC JWT (RS256) chứng minh `sub`/`role`/`exp` + bind request
|
||
(Plan-07 C4); `reviewers.registry`; `project-registry.json` (project + domain).
|
||
- **Chưa có:** ma trận quyền (role × resource × action), phạm vi tenant (org →
|
||
project), kế thừa quyền, và điểm thực thi (enforcement point) thống nhất.
|
||
|
||
## 2. Nguyên tắc
|
||
- **Least privilege mặc định:** không role → không quyền; quyền phải cấp tường minh.
|
||
- **Deny-by-default + fail-closed:** thiếu/không rõ quyền → DENY, không "cho tạm".
|
||
- **Tenant isolation:** dữ liệu/domain/telemetry của dự án A không lộ sang dự án B.
|
||
- **Separation of Duties (SoD):** người đề xuất ≠ người duyệt (kế thừa C4).
|
||
- **Mọi quyết định RBAC ghi audit (H5):** ai, tài nguyên nào, cho/từ chối, vì sao.
|
||
- **Nguồn danh tính là IdP (C4), không tự chế:** RBAC chỉ ánh xạ identity→quyền.
|
||
|
||
## 3. Mô hình quyền (đề xuất)
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
ORG["Org (tenant gốc)"] --> PROJ["Project (OKR, dự án 2…)"]
|
||
PROJ --> RES["Resource: settings / telemetry / approval / kill-switch / domain-data"]
|
||
ROLE["Role: org-admin · project-admin · approver · operator · viewer · auditor"] --> PERM{"Permission<br/>role × resource × action"}
|
||
RES --> PERM
|
||
PERM --> ENF["Enforcement point<br/>(Control-Plane API + harness gate)"]
|
||
ENF --> AUDIT["H5 audit"]
|
||
style ENF fill:#d0e8ff,stroke:#2c3e91,stroke-width:2px
|
||
style AUDIT fill:#fff3cd,stroke:#8a6d3b,stroke-width:2px
|
||
```
|
||
|
||
### 3.1 Role gợi ý
|
||
| Role | Xem | Đổi setting | Duyệt | Kill-switch | Phạm vi |
|
||
|---|:--:|:--:|:--:|:--:|---|
|
||
| org-admin | ✓ | ✓ | ✓ | ✓ | toàn org |
|
||
| project-admin | ✓ | ✓ (không nhạy cảm) | – | project scope | 1 project |
|
||
| approver | ✓ | – | ✓ | – | được gán |
|
||
| operator | ✓ | – | – | engage (báo cáo) | 1 project |
|
||
| viewer | ✓ | – | – | – | được gán |
|
||
| auditor | ✓ (+audit log) | – | – | – | toàn org (read) |
|
||
|
||
## 4. Tasks
|
||
|
||
| Task | Việc | File/Đối tượng | Verify | Done |
|
||
|---|---|---|---|---|
|
||
| 14.1 | Định nghĩa schema `rbac-policy.yaml` (role × resource × action + scope) | mới `config/rbac-policy.yaml` | policy load hợp lệ | schema chốt |
|
||
| 14.2 | Ánh xạ IdP claim (`role`, `groups`) → role RBAC | nối Plan-07 C4 | JWT role → RBAC role đúng | mapping chạy |
|
||
| 14.3 | Enforcement point thống nhất: mọi API/gate gọi `rbac-check` trước hành động | mới `rbac-check.sh`/service | thiếu quyền → DENY fail-closed | 1 điểm thực thi |
|
||
| 14.4 | Tenant isolation: telemetry/domain-data theo project scope | Control-Plane API | user project A không đọc B | cách ly tenant |
|
||
| 14.5 | SoD: người đề xuất ≠ người duyệt (kế thừa C4) | governance-check | tự duyệt đề xuất của mình → DENY | SoD giữ |
|
||
| 14.6 | Ghi audit mọi quyết định RBAC (allow/deny + reason) | H5 audit | deny có bản ghi truy vết | audit đầy đủ |
|
||
| 14.7 | Quản lý role/gán quyền qua Control Plane (chỉ org-admin) | Plan-13 UI | non-admin đổi role → DENY | quản trị quyền |
|
||
|
||
## 5. Red-team / test
|
||
| Test | Kỳ vọng |
|
||
|---|---|
|
||
| `adv-viewer-writes-setting` | DENY |
|
||
| `adv-cross-tenant-read` (project A đọc B) | DENY |
|
||
| `adv-self-approve` (đề xuất tự duyệt) | DENY (SoD) |
|
||
| `adv-missing-role-defaults-allow` (thiếu role vẫn cho) | DENY (deny-by-default) |
|
||
| `adv-forged-role-claim` (JWT role giả) | DENY (verify chữ ký IdP — C4) |
|
||
| `benign-role-grant-roundtrip` (org-admin gán role hợp lệ) | PASS + audit |
|
||
|
||
## 6. Tiêu chí HOÀN THÀNH
|
||
- [ ] `rbac-policy.yaml` + enforcement point thống nhất, deny-by-default fail-closed.
|
||
- [ ] IdP claim → RBAC role; role giả bị chặn (verify qua C4).
|
||
- [ ] Tenant isolation: không rò dữ liệu chéo dự án.
|
||
- [ ] SoD giữ; mọi quyết định RBAC có audit H5.
|
||
- [ ] Control Plane (Plan-13) dùng RBAC cho toàn bộ hành động quản lý.
|
||
- [ ] Red-team mục 5 xanh; core harness 218/0 không tụt.
|
||
|
||
## 7. Ghi chú trung thực
|
||
- **[mới]** — hiện chỉ có approval-identity (C4), chưa có mô hình quyền đầy đủ.
|
||
- RBAC không thay IdP; nó ánh xạ identity (đã verify) → quyền, thực thi fail-closed.
|
||
|
||
---
|
||
_Liên quan: `CASAN_PLAN_07_PRODUCTION_HARDENING.md` (C4 IdP/OIDC — nguồn danh tính) · `CASAN_PLAN_13_CONTROL_PLANE.md` (tiêu thụ RBAC) · `CASAN_PLAN_06_ONBOARD.md` (đa dự án → phạm vi tenant)._
|