Перейти до основного вмісту

openclaw policy

openclaw policy надається вбудованим Policy Plugin. Policy є корпоративним шаром перевірки відповідності поверх наявних налаштувань OpenClaw. Він не додає другої системи конфігурації. policy.jsonc визначає створені вимоги, OpenClaw спостерігає активний робочий простір як доказ, а перевірки стану policy повідомляють про відхилення через doctor --lint. Остаточний сигнал відповідності - чистий запуск doctor --lint; policy додає знахідки до цієї спільної поверхні lint замість створення окремого шлюзу стану. Наразі Policy керує налаштованими каналами, серверами MCP, постачальниками моделей, станом мережевого SSRF, станом доступу ingress/каналів, станом експозиції Gateway, станом робочого простору агента, станом обробки даних, станом постачальника секретів конфігурації OpenClaw/профілю автентифікації та керованими оголошеннями інструментів. Наприклад, IT або оператор робочого простору може зафіксувати, що Telegram не є затвердженим постачальником каналів, обмежити сервери MCP і посилання на моделі затвердженими записами, вимагати, щоб доступ fetch/browser до приватної мережі залишався вимкненим, вимагати, щоб ізоляція сесій прямих повідомлень і стан channel ingress залишалися в межах перевірених обмежень, вимагати, щоб bind/auth/HTTP експозиція Gateway залишалася в межах перевірених обмежень, вимагати, щоб доступ до робочого простору агента й заборони інструментів залишалися в перевіреному стані, вимагати, щоб SecretRefs конфігурації OpenClaw використовували керованих постачальників, вимагати, щоб профілі автентифікації конфігурації містили метадані постачальника/режиму, вимагати, щоб керовані інструменти містили метадані ризику та чутливості, вимагати редагування чутливих логів, заборонити захоплення вмісту телеметрії, вимагати підтримування збереження сесій, заборонити індексацію пам’яті транскриптів сесій, а потім використовувати doctor --lint як спільний шлюз відповідності. Використовуйте policy, коли робочому простору потрібне довговічне твердження на кшталт “ці канали не повинні бути ввімкнені” або “керовані інструменти повинні оголошувати метадані затвердження” і повторюваний спосіб довести, що OpenClaw усе ще відповідає цьому твердженню. Використовуйте лише звичайну конфігурацію та документацію робочого простору, коли вам потрібна тільки локальна поведінка і не потрібні знахідки policy або вихід атестації.

Швидкий старт

Увімкніть вбудований Policy Plugin перед першим використанням:
openclaw plugins enable policy
Коли policy увімкнено, doctor може завантажувати перевірки стану policy без активації довільних plugins. Plugin залишається ввімкненим, якщо policy.jsonc відсутній, тож doctor може повідомити про відсутній артефакт. Policy створюється автором, а не генерується з поточних налаштувань користувача. Мінімальна policy для каналів, серверів MCP, постачальників моделей, мережевого стану, доступу ingress/каналів, експозиції Gateway, стану робочого простору агента, налаштованого стану середовища виконання sandbox, стану обробки даних OpenClaw, стану постачальника секретів конфігурації/профілю автентифікації, стану файлу затверджень exec і метаданих інструментів має такий вигляд:
{
  "channels": {
    "denyRules": [
      {
        "id": "no-telegram",
        "when": { "provider": "telegram" },
        "reason": "Telegram is not approved for this workspace.",
      },
    ],
  },
  "mcp": {
    "servers": {
      "allow": ["docs"],
      "deny": ["untrusted"],
    },
  },
  "models": {
    "providers": {
      "allow": ["openai", "anthropic"],
      "deny": ["openrouter"],
    },
  },
  "network": {
    "privateNetwork": {
      "allow": false,
    },
  },
  "ingress": {
    "session": {
      "requireDmScope": "per-channel-peer",
    },
    "channels": {
      "allowDmPolicies": ["pairing", "allowlist", "disabled"],
      "denyOpenGroups": true,
      "requireMentionInGroups": true,
    },
  },
  "gateway": {
    "exposure": {
      "allowNonLoopbackBind": false,
      "allowTailscaleFunnel": false,
    },
    "auth": {
      "requireAuth": true,
      "requireExplicitRateLimit": true,
    },
    "controlUi": {
      "allowInsecure": false,
    },
    "remote": {
      "allow": false,
    },
    "http": {
      "denyEndpoints": ["chatCompletions", "responses"],
      "requireUrlAllowlists": true,
    },
  },
  "agents": {
    "workspace": {
      "allowedAccess": ["none", "ro"],
      "denyTools": ["exec", "process", "write", "edit", "apply_patch"],
    },
  },
  "dataHandling": {
    "sensitiveLogging": {
      "requireRedaction": true,
    },
    "telemetry": {
      "denyContentCapture": true,
    },
    "retention": {
      "requireSessionMaintenance": true,
    },
    "memory": {
      "denySessionTranscriptIndexing": true,
    },
  },
  "secrets": {
    "requireManagedProviders": true,
    "denySources": ["exec"],
    "allowInsecureProviders": false,
  },
  "auth": {
    "profiles": {
      "requireMetadata": ["provider", "mode"],
      "allowModes": ["api_key", "token"],
    },
  },
  "execApprovals": {
    "requireFile": true,
    "defaults": { "allowSecurity": ["deny"] },
    "agents": {
      "allowSecurity": ["deny", "allowlist"],
      "allowAutoAllowSkills": false,
      "allowlist": { "expected": ["deploy", "status"] },
    },
  },
  "tools": {
    "requireMetadata": ["risk", "sensitivity", "owner"],
    "profiles": {
      "allow": ["messaging", "minimal"],
    },
    "fs": {
      "requireWorkspaceOnly": true,
    },
    "exec": {
      "allowSecurity": ["deny", "allowlist"],
      "requireAsk": ["always"],
      "allowHosts": ["sandbox"],
    },
    "elevated": {
      "allow": false,
    },
    "denyTools": ["group:runtime", "group:fs"],
  },
}
Правила є джерелом істини. Блок категорії є лише простором імен; перевірки виконуються, коли присутнє конкретне правило. OpenClaw читає поточні налаштування channels.*, mcp.servers.*, models.providers.*, вибрані посилання на моделі агента, налаштування мережевого SSRF, область сесії прямих повідомлень, DM policy каналу, політику груп каналу, шлюзи згадок у каналі/групі, стан bind/auth/Control UI/Tailscale/remote/HTTP Gateway, стан доступу до робочого простору sandbox агента конфігурації OpenClaw і стан заборон інструментів, стан конфігурації обробки даних, походження постачальника секретів конфігурації та SecretRef, метадані профілю автентифікації конфігурації, налаштований глобальний/поагентний стан інструментів і оголошення TOOLS.md як докази, а потім повідомляє про спостережуваний стан, що не відповідає вимогам. Якщо policy забороняє non-loopback bind Gateway, опускайте gateway.bind лише тоді, коли ви готові переглядати стандартне значення runtime; установіть gateway.bind=loopback для суворої відповідності конфігурації. Для стану агента лише для читання налаштуйте режим sandbox у відповідних типових значеннях або агенті та встановіть workspaceAccess у none або ro; пропущений режим sandbox або off не задовольняє policy лише для читання/без запису. agents.workspace.denyTools підтримує exec, process, write, edit і apply_patch; конфігурація OpenClaw group:fs охоплює інструменти мутації файлів, а group:runtime охоплює інструменти shell/process. Policy стану інструментів спостерігає tools.profile, tools.allow, tools.alsoAllow, tools.deny, tools.fs.workspaceOnly, tools.exec.security, tools.exec.ask, tools.exec.host, tools.elevated.enabled і ті самі поагентні перевизначення agents.list[].tools.*. Policy затверджень exec читає названий продуктовий артефакт exec-approvals.json лише тоді, коли присутнє правило execApprovals; докази записують типові значення, поагентний стан і шаблони allowlist без socket-токенів або тексту останньої використаної команди. Policy не примусово застосовує виклики інструментів під час runtime. Докази секретів записують стан постачальника/джерела та метадані SecretRef, але ніколи сирі значення секретів. Policy не читає й не атестує поагентні сховища облікових даних, як-от auth-profiles.json; ці сховища залишаються у власності наявних потоків автентифікації та облікових даних. Докази обробки даних є лише станом на рівні конфігурації: вони перевіряють налаштований режим редагування, перемикачі захоплення вмісту телеметрії, режим підтримування сесій і налаштування індексації пам’яті транскриптів сесій. Вони не перевіряють сирі логи, експорти телеметрії, вміст транскриптів, файли пам’яті й не доводять, що персональних даних або секретів не існує.

