16 KiB
16 KiB
IwoooS 高價值配置控管清冊
| 項目 | 內容 |
|---|---|
| 日期 | 2026-06-11 |
| 狀態 | inventory_and_control_policy_ready |
| 範圍 | AWOOOI / IwoooS 全產品重要配置 |
| 本階段模式 | source-control 修補 + 只讀盤點,不做 live reload / restart / sync |
| runtime gate | 0 |
0. 核心結論
目前 IwoooS 的資安範圍不能只看程式碼漏洞,必須把「能改變公開入口、部署、憑證、告警、資料、備份、AI provider、agent 行為與跨產品路由」的配置全部納入控管。
本次盤點後,配置控管分為四級:
| 等級 | 定義 | 處理速度 | 例子 |
|---|---|---|---|
| C0 | 立即影響公開入口、權限、secret、部署或遠端執行 | 立即納管,先止血再補 owner gate | Nginx public gateway、TLS、secret、workflow、runner、K8s prod、ArgoCD、backup credential |
| C1 | 會影響監控、資料、供應鏈、AI provider 或主機維護 | 近程納管,建立 drift 與維護窗口 | Prometheus、Alertmanager、Docker Compose、PostgreSQL、Redis、MinIO、Ollama、Kali、WireGuard |
| C2 | 產品 runtime、admin、API、webhook、frontend build 或跨產品 route | 隨產品變更納管 | AWOOOI、AwoooP、IwoooS、VibeWork、agent-bounty-protocol、StockPlatform、Tsenyang、Bitan、VTuber |
| C3 | 文件、runbook、template、snapshot 與證據索引 | 持續納管,避免範例變成可複製風險 | SERVICE-ENDPOINTS.md、DR runbook、owner response template |
1. 目前已不符合新要求的項目
| 優先 | 項目 | 現況 | 風險 | 本階段處置 |
|---|---|---|---|---|
| P0 | Nginx public gateway | 已有 Ansible source-of-truth,但缺少資安等級、owner gate、drift evidence、reload 前後驗證與跨產品通知規範 | 手改 live conf 會讓公開網站、admin route、TLS、API、WebSocket 或 ACME 被改壞,且不易追責 | 已新增高價值配置 Hard Rule 與本清冊;live drift detector 尚未實作 |
| P0 | docs/runbooks/SECRETS-MANAGEMENT.md Gitea token 範例 |
文件內存在可疑 token 範例 | 可能造成 Gitea API 權限外洩或複製貼上事故 | 已改為 owner-managed token env,不保存 value |
| P0 | k8s/monitoring/docker-compose-110.yml Grafana admin 密碼 |
compose 內有固定密碼常值 | 若被當作 live 密碼或複製使用,會造成監控後台弱控管 | 已改為 GRAFANA_ADMIN_PASSWORD owner secret store 注入 |
| P0 | ops/monitoring/discover_docker.py SSH host key 驗證 |
仍使用關閉 host key 驗證的參數 | MITM 或錯誤主機信任風險 | 已改為 BatchMode=yes + accept-new;後續升級 pinned known_hosts |
| P0 | apps/api/src/api/v1/monitoring.py Grafana 探測認證 |
程式碼內有 Grafana Basic Auth 常值 | API 程式碼保存 credential,且會被複製到後續部署 | 已改為 settings.GRAFANA_API_KEY Bearer token;未設定時不送 Authorization header |
| P1 | Nginx 188 / 110 live conf drift | repo 有 templates,但尚未自動比較 live hash / rendered hash | 手改後 repo 不知道,下一次 Ansible 可能覆蓋或保留錯誤路由 | 新增為 P0 後續任務:只讀 drift detector |
| P1 | DNS / TLS / certbot | 多產品共用 188 / 110 public gateway,憑證路徑與 renewal 仍分散在 runbook / template | 憑證過期、錯誤 cert path、ACME challenge 被覆蓋會造成公開服務中斷 | 納入 C0,需建立 domain / cert / renewal 清冊 |
| P1 | workflow / runner / deploy key / secret name | 已有 Gitea / GitHub readiness 盤點,但尚未把配置變更和 IwoooS 高價值配置共用 gate 合併 | workflow 或 runner 改錯會直接影響部署與 secret 注入 | 納入 C0,維持只讀 owner response,不收 secret value |
| P1 | Docker Compose / systemd live config | 110 / 188 多服務由 compose、systemd 與 recovery scripts 管理 | restart policy、port、volume、env 改動會影響 Harbor、Sentry、Langfuse、Gitea、agent-bounty-protocol | 納入 C1,先做只讀 inventory |
| P1 | AI provider / Ollama proxy | 110 Nginx proxy、GCP-A/B、111 fallback、API provider route 多處配置 | provider route drift 會造成成本、可用性、資料外送與模型品質風險 | 納入 C1,任何切換仍需 dry-run / benchmark / owner gate |
| P1 | agent-bounty-protocol runtime / treasury / A2A / MCP | 已納入只讀範圍,但尚未有 production host、compose、domain、TLS、rollback owner 完整資料 | 外部 agent、claim / submit、payout 或 webhook 若未控管,風險高於一般網站 | 納入 C2,仍不改該 repo、不讀 .env、不部署 |
2. Nginx 控管機制
Nginx 是目前必須最先資安控管的配置,原因是它同時控制公開 domain、TLS、admin route、API / WebSocket、ACME challenge、跨產品 upstream 與內網曝光邊界。
2.1 Source of truth
| 主機 | repo source-of-truth | live path | 涵蓋 |
|---|---|---|---|
192.168.0.188 |
infra/ansible/roles/nginx/templates/188-all-sites.conf.j2 |
/etc/nginx/sites-enabled/all-sites.conf |
aiops.wooo.work、gitlab.wooo.work、signoz.wooo.work、www.tsenyang.com、tsenyang.com、stock.wooo.work、mo.wooo.work、bitan.wooo.work、vtuber.wooo.work |
192.168.0.188 |
infra/ansible/roles/nginx/templates/188-internal-tools-https.conf.j2 |
live path 需 owner 確認 | gitea.wooo.work、sentry.wooo.work、langfuse.wooo.work、harbor.wooo.work、registry.wooo.work、signoz.wooo.work、stock.wooo.work |
192.168.0.110 |
infra/ansible/roles/nginx/templates/110-ollama-proxy.conf.j2 |
/etc/nginx/sites-enabled/110-ollama-proxy.conf |
Ollama GCP-A 11435、GCP-B 11436、local fallback 11437 |
| 部署入口 | infra/ansible/playbooks/nginx-sync.yml |
Ansible apply | nginx -t、backup、reload handler |
| 回滾 SOP | docs/runbooks/disaster-recovery/DR-Nginx.md |
Runbook | 語法錯誤、Git rollback、188 失效接管 |
2.2 必要 gate
| 階段 | 必要資料 | 未滿足時 |
|---|---|---|
| 變更前 | owner role / team、affected domains、affected paths、upstream、TLS / ACME 影響、rollback owner、maintenance window | 不可 reload,不可部署 |
| diff | repo diff、rendered diff、live drift evidence refs | 只可進入 owner review |
| preflight | nginx -t、port conflict check、certificate path check |
不可 reload |
| post-check | public route smoke、API / WebSocket smoke、admin route smoke、ACME path smoke、錯誤率觀察 | 不可宣稱完成 |
| rollback | 前一份 live backup、Git revert ref、rollback owner、停止條件 | 不可進 production window |
2.3 Drift 原則
- 偵測到 live Nginx 與 repo template 不一致時,只建立 evidence,不自動覆寫 live。
- drift 必須標記受影響 domain、upstream、TLS、admin route、ACME path 與風險等級。
- 若 drift 是緊急手改,需補 break-glass owner response、時間、原因、回滾條件與後續 source-of-truth patch。
- 若 drift 是未授權變更,列為 P0 config drift,不得等到下一次部署才處理。
- IwoooS UI 可顯示 drift,但不能因此提高 runtime gate。
3. 需要優先納管的配置總清單
| 優先 | 配置 | 代表 repo 路徑 | live / owner 來源 | 必要控管 |
|---|---|---|---|---|
| P0 | Nginx public gateway | infra/ansible/roles/nginx/templates/*.j2、infra/ansible/playbooks/nginx-sync.yml、ops/nginx/* |
188 / 110 live Nginx | source-of-truth、drift detector、owner gate、nginx -t、route smoke、rollback |
| P0 | DNS / TLS / certbot | Nginx templates、docs/runbooks/REGISTRY-CERTBOT-188.md、TLS alert rules |
DNS provider、Let's Encrypt、188 / 110 | domain inventory、cert path、renewal check、ACME path smoke |
| P0 | K8s production manifests | k8s/awoooi-prod/*、k8s/argocd/awoooi-prod-app.yaml |
ArgoCD / K3s | GitOps diff、ArgoCD health / sync readback、rollback revision、no manual kubectl unless approved |
| P0 | K8s Secret metadata | k8s/awoooi-prod/03-secrets.example.yaml、secret templates、workflow injection |
Gitea Secrets / K8s Secret names | secret name parity only、no value collection、rotation owner |
| P0 | Gitea workflows | .gitea/workflows/*.yaml |
Gitea Actions | self-hosted runner, secret reference guard, deployment verification, no write action without owner |
| P0 | Runner / deploy key / webhook / branch protection | ops/runner/*、source-control snapshots |
Gitea / GitHub owner metadata | labels、key names、webhook names、ruleset metadata only;no token / key value |
| P0 | Public admin / API route config | Nginx templates、apps/web/src/lib/config.ts、apps/api/src/core/config.py |
Product owner + runtime owner | auth boundary、CORS、public URL、admin path smoke、frontend internal IP ban |
| P0 | Backup / restore credential | scripts/backup/*、k8s/velero/*、DR runbooks |
MinIO / restic / offsite escrow | credential value absent、restore drill gate、escrow owner、retention policy |
| P0 | agent-bounty-protocol treasury / MCP / A2A | docs/security/AGENT-BOUNTY-IWOOOS-ONBOARDING-HANDOFF.md |
agent-bounty owner response | no payout / claim / submit / daemon / webhook until explicit runtime approval |
| P1 | Prometheus / Alertmanager | k8s/monitoring/*、ops/alertmanager/alertmanager.yml、ops/monitoring/* |
110 monitoring stack | rule diff、receiver diff、reload gate、failure-only notification policy |
| P1 | Grafana / SigNoz / Sentry / Langfuse | ops/grafana/*、ops/signoz/*、ops/sentry-self-hosted/*、infra/langfuse/* |
110 compose / public gateway | admin secret externalized、public route, backup, smoke, upgrade window |
| P1 | Harbor / registry | Nginx templates、backup scripts、CD workflows | 110 Harbor / registry domains | robot account owner、image tag immutability、scan policy、TLS |
| P1 | PostgreSQL / Redis / MinIO | app config、backup scripts、monitoring config | 188 / 110 / K3s | no plaintext DSN, access boundary, backup, restore, metrics auth |
| P1 | Docker Compose / systemd | docker-compose.yml、ops/*/docker-compose.yml、scripts/reboot-recovery/*.service |
110 / 188 / agent-bounty hosts | port / volume / env diff、restart window、rollback owner |
| P1 | SSH / sudoers / known_hosts | Ansible inventory、ops scripts、runner scripts | host owners | pinned or accept-new policy、no host key disable、target whitelist |
| P1 | Firewall / WireGuard / NodePort / VIP | K8s service / network policy、Kali / wg-easy docs | network owner | ingress / egress matrix、no unreviewed port exposure |
| P1 | AI provider / model routing | apps/api/src/services/ai_providers/*、Ollama runbooks、Nginx proxy |
AI owner | dry-run、benchmark、cost / privacy review、fallback order gate |
| P1 | Kali 112 scanner config | docs/security/KALI-112-MAINTENANCE-WINDOW-DRAFT.md、Kali snapshots |
Kali owner | maintenance window、no active scan、no /execute、hardening dry-run |
| P2 | AWOOOI / AwoooP / IwoooS frontend runtime config | apps/web/next.config.js、apps/web/src/lib/config.ts、i18n |
web owner | NEXT_PUBLIC public-domain only、no internal transcript, desktop/mobile smoke |
| P2 | VibeWork product boundary | VibeWork owner docs / future evidence refs | VibeWork owner | independent product boundary、repo / deploy / admin / backup scope |
| P2 | StockPlatform / Tsenyang / Bitan / VTuber routes | Nginx templates、product runbooks | product owner | domain / admin / API / backup / owner matrix |
| P2 | Package / supply-chain baselines | pnpm-lock.yaml、package.json、Dockerfiles、inventory snapshots |
repo owner | lockfile drift, CVE / license policy, image digest evidence |
| P3 | Runbook / endpoint docs / snapshots | docs/reference/*、docs/runbooks/*、docs/security/*.snapshot.json |
doc owner | no secret value, stale endpoint flag, owner-reviewed evidence refs |
4. 新增規範
- 高價值配置必須先分級:C0 / C1 / C2 / C3。
- 所有 C0 配置變更必須有 source-of-truth、owner gate、diff、rollback owner 與驗證點。
- Nginx live drift 不得自動覆蓋,只能先形成 P0 evidence 與 owner decision。
- 文件與 runbook 的範例不得包含可用 token、password、private key、runner token、webhook secret、cookie、authorization header 或 partial credential。
- SSH 類工具不得關閉 host key 驗證;短期可用
accept-new,長期要升級 pinned known_hosts。 - Grafana / Harbor / MinIO / ArgoCD / Gitea / Telegram / AI provider 等管理面密碼只能由 owner secret store 注入。
- agent-bounty-protocol、VibeWork 與其他產品的 route / admin / webhook / payout / deploy config 必須放入 IwoooS 控管,但不能混用 AWOOOI runtime approval。
5. 需要調整的既有規範
| 規範 | 目前狀態 | 調整方向 |
|---|---|---|
| IwoooS 初期低摩擦 | 原本偏只讀框架 | 保留只讀框架,但 P0 即時危害可先做 source-control 止血 |
| Nginx DR runbook | 已寫禁止直接手改 live conf | 補 owner gate、drift detector、跨產品通知、post-check |
| Secrets 管理手冊 | 有 secret 來源與 CD 注入說明 | 去除可用 token 範例,補「metadata only」與 owner secret store |
| Gitea / GitHub readiness | 已有 repo / workflow / secret name 盤點 | 與高價值配置分級合併,workflow 變更仍需獨立批准 |
| Deployment verification | 偏重 Pod / health | 加入 Nginx / DNS / TLS / public route / admin route smoke |
| AI provider governance | 已有 dry-run / benchmark 邊界 | 加入 Nginx Ollama proxy、GCP fallback、成本與資料外送控管 |
| Frontend i18n / internal IP | 已有 NEXT_PUBLIC 禁令 | 擴大到 public route / Sentry tunnel / admin path / product domain 一起驗證 |
6. 階段完成度
| 工作 | 完成度 | 說明 |
|---|---|---|
| 重要配置範圍盤點 | 100% |
已建立 C0-C3 分級與總清單 |
| Nginx 控管機制定義 | 100% |
已定義 source-of-truth、live path、gate、drift 原則 |
| source-control P0 止血 | 100% |
已清掉本波掃到的 token 範例、Grafana 密碼常值與 SSH host key 關閉 |
| live Nginx drift detector | 0% |
尚未 SSH / Ansible check-mode / live hash;需 owner 與維護窗口規則 |
| live Nginx reload / restart | 0% |
未授權,未執行 |
| DNS / TLS live validation | 0% |
本階段未跑 live probe;若下一階段改前端或 route,需 desktop / mobile / route smoke |
| cross-product owner response | 0% |
尚未收到 VibeWork、agent-bounty-protocol、StockPlatform 等 owner acceptance |
7. 下一階段優先順序
- P0:建立 Nginx 只讀 drift detector 草案,輸出 repo-rendered hash、live hash、affected domain / upstream / TLS / admin route,不自動覆寫。
- P0:補 DNS / TLS / certbot domain inventory,先只讀,不 renew、不 reload。
- P0:把 workflow / runner / secret name owner response 與高價值配置 C0 gate 串成同一個 IwoooS 狀態。
- P1:盤點 110 / 188 Docker Compose 與 systemd live config,標記 Harbor、Sentry、Langfuse、Gitea、agent-bounty-protocol 影響面。
- P1:盤點 Prometheus / Alertmanager / Grafana / SigNoz / Sentry 設定 drift 與 secret externalization。
- P1:補 Kali 112、111、168 維護窗口 owner 欄位,仍不做 upgrade / restart / scan。
- P2:把
/zh-TW/iwooos配置控管摘要產品化,但不得顯示內部工作對話、token、secret 或可執行按鈕。
8. 邊界
本清冊完成不代表 Nginx reload、DNS 修改、TLS renew、ArgoCD sync、kubectl、SSH 主機修改、workflow 修改、runner 啟用、secret rotation、active scan、agent-bounty runtime、payout、withdrawal、deploy 或任何 runtime execution 已授權。