openclaw policy
openclaw policy 由隨附的 Policy 外掛提供。它是在現有 OpenClaw 設定之上的企業合規層,而非第二套設定系統。你在 policy.jsonc 中撰寫要求;OpenClaw 將作用中的工作區觀察結果視為證據;Policy 透過 doctor --lint 回報偏離情形。Policy 不會強制執行工具呼叫,也不會在請求時重寫執行階段行為,且不會證明個別代理程式的認證資訊儲存區,例如 auth-profiles.json。
Policy 會檢查已設定的頻道、MCP 伺服器、模型供應商、網路 SSRF 防護態勢、輸入流量/頻道存取、閘道暴露情形與節點命令態勢、已撰寫的訊息路由探測、代理程式工作區存取、沙箱態勢、資料處理態勢、秘密供應商/驗證設定檔態勢,以及受治理的工具中繼資料(TOOLS.md)。當工作區需要持久且可檢查的聲明時,請使用它,例如「不得啟用 Telegram」或「受治理的工具必須宣告風險與擁有者中繼資料」。如果只需要本機行為,而不需要證明或偏離偵測,使用一般設定即可。
快速開始
policy.jsonc,此外掛仍會保持啟用,讓 doctor 能回報缺少的成品,而不是默默略過檢查。
請手動撰寫 policy.jsonc;它不會根據目前設定產生。每個頂層區段都是規則命名空間:只有在其中存在具體規則時才會執行檢查(不支援的區段或鍵會以 policy/policy-jsonc-invalid 失敗,而不是被默默忽略)。涵蓋所有支援區段的最小範例:
- 在拒絕非回送繫結時省略
gateway.bind,表示你接受執行階段預設值;若要嚴格符合規範,請設定gateway.bind: "loopback"。 - 若代理程式為唯讀,請在適用的預設值/代理程式上,將沙箱
mode設為all或non-main,並將workspaceAccess設為none或ro。缺少沙箱模式或將其設為off,均不符合唯讀 Policy。 agents.workspace.denyTools接受exec、process、write、edit、apply_patch。設定中的工具拒絕群組group:fs(檔案異動)與group:runtime(Shell/程序)可滿足同等態勢。- 只有存在
execApprovals規則時,執行核准檢查才會讀取即時的exec-approvals.json成品;缺少或無效的成品屬於無法觀察的證據,而非模擬的通過結果。 - 秘密與驗證設定檔證據只會記錄供應商/來源態勢及 SecretRef 中繼資料,絕不記錄原始值。Policy 不會讀取或證明個別代理程式的認證資訊儲存區,例如
auth-profiles.json。 - 資料處理證據僅代表設定層級的態勢(遮蔽模式、遙測擷取切換、工作階段維護模式、逐字稿索引設定)。它不會檢查記錄、遙測匯出、逐字稿或記憶檔案,而乾淨的結果也無法證明其中不存在個人資料或秘密。
- 路由探測會重複使用 OpenClaw 的執行階段繫結解析器。路由證據只會記錄探測 ID、解析出的代理程式、比對種類,以及已遮蔽的繫結中繼資料。它絕不記錄對等方、帳號、社群、團隊或角色識別碼。新增路由區段會刻意變更 Policy 與證明雜湊;未包含路由的 Policy 會保留現有證據形態。
Policy 規則參考
下方每條規則皆為選用;只有在規則存在時才會執行檢查。觀察到的狀態來自現有 OpenClaw 設定或工作區中繼資料。範圍覆寫
當特定代理程式或頻道所需的 Policy 比頂層基準更嚴格時,請使用scopes.<scopeName>。範圍名稱只是標籤;比對會使用範圍內的選取器。覆寫採累加方式:全域規則仍會執行,而範圍規則可以針對相同證據新增自己的發現。
如果
agentIds 項目不存在於 agents.entries.* 中,OpenClaw 會針對該執行階段代理程式 ID 所繼承的全域/預設態勢評估範圍規則,而不會略過。
sandbox.containers.*)只會根據相符代理程式的沙箱後端可公開的證據進行檢查。如果後端無法觀察你為其啟用的規則,Policy 會回報 policy/sandbox-container-posture-unobservable,而非判定通過;請將容器規則限定於使用可公開相關證據之後端的代理程式群組。
頂層 ingress.session.requireDmScope 維持全域;session.dmScope 並非可歸因於頻道的證據,因此無法依 channelIds 限定範圍。
policy.jsonc 中存在的每個範圍都必須有效且可強制執行。
頻道
MCP 伺服器
模型供應商
網路
訊息路由
探測 ID 必須唯一。路由支援
channel、選用的 accountId、
peer、parentPeer、guildId、teamId 和 memberRoleIds。對等端種類包括
direct、group 和 channel。matchedBy 可包含一或多個執行階段
比對種類,包括 binding.peer、binding.account、binding.channel
或 default。
路由檢查僅為符合性檢查。它們不會變更啟動、
訊息傳遞、繫結優先順序或後援行為。發現的問題需要
由操作人員審查,因為自動變更繫結可能會重新導向
私人訊息。
輸入與頻道存取
閘道
gateway.nodes.denyCommands 是精確且區分大小寫的原則拒絕超集合規則。
當原則必須證明 OpenClaw 設定明確
拒絕特殊權限節點命令時,請使用此規則。有意允許特殊權限
節點命令的部署應在審查後更新 policy.jsonc,而非僅依賴
gateway.nodes.commands.allow。
代理程式工作區
沙箱安全態勢
原則會將缺少的
sandbox.mode 視為其隱含預設值 off,因此
sandbox.requireMode 會將全新或未設定的沙箱回報為不在
["all"] 等允許清單內。
資料處理
密鑰
執行核准
執行核准檢查會讀取執行階段exec-approvals.json 成品:
預設為 ~/.openclaw/exec-approvals.json,或在設定 OPENCLAW_STATE_DIR 時使用
$OPENCLAW_STATE_DIR/exec-approvals.json。
execApprovals.defaults.* 或 execApprovals.agents.* 下的安全態勢規則
要求可讀取的成品證據;缺少或無效的成品會回報為
無法觀察的證據,而非以盡力而為方式判定通過。可讀取後,省略的
欄位會繼承執行階段預設值:缺少的 defaults.security 為 full,而
缺少的代理程式安全性會繼承該預設值。證據包括 defaults、
agents.*、agents.*.allowlist[].pattern、選用的 argPattern、有效的
autoAllowSkills 安全態勢及項目來源,但絕不包括通訊端路徑/權杖、
commandText、lastUsedCommand、已解析路徑或時間戳記。
範例:要求核准成品、拒絕寬鬆的預設值,並且僅允許
所選代理程式採用已審查的執行核准安全態勢。
驗證設定檔
工具中繼資料
工具安全態勢
執行檢查
撰寫期間執行僅限原則的檢查:policy check 僅執行原則檢查集,並輸出證據、發現項目
和證明雜湊。啟用原則外掛後,相同的發現項目也會出現在
openclaw doctor --lint 中。
將操作者原則檔案與撰寫的基準進行比較:
policy compare 會依據原則檔案語法檢查原則檔案語法;它
不會檢查執行階段狀態、證據、認證資訊或祕密。它使用管理具範圍覆疊的相同
規則中繼資料:允許清單必須維持相同或更窄,拒絕清單必須維持
相同或更廣,必要的布林值必須保持其值,已排序的字串只能朝
所設定順序中更嚴格的一端移動,而完全符合清單必須相符。基準可以是
組織撰寫的原則;受檢查的原則可以加入更嚴格的值或
額外規則。當頂層受檢查規則具有相同或更嚴格的限制時,
可以滿足具範圍的基準規則。檔案之間的範圍名稱不必相符;
比較是以選取器(agentIds/channelIds)和欄位為鍵。
對於路由探查,每個基準探查 ID 都必須保留相同的路由
和預期代理程式。受檢查的原則可以加入探查或縮窄 matchedBy,但
移除探查、變更其路由或代理程式,或放寬其接受的比對
種類,都會減弱限制。
乾淨的比較(--json):
policy check --json 輸出包含操作者或
監督者可記錄的穩定雜湊:
設定原則
原則設定位於plugins.entries.policy.config 之下。
將
plugins.entries.policy.config.enabled 設為 false,可在保留外掛安裝的同時,
停用工作區的原則檢查。
接受原則狀態
JSON 輸出範例:attestation.policy.hash 識別編寫的規則成品。evidence
記錄檢查所使用的已觀察 OpenClaw 狀態,而
workspace.hash 識別該證據酬載。findingsHash 識別
確切的發現結果集。checkedAt 記錄檢查的執行時間。
attestationHash 識別穩定宣告(政策雜湊、證據雜湊、
發現結果雜湊及乾淨/非乾淨狀態),並刻意排除 checkedAt,
因此相同的政策狀態一律會產生相同的證明雜湊。這
四個值共同構成一次政策檢查的稽核四元組。
如果閘道或監督程式使用政策來封鎖、核准或註記
執行階段動作,應記錄上一次乾淨檢查的證明雜湊。
checkedAt 會保留在 JSON 輸出中供稽核日誌使用,但不屬於
穩定雜湊的一部分。
接受政策狀態的生命週期:
- 編寫或審查
policy.jsonc。 - 執行
openclaw policy check --json。 - 若檢查乾淨,將
attestation.policy.hash記錄為expectedHash。 - 將
attestation.attestationHash記錄為expectedAttestationHash。 - 在 CI 或發布閘門中重新執行
openclaw doctor --lint。
expectedAttestationHash 會變更。
啟用或升級 agents.workspace 規則會將 agentWorkspace 證據
加入工作區雜湊和證明雜湊;啟用後請審查新證據,並
重新整理已接受的證明雜湊。啟用或升級
工具態勢規則也會以相同方式加入 toolPosture 證據。
openclaw policy watch 會重新執行檢查,並在目前證據不再
符合 expectedAttestationHash 時回報:
--once。若未指定
--once,預設每兩秒輪詢一次;使用 --interval-ms 變更
間隔。
發現結果
一項發現可以同時包含
target(觀察到但不符合規範的工作區項目)
與 requirement(導致產生該發現的編寫規則)。
目前兩者都是 oc:// 位址字串,但欄位名稱描述的是原則角色,
而非位址格式。
發現範例:
修復
doctor --lint 和 policy check 為唯讀。
只有在明確啟用 workspaceRepairs 時,doctor --fix 才會編輯由原則管理的工作區設定;否則,檢查只會報告其
將修復的內容,並保持設定不變。
在此版本中,修復功能可以停用被 channels.denyRules 拒絕的頻道,並
套用下列自動縮限修復。請僅在審查原則檔案後啟用 workspaceRepairs,
因為有效規則可能會變更工作區設定:
- 當全域原則禁止提升權限的工具時,設定
tools.elevated.enabled=false - 當原則要求拒絕特定工具時,將缺少的必要拒絕工具 ID 新增至
tools.deny或agents.entries.*.tools.deny - 將不安全的
gateway.controlUi.*切換項目設為false - 當原則拒絕遠端閘道模式時,設定
gateway.mode=local - 當原則拒絕閘道 HTTP API 端點時,將回報的
gateway.http.endpoints.*.enabled路徑設為false - 當原則拒絕開放群組輸入時,將回報的頻道輸入
groupPolicy路徑設為allowlist - 當原則要求群組提及時,將回報的頻道輸入
requireMention路徑設為true - 當原則要求遮蔽敏感記錄內容時,設定
logging.redactSensitive=tools - 當原則拒絕擷取遙測內容時,設定
diagnostics.otel.captureContent=false,或 針對物件形式的遙測擷取設定,設定diagnostics.otel.captureContent.enabled=false
tools.deny 時,會略過限定範圍的必要拒絕修復,
因為將必要工具新增至根層級設定會影響限定範圍原則目標以外的項目。
代理程式本機的必要拒絕修復可以更新所回報的 agents.entries.*.tools.deny 路徑。
當問題報告繼承的 channels.defaults.* 時,會略過限定範圍的頻道輸入修復,
因為變更共用頻道預設值會影響限定範圍原則目標以外的項目。
閘道 HTTP URL 擷取允許清單問題仍需手動處理,因為自動修復無法選擇正確的端點 URL
允許清單值。
閘道繫結和節點命令問題仍需要審查。當
policy/gateway-non-loopback-bind 或 policy/gateway-node-command-denied
可對應至設定路徑時,doctor --fix 會將建議的
gateway.bind 或 gateway.nodes.commands.deny 變更回報為已略過的預覽
指引。它不會套用變更,而且在操作人員審查並更新設定或原則前,
該問題不會計為已修復。