Довідник правил policy

Кожне поле policy нижче є необов’язковим. Перевірка виконується лише тоді, коли відповідне правило присутнє в policy.jsonc. Спостережуваний стан - це наявна конфігурація OpenClaw або метадані робочого простору; policy повідомляє про відхилення, але не переписує поведінку runtime, якщо шлях ремонту явно не доступний і не ввімкнений. Файли policy суворі: непідтримувані секції або ключі правил повідомляються як policy/policy-jsonc-invalid, а не ігноруються. Накладення policy зберігають широкі правила верхнього рівня глобальними, а потім дозволяють іменованим блокам областей додавати суворіші звичайні секції policy для явних селекторів. Назва області є лише описовим контейнером; зіставлення використовує значення селекторів усередині області. Накладення є адитивним: глобальні твердження все одно виконуються, а scoped claim може створити власну знахідку щодо тієї самої спостережуваної конфігурації.

Областеві накладення

Використовуйте scopes.<scopeName>, коли одному набору агентів або каналів потрібна суворіша policy, ніж базовий рівень верхнього рівня. Секції з областю агента використовують agentIds, що підтримує tools.*, agents.workspace.*, sandbox.*, dataHandling.memory.* і execApprovals.*. Channel-scoped ingress використовує channelIds, що підтримує ingress.channels.*. Непідтримувані секції відхиляються, а не ігноруються. Якщо запис agentIds не присутній в agents.list[], OpenClaw оцінює scoped rule щодо успадкованого глобального/типового стану для цього runtime agent id.
{
  "tools": {
    "exec": {
      "allowHosts": ["sandbox", "node"],
    },
  },
  "sandbox": {
    "requireMode": ["all", "non-main"],
  },
  "scopes": {
    "release-workspace": {
      "agentIds": ["release-agent", "review-agent"],
      "agents": {
        "workspace": {
          "allowedAccess": ["none", "ro"],
        },
      },
    },
    "release-lockdown": {
      "agentIds": ["release-agent"],
      "tools": {
        "exec": {
          "allowHosts": ["sandbox"],
          "allowSecurity": ["deny", "allowlist"],
          "requireAsk": ["always"],
        },
        "denyTools": ["exec", "process", "write", "edit", "apply_patch"],
      },
      "sandbox": {
        "requireMode": ["all"],
        "allowBackends": ["docker"],
      },
      "dataHandling": {
        "memory": {
          "denySessionTranscriptIndexing": true,
        },
      },
    },
    "shell-sandbox": {
      "agentIds": ["shell-agent"],
      "sandbox": {
        "allowBackends": ["openshell"],
        "containers": {
          "requireReadOnlyMounts": false,
        },
      },
    },
    "telegram-ingress": {
      "channelIds": ["telegram"],
      "ingress": {
        "channels": {
          "allowDmPolicies": ["pairing"],
          "denyOpenGroups": true,
          "requireMentionInGroups": true,
        },
      },
    },
  },
}
Той самий агент може з’являтися в кількох областях, коли кожна область керує різними полями, як показано вище. Повторене scoped field для того самого агента має бути таким самим або суворішим відповідно до метаданих policy; слабші дубльовані твердження відхиляються. Метадані суворості трактують allow-lists як підмножини, deny-lists як надмножини, а обов’язкові булеві значення як фіксовані вимоги. Policy стану контейнера оцінюється лише щодо доказів, які OpenClaw може спостерігати для зіставленого агента. Якщо ввімкнене правило sandbox.containers.* застосовується до агента, backend sandbox якого не може відкрити це поле, policy повідомляє policy/sandbox-container-posture-unobservable замість того, щоб вважати твердження успішним. Використовуйте окремі області agentIds для груп агентів, які використовують різні backends sandbox, і залишайте непідтримувані правила контейнерів unset або false для груп, де ці поля не можна спостерігати. Верхньорівневе ingress.session.requireDmScope залишається глобальним, оскільки session.dmScope не є доказом, що атрибутується каналу.
СелекторПідтримувані розділиВикористовуйте, коли
agentIdstools, agents.workspace, sandbox, dataHandling.memory, and execApprovalsОдному або кільком агентам runtime потрібні суворіші правила.
channelIdsingress.channelsОдному або кільком каналам потрібні суворіші правила входу.
Кожна область, наявна в policy.jsonc, має бути дійсною та придатною до примусового застосування.

