安全與合規
保護什麼、如何保護、誰負責 —— 供安全評審。
本頁面面向安全評審者、IT 管理員,以及需要回答"引入它安全嗎?"的任何人。
一句話威脅模型
ObjectOS 作為單個 Node.js 程序執行在你的網路內,與你的資料庫通訊,從不回傳。被攻破的爆炸半徑即其連線的資料庫上的資料 —— 僅此而已。
資料駐留
| 資料類別 | 存放在 | 是否離開你的網路? |
|---|---|---|
| 業務記錄 | 你的資料庫 | 否 |
| 使用者賬戶、會話、OAuth token | 你的資料庫 | 否 |
| 審計日誌 | 你的資料庫 | 否 |
| 設定、API key | 你的資料庫 / 你的金鑰管理器 | 否 |
| 上傳檔案 | 你的磁碟或 S3 相容儲存桶 | 否 |
| 遙測/使用資料 | — | 不收集 |
ObjectOS 零外發呼叫,除非你顯式配置(OIDC discovery、郵件提供商、AI 提供商、webhook 目標、外部儲存)。它不回傳、不查 license server、不輪詢更新。
加密
| 層 | 機制 | 責任方 |
|---|---|---|
| 傳輸中(瀏覽器 ↔ ObjectOS) | TLS,在你的 edge / ingress 終結 | 你 |
| 傳輸中(ObjectOS ↔ 資料庫) | 驅動級 TLS(Postgres sslmode=require、MongoDB tls=true……) | 你 —— 設定連線字串 |
| 靜態(業務資料) | 資料庫原生(如 Postgres TDE、RDS encryption) | 你 |
| 靜態(上傳檔案) | 儲存原生(S3 SSE、R2 預設、磁碟級 FDE) | 你 |
| DB 中金鑰(settings、OIDC client secret) | 由 settings 服務加密 | ObjectOS |
| 會話 cookie / token | 用 OS_AUTH_SECRET 進行 HMAC 簽名 | ObjectOS |
| API key 值 | DB 中雜湊儲存 —— 洩露的 DB 行無法重建 key | ObjectOS |
認證
內建(通過 @objectstack/plugin-auth,基於 Better Auth):
- 帶驗證 + 重置的郵箱/密碼
- 帶撤銷的會話管理
- Social OAuth(Google、GitHub、Microsoft、Apple……)
- 企業 OIDC/SSO(Okta、Entra ID、Keycloak、Ping)
- 雙因素(TOTP)
- Passkey / WebAuthn
- 魔法連結
- 手機號 + 簡訊 OTP 登入與密碼重置(通過
auth.plugins.phoneNumber顯式開啟;支援阿里雲 / Twilio 通道,自帶限流) - CLI/瀏覽器裝置流
- API key(雜湊、可過期、可撤銷、繫結到使用者)
- 面向 MCP 客戶端的自助 OAuth 2.1(授權碼 + PKCE、動態客戶端註冊、按 scope 推導許可權上限)
- 管理員直接建立使用者與批次匯入(一次性密碼 +
must_change_password強制輪換)
見認證。
授權
分層強制(通過 @objectstack/plugin-security),遵循許可權模型 v2(ObjectStack 13,ADR-0090):
- 物件許可權 —— 每個許可權集對每個物件的 CRUD,直接分配給使用者或通過扁平的崗位分發
- 組織級預設值(OWD) —— 帶所有者的自定義物件預設
private共享模型;匿名資料訪問預設拒絕 - 行級安全 —— 注入查詢的宣告式策略表示式;不可選
- 欄位級安全 —— 響應中剝離欄位 / 寫入時拒絕(鍵帶物件限定,由校驗規則強制)
- 組織作用域 —— 多租戶隔離;繞過需要顯式
viewAllRecords
系統上下文操作繞過檢查以便內部作業 / 遷移可執行 —— 這些路徑可審計。
配套機制:
- 解釋引擎 ——
explain(principal, object, operation)按層報告判定結果並逐層歸因,與強制執行使用相同的求值器(構造上不漂移)。 - 編寫期校驗 ——
os compile以安全態勢閘門構建(security-owd-unset、security-anchor-high-privilege、security-fls-unqualified-key等);可選提交access-matrix.json快照,任何能力漂移都會讓 CI 失敗,直到顯式重新批准。 - 委託管理 —— 許可權集可攜帶
adminScope,子管理員只能在其業務單元子樹內、按白名單管理分配,且記錄granted_by審計。 - MCP 許可權上限 —— 通過 OAuth 接入的 AI 代理在
effective_permission = scope_ceiling ∩ user_grants下執行(data:read/data:write/actions:execute),失敗即關閉。
見許可權。
審計與證據
當審計能力被載入時(@objectstack/plugin-audit):
- 每個物件上的每次 CRUD 操作 → 審計行。
- 欄位變更的前後值。
- 認證、許可權授予、會話撤銷事件。
- 審計行不可變:不能修改,只能歸檔。
- 保留期在物件的
lifecycle塊上宣告(sys_audit_log出廠為熱存 90 天后歸檔),可通過lifecycle.retention_overrides按環境調整;與你的 DB 歸檔策略配合。
這是 SOC 2 CC6/CC7、ISO 27001 A.12.4、HIPAA §164.312(b) 和 GDPR Article 30 的證據基礎。
合規框架
ObjectOS 提供每個常見框架所要求的技術原語。認證是部署的屬性,而非軟體的屬性 —— 但控制項對映清晰:
| 框架 | ObjectOS 提供 |
|---|---|
| SOC 2 | 訪問控制(CC6)、變更管理(審計日誌)、加密(部署)、監控(可觀測性)、備份(operate/backup) |
| ISO 27001 | A.5 政策(RBAC)、A.8 資產管理(物件目錄)、A.9 訪問控制、A.12 運營、A.18 合規 |
| HIPAA | 訪問控制(§164.312(a))、審計控制(§164.312(b))、完整性(不可變審計)、傳輸安全(TLS) |
| GDPR | Article 30 處理記錄(審計)、Article 32 處理安全、Article 17 刪除權(支援軟刪 + 硬刪)、資料駐留(你選擇區域) |
| CCPA / 中國 DSL / 俄羅斯 152-FZ | 在正確區域自託管即滿足駐留;訪問控制 + 審計覆蓋大部分報告義務 |
ObjectOS 本身未認證,因為認證針對執行中的部署,而非二進位制。你的部署可以被認證 —— 已有許多達成。
金鑰處理
| 金鑰 | 放置位置 |
|---|---|
OS_AUTH_SECRET | 你的金鑰管理器(Vault、AWS Secrets Manager、k8s Secret);注入為環境變數 |
| 帶憑據的資料庫 URL | 同 |
| OIDC client secret | 同 |
| OAuth provider secret | 同 |
| API provider key(郵件、儲存、AI) | 同 |
| DB 中儲存的 settings | 由 settings 服務靜態加密 |
絕不要將金鑰烘焙到 artifact(objectstack.json)、Docker 映象、compose 檔案或 Git 中。Console 中的 settings UI 將 env 管理的值顯示為鎖定狀態,運維不會意外覆蓋。
網路模型
必需入站:
- 從你的 ingress / 負載均衡器到 ObjectOS
:3000(預設)的 HTTPS。
必需出站(僅當你配置這些功能時):
- 你的資料庫(Postgres / Mongo / Turso / ……)。
- S3 相容儲存(若啟用
storage能力且使用 S3 介面卡)。 - OIDC discovery URL(若啟用 SSO)。
- 郵件提供商 API(Resend / Postmark)。
- AI 提供商 API(OpenAI / Anthropic / Google / ……)。
- Webhook 目標。
這就是全部出站表面。見氣隙瞭解切斷更多的部署。
AI:工具、審批、隔離
AI Builder 是你將暴露的最敏感安全表面,因此除上述一切之外還有自己的強制層。
AI 如何變更狀態
模型無法直接寫入你的資料庫。狀態變更的唯一方式是發出結構化的工具呼叫,由 AI 服務接收、校驗和入隊。鏈條:
user prompt
→ model emits tool call (e.g. add_field { object: 'ticket', name: 'severity', type: 'select' })
→ AI service validates payload against the tool's Zod schema
→ if the tool is "mutating": queue as pending action (no state change yet)
→ human reviewer approves → mutation applied → audit row written
→ if the tool is "read-only": run immediately, response returned to model有 11 個第一方後設資料工具(見 Build → AI Builder)加每個已宣告 Action 對應的一個 action_<name> 工具。每個工具 —— 第一方或自定義 —— 都遵循相同的生命週期。
許可權鍵
| 鍵 | 授予 |
|---|---|
ai:chat | 進行對話;消費模型;讓 Agent 呼叫只讀工具 |
ai:complete | 原始補全端點(無 Agent 迴圈) |
ai:conversations | 列出/檢查/刪除對話(取決於 RBAC 作用域,自己或全部) |
ai:agents | 管理 Agent 後設資料(與 ai:chat 一同用於呼叫) |
ai:tools | 列出工具目錄 |
ai:execute | 通過 REST 直接呼叫工具(高階 —— 通常僅 ambient agent 需要) |
ai:read | 讀取 pending-actions 佇列與模型列表 |
ai:approve | 批准/拒絕排隊中的變更 |
ai:admin | 完全的 AI 服務管理 |
關鍵拆分是 ai:chat ≠ ai:approve。給大多數使用者 ai:chat 使助手可用;為應審查結構性變更的管理員 / 應用所有者保留 ai:approve。終端使用者因此可以安全地"vibe-build" —— 他們最壞只能將糟糕的變更入隊,需別人接受。
租戶隔離
- Agent、對話、知識庫和 pending action 作用於一個環境(租戶)。租戶 A 不能看到租戶 B 的對話、AI 提議的工具或知識語料 —— 即使從同一 marketplace 包安裝的同一 Agent 定義也不行。
- 後設資料工具(
create_object、add_field……)針對呼叫方租戶中的啟用包操作。它們無法觸及包外。 - 工具輸入經 CEL 校驗,引擎拒絕對保留系統包(
sys.*)或其他租戶物件名的引用。
審計事件
當審計能力被載入時:
ai.chat.message—— 每條使用者/助手訊息,帶模型 + token 計數ai.tool.call—— 工具名、已校驗輸入、完整輸出(或錯誤)ai.pending_action.queued—— 提議的變更,完整 diffai.pending_action.approved/.rejected—— 誰、何時、為何決定ai.metadata.applied—— 對後設資料儲存的實際寫入,帶 diff
這些行不可變,可匯出用於安全審查或費用分攤。按(提供商、模型、使用者)的 token 計數供成本歸因。
提示注入態勢
間接提示注入(如 Agent 檢索的文件中含惡意內容)是真實風險;ObjectOS 通過構造減少爆炸半徑:
- AI 無法繞過工具校驗 —— 即使被說服發出惡意載荷,Zod schema 也會在到達引擎前拒絕畸形輸入。
- 變更性工具始終入隊。注入的提示無法靜默寫入資料庫。
- 工具呼叫繼承終端使用者的許可權,而非模型的服務賬戶許可權。使用者永遠無法通過 AI 做他們自己在 Console 或 REST 中也做不到的事。
- 載入到 Agent 中的 Skill 是版本化且顯式的 —— 見 Build → IDE Skills 和 Build → AI Builder。
外部 AI 提供商資料流
當你配置一個提供商(OpenAI、Anthropic……)時,僅以下內容離開你的網路:
- 模型所需的對話歷史(受你的 AI 服務
redact配置約束 —— 見 Configure → AI) - 工具定義(名稱、JSON schema —— 無記錄資料)
- 模型繼續所需的工具輸出(如使用者明確請求的查詢結果)
對氣隙部署,將 AI 服務指向本地 Ollama / vLLM / TGI 端點,同樣的流程仍在你的邊界內。
漏洞披露
請私下報告安全問題至 security@objectstack.ai。我們將在 1 個工作日內響應。請勿就安全問題提交公開 GitHub issue。
供應鏈
- 預構建映象由 github.com/objectstack-ai/objectos 釋出,帶可復現構建溯源。
- 所有
@objectstack/*包在 GitHub 上有釋出原始碼 —— Apache-2.0,無混淆。 - 生產中使用 SHA 釘死的映象 tag(
sha-<short>)以避免漂移;見 Docker。
推薦加固清單
- 在 edge 用真實證書終結 TLS。
-
OS_AUTH_SECRET為 32+ 位元組隨機,放在金鑰管理器。 - 資料庫連線使用 TLS。
- TLS 校驗後啟用 HSTS。
- CORS origin 顯式(帶憑據時永不
*)。 - auth 端點限速(推薦
10/min/IP)。 - 審計保留期匹配策略。
- 人類賬戶用 OIDC;機器賬戶用 API key。
- 備份 + 恢復演練已執行並計時。
- 反向測試:跨組織訪問被拒、欄位安全有效、過期會話被拒。
- 映象固定到
sha-<short>或語義版本 tag。 - 每次釋出前在 CI 中
os doctor乾淨。
完整上線清單見生產就緒。