Канали

Поле політикиСпостережуваний станВикористовуйте, коли
channels.denyRules[].when.providerПостачальник channels.* і ввімкнений станЗаборонити налаштовані канали від постачальника, наприклад telegram.
channels.denyRules[].reasonПовідомлення знахідки та контекст підказки щодо виправленняПояснити, чому постачальника заборонено.

MCP-сервери

Поле політикиСпостережуваний станВикористовуйте, коли
mcp.servers.allowІдентифікатори mcp.servers.*Вимагати, щоб кожен налаштований MCP-сервер був у списку дозволених.
mcp.servers.denyІдентифікатори mcp.servers.*Заборонити конкретні налаштовані ідентифікатори MCP-серверів.

Постачальники моделей

Поле політикиСпостережуваний станВикористовуйте, коли
models.providers.allowІдентифікатори models.providers.* і вибрані посилання на моделіВимагати, щоб налаштовані постачальники і вибрані посилання на моделі використовували схвалених постачальників.
models.providers.denyІдентифікатори models.providers.* і вибрані посилання на моделіЗаборонити налаштованих постачальників і вибрані посилання на моделі за ідентифікатором постачальника.

Мережа

Поле політикиСпостережуваний станВикористовуйте, коли
network.privateNetwork.allowМеханізми обходу SSRF для приватної мережіУстановіть false, щоб вимагати вимкнення доступу до приватної мережі.

Вхід і доступ до каналів

Поле політикиСпостережуваний станВикористовуйте, коли
ingress.session.requireDmScopesession.dmScopeВимагати перевірену область ізоляції прямих повідомлень.
ingress.channels.allowDmPolicieschannels.*.dmPolicy і застарілі поля політики DM каналуДозволяти лише перевірені політики каналів прямих повідомлень.
ingress.channels.denyOpenGroupsПолітика входу каналу, облікового запису та групиЗаборонити відкритий груповий вхід для налаштованих каналів і облікових записів.
ingress.channels.requireMentionInGroupsКонфігурація шлюзу згадок для каналу, облікового запису, групи, гільдії та вкладених згадокВимагати шлюзи згадок, коли груповий вхід відкритий або керований згадками.

Gateway

Поле політикиСпостережуваний станВикористовуйте, коли
gateway.exposure.allowNonLoopbackBindgateway.bindУстановіть false, щоб вимагати прив’язку Gateway до loopback.
gateway.exposure.allowTailscaleFunnelПозиція Gateway для Tailscale serve/funnelУстановіть false, щоб заборонити експозицію Tailscale Funnel.
gateway.auth.requireAuthgateway.auth.modeУстановіть true, щоб відхиляти вимкнену автентифікацію Gateway.
gateway.auth.requireExplicitRateLimitgateway.auth.rateLimitУстановіть true, щоб вимагати явну конфігурацію обмеження частоти автентифікації.
gateway.controlUi.allowInsecureНебезпечні перемикачі автентифікації/пристрою/джерела Control UIУстановіть false, щоб заборонити небезпечні перемикачі експозиції Control UI.
gateway.remote.allowВіддалений режим/конфігурація GatewayУстановіть false, щоб заборонити віддалений режим Gateway.
gateway.http.denyEndpointsКінцеві точки HTTP API GatewayЗаборонити ідентифікатори кінцевих точок, як-от chatCompletions або responses.
gateway.http.requireUrlAllowlistsВхідні дані Gateway HTTP для отримання URLУстановіть true, щоб вимагати списки дозволених URL для вхідних даних отримання URL.

Робочий простір агента

Поле політикиСпостережуваний станВикористовуйте, коли
agents.workspace.allowedAccessagents.defaults.sandbox.workspaceAccess і agents.list[].sandbox.workspaceAccessДозволяти лише значення доступу робочого простору sandbox, як-от none або ro.
agents.workspace.denyToolsГлобальна та поагентна конфігурація заборони інструментівВимагати заборону інструментів мутації робочого простору/runtime, як-от exec, process, write, edit або apply_patch.

Позиція sandbox

Поле політикиСпостережуваний станВикористовуйте, коли
sandbox.requireModeagents.defaults.sandbox.mode і поагентний режимДозволяти лише перевірені режими sandbox, як-от all або non-main.
sandbox.allowBackendsagents.defaults.sandbox.backend і поагентний backendДозволяти лише перевірені backend-и sandbox, як-от docker.
sandbox.containers.denyHostNetworkМережевий режим sandbox/browser на базі контейнераЗаборонити режим мережі хоста.
sandbox.containers.denyContainerNamespaceJoinМережевий режим sandbox/browser на базі контейнераЗаборонити приєднання до простору імен мережі іншого контейнера.
sandbox.containers.requireReadOnlyMountsРежим монтування sandbox/browser на базі контейнераВимагати монтування лише для читання.
sandbox.containers.denyContainerRuntimeSocketMountsЦілі монтування sandbox/browser на базі контейнераЗаборонити монтування сокетів runtime контейнера.
sandbox.containers.denyUnconfinedProfilesПозиція профілю безпеки контейнераЗаборонити необмежені профілі безпеки контейнера.
sandbox.browser.requireCdpSourceRangeДіапазон джерела CDP браузера sandboxВимагати, щоб експозиція CDP браузера оголошувала діапазон джерела.
Політика трактує відсутній sandbox.mode як неявне стандартне значення off, тому sandbox.requireMode повідомляє про новий або неналаштований sandbox як такий, що перебуває поза списком дозволених, наприклад ["all"].

Обробка даних

Поле політикиСпостережуваний станВикористовуйте, коли
dataHandling.sensitiveLogging.requireRedactionlogging.redactSensitiveУстановіть true, щоб відхиляти logging.redactSensitive: "off".
dataHandling.telemetry.denyContentCapturediagnostics.otel.captureContentУстановіть true, щоб відхиляти захоплення вмісту телеметрією.
dataHandling.retention.requireSessionMaintenancesession.maintenance.modeУстановіть true, щоб вимагати ефективний режим обслуговування сесій enforce.
dataHandling.memory.denySessionTranscriptIndexingmemory.qmd.sessions.enabled і agents.*.memorySearch.experimental.sessionMemoryУстановіть true, щоб відхиляти індексування стенограм сесій у пам’ять.

Секрети

Поле політикиСпостережуваний станВикористовуйте, коли
secrets.requireManagedProvidersConfig SecretRefs і оголошення secrets.providers.*Установіть true, щоб вимагати, аби SecretRefs вказували на оголошених постачальників.
secrets.denySourcesДжерела постачальників секретів і джерела SecretRefЗаборонити джерела, як-от exec, file або іншу назву налаштованого джерела.
secrets.allowInsecureProvidersПрапорці небезпечної позиції постачальника секретівУстановіть false, щоб відхиляти постачальників, які погоджуються на небезпечну позицію.

Схвалення exec

Політика схвалень exec спостерігає активний артефакт runtime exec-approvals.json. За замовчуванням це ~/.openclaw/exec-approvals.json; коли встановлено OPENCLAW_STATE_DIR, Policy читає $OPENCLAW_STATE_DIR/exec-approvals.json. Фактичні правила позиції, як-от execApprovals.defaults.* або execApprovals.agents.*, потребують доказів із придатного для читання артефакта; відсутній або недійсний артефакт повідомляється як неспостережувані докази, а не стає best-effort проходженням за синтетичними стандартними значеннями runtime. Щойно артефакт доступний для читання, пропущені поля схвалення успадковують стандартні значення runtime: відсутнє defaults.security дорівнює full, а відсутня безпека агента успадковує це стандартне значення. Докази включають defaults, agents.* і agents.*.allowlist[].pattern плюс необов’язковий argPattern, ефективну позицію autoAllowSkills і джерело запису. Вони не включають шлях сокета/токен, commandText, lastUsedCommand, розв’язані шляхи або часові позначки.
Поле політикиСпостережений станВикористовуйте, коли
execApprovals.requireFileШлях активного runtime-артефакта exec-approvals.jsonУстановіть true, щоб вимагати існування та успішного розбору артефакта схвалень.
execApprovals.defaults.allowSecuritydefaults.security, за замовчуванням fullДозволяти лише схвалені стандартні режими безпеки схвалень.
execApprovals.agents.allowSecurityagents.*.security, успадковує стандартні значенняДозволяти лише схвалені ефективні режими безпеки схвалень для окремих агентів.
execApprovals.agents.allowAutoAllowSkillsdefaults.autoAllowSkills і agents.*.autoAllowSkills, успадковує runtime-стандартиУстановіть false, щоб вимагати строгі ручні списки дозволів без неявного схвалення CLI Skills.
execApprovals.agents.allowlist.expectedСукупний шаблон agents.*.allowlist[] і необов’язкові записи argPatternВимагати, щоб список дозволів схвалень відповідав перевіреному набору шаблонів.
Наприклад, вимагайте артефакт схвалень, забороніть надто permissive стандартні значення та дозволяйте лише перевірену позицію exec-схвалень для вибраних агентів:
{
  "execApprovals": {
    "requireFile": true,
    "defaults": {
      // Security modes: "deny", "allowlist", or "full".
      // This default permits only the locked-down deny posture.
      "allowSecurity": ["deny"],
    },
  },
  "scopes": {
    "restricted-shell": {
      "agentIds": ["family-agent", "groups-agent"],
      "execApprovals": {
        "agents": {
          // Selected agents may use reviewed allowlist posture, but not "full".
          "allowSecurity": ["allowlist"],
          // false means skill CLIs must appear in the reviewed allowlist instead of
          // being implicitly approved by autoAllowSkills.
          "allowAutoAllowSkills": false,
          "allowlist": {
            "expected": [
              // Simple entry: exact reviewed executable pattern with no argPattern.
              "travel-hub",
              // Constrained entry: pattern plus reviewed argument regex.
              { "pattern": "calendar-cli", "argPattern": "^sync\\b" },
              "/bin/date",
            ],
          },
        },
      },
    },
  },
}

Профілі автентифікації

Поле політикиСпостережений станВикористовуйте, коли
auth.profiles.requireMetadataМетадані провайдера та режиму auth.profiles.*Вимагати ключі метаданих, як-от provider і mode, у профілях автентифікації конфігурації.
auth.profiles.allowModesauth.profiles.*.modeДозволяти лише підтримувані режими профілю автентифікації, як-от api_key, aws-sdk, oauth або token.

Метадані інструментів

Поле політикиСпостережений станВикористовуйте, коли
tools.requireMetadataКеровані оголошення TOOLS.mdВимагати, щоб керовані інструменти оголошували ключі метаданих, як-от risk, sensitivity або owner.

Позиція інструментів

Поле політикиСпостережений станВикористовуйте, коли
tools.profiles.allowtools.profile і agents.list[].tools.profileДозволяти лише ідентифікатори профілів інструментів, як-от minimal, messaging або coding.
tools.fs.requireWorkspaceOnlytools.fs.workspaceOnly і перевизначення tools.fs для окремих агентівУстановіть true, щоб вимагати позицію інструмента файлової системи лише в межах робочої області.
tools.exec.allowSecuritytools.exec.security і безпека exec для окремих агентівДозволяти лише режими безпеки exec, як-от deny або allowlist.
tools.exec.requireAsktools.exec.ask і режим запиту exec для окремих агентівВимагати позицію схвалення, як-от always.
tools.exec.allowHoststools.exec.host і маршрутизація exec-хоста для окремих агентівДозволяти лише режими маршрутизації exec-хоста, як-от sandbox.
tools.elevated.allowtools.elevated.enabled і підвищена позиція для окремих агентівУстановіть false, щоб вимагати, аби підвищений режим інструментів залишався вимкненим.
tools.alsoAllow.expectedtools.alsoAllow і tools.alsoAllow для окремих агентівВимагати точні записи alsoAllow і повідомляти про відсутні або неочікувані додаткові дозволи інструментів.
tools.denyToolstools.deny і agents.list[].tools.denyВимагати, щоб налаштовані списки заборони інструментів містили ідентифікатори інструментів або групи, як-от group:runtime і group:fs.
Запускайте перевірки лише політики під час авторингу:
openclaw policy check
openclaw policy check --json
openclaw policy check --severity-min error
policy check запускає лише набір перевірок політики та виводить докази, знахідки й хеші атестації. Ті самі знахідки також з’являються в openclaw doctor --lint, коли Plugin Policy увімкнено. Порівняйте файл політики оператора з авторським базовим файлом політики:
openclaw policy compare --baseline official.policy.jsonc
openclaw policy compare --baseline official.policy.jsonc --policy policy.jsonc --json
policy compare порівнює синтаксис файла політики із синтаксисом файла політики. Він не перевіряє runtime-стан OpenClaw, докази, облікові дані чи секрети. Команда використовує ті самі метадані правил політики, що керують scoped-накладаннями: списки дозволів мають залишатися рівними або вужчими, списки заборон мають залишатися рівними або ширшими, обов’язкові булеві значення мають зберігати своє обов’язкове значення, впорядковані рядки мають рухатися лише в бік більш обмежувального кінця налаштованого порядку, а точні списки мають збігатися. Базовий файл може бути політикою, створеною організацією. Перевірювана політика може використовувати суворіші значення або додавати додаткові правила політики. Перевірюване правило верхнього рівня також може задовольняти scoped-базове правило, коли воно так само або більш обмежувальне, оскільки політика верхнього рівня застосовується широко. Назви областей не повинні збігатися; scoped- порівняння прив’язується до значення селектора, як-от agentIds або channelIds, і до поля політики, що перевіряється. Приклад чистого JSON-виводу порівняння повідомляє лише стан порівняння файлів політики:
{
  "ok": true,
  "baselinePath": "official.policy.jsonc",
  "policyPath": "policy.jsonc",
  "rulesChecked": 3,
  "findings": []
}
Приклад чистого виводу policy check --json містить стабільні хеші, які може записати оператор або supervisor:
{
  "ok": true,
  "attestation": {
    "policy": {
      "path": "policy.jsonc",
      "hash": "sha256:..."
    },
    "workspace": {
      "scope": "policy",
      "hash": "sha256:..."
    },
    "findingsHash": "sha256:...",
    "attestationHash": "sha256:..."
  },
  "checksRun": 5,
  "checksSkipped": 0,
  "findings": []
}

Налаштування політики

Конфігурація політики розміщується в plugins.entries.policy.config.
{
  "plugins": {
    "entries": {
      "policy": {
        "enabled": true,
        "config": {
          "enabled": true,
          "path": "policy.jsonc",
          "workspaceRepairs": false,
          "expectedHash": "sha256:...",
          "expectedAttestationHash": "sha256:...",
        },
      },
    },
  },
}
НалаштуванняПризначення
enabledУвімкнути перевірки політики навіть до появи policy.jsonc.
workspaceRepairsДозволити doctor --fix редагувати налаштування робочої області, керовані політикою.
expectedHashНеобов’язкове hash-lock для схваленого артефакта політики.
expectedAttestationHashНеобов’язкове hash-lock для останньої прийнятої чистої перевірки політики.
pathРозташування артефакта політики відносно робочої області.
Установіть plugins.entries.policy.config.enabled у false, щоб вимкнути перевірки політики для робочої області, залишивши Plugin установленим. Вимоги до метаданих інструментів задаються в policy.jsonc через tools.requireMetadata, наприклад ["risk", "sensitivity", "owner"].

Прийняття стану політики

Приклад JSON-виводу:
{
  "ok": true,
  "attestation": {
    "checkedAt": "2026-05-10T20:00:00.000Z",
    "policy": {
      "path": "policy.jsonc",
      "hash": "sha256:..."
    },
    "workspace": {
      "scope": "policy",
      "hash": "sha256:..."
    },
    "findingsHash": "sha256:...",
    "attestationHash": "sha256:..."
  },
  "evidence": {
    "channels": [
      {
        "id": "telegram",
        "provider": "telegram",
        "source": "oc://openclaw.config/channels/telegram",
        "enabled": false
      }
    ],
    "mcpServers": [
      {
        "id": "docs",
        "transport": "stdio",
        "source": "oc://openclaw.config/mcp/servers/docs",
        "command": "npx"
      }
    ],
    "modelProviders": [
      {
        "id": "openai",
        "source": "oc://openclaw.config/models/providers/openai"
      }
    ],
    "modelRefs": [
      {
        "ref": "openai/gpt-5.5",
        "provider": "openai",
        "model": "gpt-5.5",
        "source": "oc://openclaw.config/agents/defaults/model"
      }
    ],
    "network": [
      {
        "id": "browser-private-network",
        "source": "oc://openclaw.config/browser/ssrfPolicy/dangerouslyAllowPrivateNetwork",
        "value": false
      }
    ],
    "gatewayExposure": [
      {
        "id": "gateway-bind",
        "kind": "bind",
        "source": "oc://openclaw.config/gateway/bind",
        "value": "loopback",
        "nonLoopback": false,
        "explicit": true
      }
    ],
    "agentWorkspace": [
      {
        "id": "agents-defaults-workspace-access",
        "kind": "workspaceAccess",
        "source": "oc://openclaw.config/agents/defaults/sandbox/workspaceAccess",
        "scope": "defaults",
        "value": "ro",
        "sandboxMode": "all",
        "sandboxModeSource": "oc://openclaw.config/agents/defaults/sandbox/mode",
        "sandboxEnabled": true,
        "explicit": true
      },
      {
        "id": "agents-defaults-tool-exec",
        "kind": "toolDeny",
        "source": "oc://openclaw.config/tools/deny",
        "scope": "defaults",
        "tool": "exec",
        "denied": true,
        "explicit": true
      }
    ],
    "secrets": [
      {
        "id": "vault",
        "kind": "provider",
        "source": "oc://openclaw.config/secrets/providers/vault",
        "providerSource": "env"
      },
      {
        "id": "oc://openclaw.config/models/providers/openai/apiKey",
        "kind": "input",
        "source": "oc://openclaw.config/models/providers/openai/apiKey",
        "provenance": "secretRef",
        "refSource": "env",
        "refProvider": "vault"
      }
    ],
    "authProfiles": [
      {
        "id": "github",
        "source": "oc://openclaw.config/auth/profiles/github",
        "validMetadata": true,
        "provider": "github",
        "mode": "token"
      }
    ],
    "tools": [
      {
        "id": "deploy",
        "source": "oc://TOOLS.md/tools/deploy",
        "line": 12,
        "risk": "critical",
        "sensitivity": "restricted",
        "capabilities": ["IRREVERSIBLE_EXTERNAL"]
      }
    ]
  },
  "checksRun": 30,
  "checksSkipped": 0,
  "findings": []
}
Хеш політики ідентифікує створений артефакт правил. Блок доказів записує спостережений стан OpenClaw, використаний перевірками політики. Значення workspace.hash ідентифікує це корисне навантаження доказів для перевіреної області. Хеш виявлень ідентифікує точний набір виявлень, повернений перевіркою. checkedAt записує, коли виконувалося оцінювання. Хеш атестації ідентифікує стале твердження: хеш політики, хеш доказів, хеш виявлень і те, чи був результат чистим. Він навмисно не включає checkedAt, тому однаковий стан політики створює ту саму атестацію під час повторних перевірок. Разом вони формують аудиторський кортеж для цієї перевірки політики. Якщо пізніше Gateway або супервізор використовує політику, щоб блокувати, схвалювати або анотувати дію під час виконання, він має записувати хеш атестації з останньої чистої перевірки політики. checkedAt залишається в JSON-виводі для журналів аудиту, але не є частиною стабільного хешу атестації. Використовуйте цей життєвий цикл під час прийняття стану політики:
  1. Створіть або перегляньте policy.jsonc.
  2. Запустіть openclaw policy check --json.
  3. Якщо результат чистий, запишіть attestation.policy.hash як expectedHash.
  4. Запишіть attestation.attestationHash як expectedAttestationHash.
  5. Повторно запустіть openclaw doctor --lint у CI або release gates.
Якщо правила політики змінюються навмисно, оновіть обидва прийняті хеші з чистої перевірки. Якщо налаштування робочого простору змінюються навмисно, але політика залишається такою самою, зазвичай змінюється лише expectedAttestationHash. Увімкнення або оновлення правил agents.workspace додає докази agentWorkspace до хешу робочого простору та хешу атестації. Оператори мають переглянути нові докази й оновити прийняті хеші атестації після ввімкнення цих правил. Увімкнення або оновлення правил стану безпеки інструментів додає докази toolPosture у такий самий спосіб. openclaw policy watch повторно запускає ту саму перевірку й повідомляє, коли поточні докази більше не відповідають expectedAttestationHash:
openclaw policy watch --json
Використовуйте --once у CI або скриптах, яким потрібне лише одне оцінювання відхилення. Без --once команда за замовчуванням опитує кожні дві секунди; використовуйте --interval-ms, щоб вибрати інший інтервал.

Виявлення

Наразі політика перевіряє:
ID перевіркиВисновок
policy/policy-jsonc-missingПолітика ввімкнена, але policy.jsonc відсутній.
policy/policy-jsonc-invalidПолітику не вдається розібрати або вона містить некоректні записи правил.
policy/policy-hash-mismatchПолітика не відповідає налаштованому expectedHash.
policy/attestation-hash-mismatchПоточні докази політики більше не відповідають прийнятій атестації.
policy/policy-conformance-invalidБазовий або перевірений файл політики має недійсний синтаксис порівняння.
policy/policy-conformance-missingУ перевіреному файлі політики відсутнє правило, потрібне базовим файлом політики.
policy/policy-conformance-weakerПеревірений файл політики має слабше значення, ніж базовий файл політики.
policy/channels-denied-providerУвімкнений канал відповідає правилу заборони каналу.
policy/mcp-denied-serverНалаштований MCP-сервер заборонений політикою.
policy/mcp-unapproved-serverНалаштований MCP-сервер перебуває поза списком дозволених.
policy/models-denied-providerНалаштований постачальник моделі або посилання на модель використовує забороненого постачальника.
policy/models-unapproved-providerНалаштований постачальник моделі або посилання на модель перебуває поза списком дозволених.
policy/network-private-access-enabledАварійний обхід SSRF для приватної мережі ввімкнено, хоча політика його забороняє.
policy/ingress-dm-policy-unapprovedПолітика приватних повідомлень каналу перебуває поза списком дозволених політикою.
policy/ingress-dm-scope-unapprovedsession.dmScope не відповідає області ізоляції приватних повідомлень, яку вимагає політика.
policy/ingress-open-groups-deniedПолітика групи каналу має значення open, хоча політика забороняє вхідні відкриті групи.
policy/ingress-group-mention-requiredЗапис каналу або групи вимикає шлюзи згадок, хоча політика вимагає їх.
policy/gateway-non-loopback-bindПозиція прив’язки Gateway дозволяє не-loopback-доступ, хоча політика його забороняє.
policy/gateway-auth-disabledАвтентифікацію Gateway вимкнено, хоча політика вимагає автентифікації.
policy/gateway-rate-limit-missingПозиція обмеження частоти автентифікації Gateway не задана явно, хоча політика цього вимагає.
policy/gateway-control-ui-insecureУвімкнено перемикачі небезпечного доступу до Gateway Control UI.
policy/gateway-tailscale-funnelДоступ через Gateway Tailscale Funnel увімкнено, хоча політика його забороняє.
policy/gateway-remote-enabledВіддалений режим Gateway активний, хоча політика його забороняє.
policy/gateway-http-endpoint-enabledКінцеву точку Gateway HTTP API увімкнено, хоча політика її забороняє.
policy/gateway-http-url-fetch-unrestrictedВхід URL-fetch Gateway HTTP не має потрібного списку дозволених URL.
policy/agents-workspace-access-deniedРежим пісочниці агента або доступ до робочої області перебуває поза списком дозволених політикою.
policy/agents-tool-not-deniedАгент або типова конфігурація не забороняє інструмент, якого вимагає політика.
policy/tools-profile-unapprovedНалаштований глобальний або агентний профіль інструментів перебуває поза списком дозволених.
policy/tools-fs-workspace-only-requiredІнструменти файлової системи не налаштовані з позицією шляхів лише в робочій області.
policy/tools-exec-security-unapprovedРежим безпеки Exec перебуває поза списком дозволених політикою.
policy/tools-exec-ask-unapprovedРежим запиту Exec перебуває поза списком дозволених політикою.
policy/tools-exec-host-unapprovedМаршрутизація хоста Exec перебуває поза списком дозволених політикою.
policy/tools-elevated-enabledПідвищений режим інструментів увімкнено, хоча політика його забороняє.
policy/tools-also-allow-missingУ налаштованому списку alsoAllow відсутній запис, потрібний політикою.
policy/tools-also-allow-unexpectedНалаштований список alsoAllow містить запис, не очікуваний політикою.
policy/tools-required-deny-missingГлобальний або агентний список заборон інструментів не містить потрібного забороненого інструмента.
policy/sandbox-mode-unapprovedРежим пісочниці перебуває поза списком дозволених політикою.
policy/sandbox-backend-unapprovedBackend пісочниці перебуває поза списком дозволених політикою.
policy/sandbox-container-posture-unobservableПравило позиції контейнера ввімкнено для backend, який не може його спостерігати.
policy/sandbox-container-host-network-deniedПісочниця або браузер на базі контейнера використовує режим мережі хоста.
policy/sandbox-container-namespace-join-deniedПісочниця або браузер на базі контейнера приєднується до простору імен іншого контейнера.
policy/sandbox-container-mount-mode-requiredМонтування пісочниці або браузера на базі контейнера не є лише для читання.
policy/sandbox-container-runtime-socket-mountМонтування пісочниці або браузера на базі контейнера відкриває сокет runtime контейнера.
policy/sandbox-container-unconfined-profileПрофіль пісочниці контейнера є необмеженим, хоча політика це забороняє.
policy/sandbox-browser-cdp-source-range-missingДіапазон джерел CDP браузера пісочниці відсутній, хоча політика його вимагає.
policy/data-handling-redaction-disabledРедагування чутливих даних у журналах вимкнено, хоча політика його вимагає.
policy/data-handling-telemetry-content-captureЗахоплення вмісту телеметрії ввімкнено, хоча політика його забороняє.
policy/data-handling-session-retention-not-enforcedОбслуговування зберігання сесій не застосовується, хоча політика цього вимагає.
policy/data-handling-session-transcript-memory-enabledІндексування пам’яті транскриптів сесій увімкнено, хоча політика його забороняє.
policy/secrets-unmanaged-providerSecretRef у конфігурації посилається на постачальника, не оголошеного в secrets.providers.
policy/secrets-denied-provider-sourceПостачальник секретів у конфігурації або SecretRef використовує джерело, заборонене політикою.
policy/secrets-insecure-providerПостачальник секретів явно обирає небезпечну позицію, хоча політика її забороняє.
policy/auth-profile-invalid-metadataУ профілі автентифікації конфігурації відсутні чинні метадані постачальника або режиму.
policy/auth-profile-unapproved-modeРежим профілю автентифікації конфігурації перебуває поза списком дозволених політикою.
policy/exec-approvals-missingПолітика вимагає exec-approvals.json, але артефакт відсутній.
policy/exec-approvals-invalidНалаштований артефакт схвалень exec не вдається розібрати.
policy/exec-approvals-default-security-unapprovedТипові схвалення Exec використовують режим безпеки поза списком дозволених політикою.
policy/exec-approvals-agent-security-unapprovedЕфективний режим безпеки схвалень exec для окремого агента перебуває поза списком дозволених.
policy/exec-approvals-auto-allow-skills-enabledАгент схвалення exec неявно автоматично дозволяє CLI Skills, хоча політика це забороняє.
policy/exec-approvals-allowlist-missingУ списку дозволених схвалень відсутній шаблон, потрібний політикою.
policy/exec-approvals-allowlist-unexpectedСписок дозволених схвалень містить шаблон, не очікуваний політикою.
policy/tools-missing-risk-levelУ керованій декларації інструмента відсутні метадані ризику.
policy/tools-unknown-risk-levelКерована декларація інструмента використовує невідоме значення ризику.
policy/tools-missing-sensitivity-tokenУ керованій декларації інструмента відсутні метадані чутливості.
policy/tools-missing-ownerУ керованій декларації інструмента відсутні метадані власника.
policy/tools-unknown-sensitivity-tokenКерована декларація інструмента використовує невідоме значення чутливості.
Висновки політики можуть містити і target, і requirement. target — це спостережуваний об’єкт робочої області, який не відповідає вимогам. requirement — це створене правило політики, через яке це стало висновком. Сьогодні обидва значення є адресами, зазвичай шляхами oc://, але назви полів описують їхню роль у політиці, а не формат адреси. Приклад висновку JSON:
{
  "checkId": "policy/channels-denied-provider",
  "severity": "error",
  "message": "Channel 'telegram' uses denied provider 'telegram'.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/channels/telegram",
  "target": "oc://openclaw.config/channels/telegram",
  "requirement": "oc://policy.jsonc/channels/denyRules/#0",
  "fixHint": "Telegram is not approved for this workspace."
}
Приклад висновку інструмента:
{
  "checkId": "policy/tools-missing-risk-level",
  "severity": "error",
  "message": "TOOLS.md tool 'deploy' has no explicit risk classification.",
  "source": "policy",
  "path": "TOOLS.md",
  "line": 12,
  "ocPath": "oc://TOOLS.md/tools/deploy",
  "target": "oc://TOOLS.md/tools/deploy",
  "requirement": "oc://policy.jsonc/tools/requireMetadata"
}
Приклад висновку MCP:
{
  "checkId": "policy/mcp-unapproved-server",
  "severity": "error",
  "message": "MCP server 'remote' is not in the policy allowlist.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/mcp/servers/remote",
  "target": "oc://openclaw.config/mcp/servers/remote",
  "requirement": "oc://policy.jsonc/mcp/servers/allow"
}
Приклад висновку постачальника моделі:
{
  "checkId": "policy/models-unapproved-provider",
  "severity": "error",
  "message": "Model ref 'anthropic/claude-sonnet-4.7' uses unapproved provider 'anthropic'.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/agents/defaults/model/fallbacks/#0",
  "target": "oc://openclaw.config/agents/defaults/model/fallbacks/#0",
  "requirement": "oc://policy.jsonc/models/providers/allow"
}
Приклад мережевого висновку:
{
  "checkId": "policy/network-private-access-enabled",
  "severity": "error",
  "message": "Network setting 'browser-private-network' allows private-network access.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/browser/ssrfPolicy/dangerouslyAllowPrivateNetwork",
  "target": "oc://openclaw.config/browser/ssrfPolicy/dangerouslyAllowPrivateNetwork",
  "requirement": "oc://policy.jsonc/network/privateNetwork/allow"
}
Приклад знахідки щодо відкритого доступу до Gateway:
{
  "checkId": "policy/gateway-non-loopback-bind",
  "severity": "error",
  "message": "Gateway bind setting 'gateway-bind' permits non-loopback exposure.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/gateway/bind",
  "target": "oc://openclaw.config/gateway/bind",
  "requirement": "oc://policy.jsonc/gateway/exposure/allowNonLoopbackBind"
}
Приклад знахідки щодо робочого простору агента:
{
  "checkId": "policy/agents-workspace-access-denied",
  "severity": "error",
  "message": "agents.defaults sandbox workspaceAccess 'rw' is not allowed by policy.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/agents/defaults/sandbox/workspaceAccess",
  "target": "oc://openclaw.config/agents/defaults/sandbox/workspaceAccess",
  "requirement": "oc://policy.jsonc/agents/workspace/allowedAccess"
}

Виправлення

doctor --lint і policy check призначені лише для читання. doctor --fix редагує налаштування робочого простору, керовані політикою, лише коли workspaceRepairs явно ввімкнено. Без цієї згоди перевірки політики повідомляють, що саме вони відремонтували б, і залишають налаштування без змін. У цій версії ремонт може вимикати канали, увімкнені в конфігурації OpenClaw, але заборонені channels.denyRules. Вмикайте workspaceRepairs лише після перегляду файлу політики, оскільки чинне правило заборони може вимкнути налаштований канал:
{
  "plugins": {
    "entries": {
      "policy": {
        "config": {
          "workspaceRepairs": true,
        },
      },
    },
  },
}

Коди виходу

Команда012
policy checkНемає знахідок на пороговому рівні.Одна або більше знахідок досягли порогового рівня.Помилка аргументів або виконання.
policy compareФайл політики щонайменше такий самий суворий, як базовий.Файл політики недійсний, відсутній або слабший за базові правила.Помилка аргументів або виконання.
policy watchНемає знахідок, а прийнятий хеш актуальний.Знахідки існують або прийнята атестація застаріла.Помилка аргументів або виконання.

Пов’язане