CLI commands
Política
openclaw policy
openclaw policy lo proporciona el Plugin Policy incluido. Policy es una
capa de conformidad empresarial sobre la configuración existente de OpenClaw. No añade un
segundo sistema de configuración. policy.jsonc define requisitos redactados,
OpenClaw observa el espacio de trabajo activo como evidencia, y las comprobaciones de estado de policy
informan desviaciones mediante doctor --lint. La señal final de conformidad es una ejecución limpia de
doctor --lint; policy aporta hallazgos a esa superficie de lint compartida
en lugar de crear una puerta de estado separada.
Policy actualmente gestiona canales configurados, servidores MCP, proveedores de modelos,
postura SSRF de red, postura de acceso de ingreso/canal, postura de exposición del Gateway, postura del espacio de trabajo del agente,
postura de manejo de datos, postura de proveedor de secretos/perfil de autenticación de la configuración de OpenClaw y declaraciones de herramientas
gobernadas. Por ejemplo, TI o un operador del espacio de trabajo puede registrar que Telegram
no es un proveedor de canal aprobado, restringir servidores MCP y referencias de modelos a
entradas aprobadas, exigir que el acceso de fetch/navegador a redes privadas permanezca
deshabilitado, exigir que el aislamiento de sesión de mensajes directos y la postura de ingreso de canales
se mantengan dentro de límites revisados, exigir que bind/auth/exposición HTTP del Gateway permanezcan dentro de límites revisados,
exigir que el acceso al espacio de trabajo del agente y las denegaciones de herramientas se mantengan en una postura revisada,
exigir que los SecretRefs de configuración de OpenClaw usen proveedores gestionados, exigir que
los perfiles de autenticación de configuración incluyan metadatos de proveedor/modo, exigir que las herramientas gobernadas
incluyan metadatos de riesgo y sensibilidad, exigir redacción de registros sensibles, denegar
la captura de contenido de telemetría, exigir mantenimiento de retención de sesiones, denegar la indexación en memoria de
transcripciones de sesión, y luego usar doctor --lint como la puerta de conformidad
compartida.
Use policy cuando un espacio de trabajo necesite una declaración duradera como "estos canales no deben estar habilitados" o "las herramientas gobernadas deben declarar metadatos de aprobación" y una forma repetible de probar que OpenClaw todavía cumple esa declaración. Use solo la configuración normal y la documentación del espacio de trabajo cuando solo necesite comportamiento local y no necesite hallazgos de policy ni salida de atestación.
Inicio rápido
Habilite el Plugin Policy incluido antes del primer uso:
openclaw plugins enable policyCuando policy está habilitado, doctor puede cargar comprobaciones de estado de policy sin activar
plugins arbitrarios. El plugin permanece habilitado si falta policy.jsonc, para que
doctor pueda informar el artefacto ausente.
Policy se redacta; no se genera a partir de la configuración actual del usuario. Una policy mínima para canales, servidores MCP, proveedores de modelos, postura de red, acceso de ingreso/canal, exposición del Gateway, postura del espacio de trabajo del agente, postura del runtime de sandbox configurado, postura de manejo de datos de OpenClaw, postura de proveedor de secretos/perfil de autenticación de configuración, postura de archivo de aprobación de exec y metadatos de herramientas se ve así:
{ "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"], },}Las reglas son la autoridad. Un bloque de categoría es solo un espacio de nombres; las comprobaciones se ejecutan
cuando hay una regla concreta presente. OpenClaw lee la configuración actual de channels.*,
mcp.servers.*, models.providers.*, referencias seleccionadas de modelos de agente, configuración SSRF de red,
alcance de sesión de mensajes directos, policy de mensajes directos de canal, policy de grupos de canal,
puertas de mención de canal/grupo, postura de bind/auth/Control UI/Tailscale/remoto/HTTP del Gateway,
postura de acceso al espacio de trabajo de sandbox de agentes de configuración de OpenClaw y de denegación de herramientas,
postura de configuración de manejo de datos, proveedor de secretos de configuración
y procedencia de SecretRef, metadatos de perfiles de autenticación de configuración, postura de herramientas configurada
global/por agente y declaraciones de TOOLS.md como evidencia, luego
informa el estado observado que no cumple. Si una policy deniega binds de Gateway que no sean local loopback,
omita gateway.bind solo cuando
esté dispuesto a revisar el valor predeterminado del runtime; establezca gateway.bind=loopback para
conformidad estricta de configuración. Para postura de agente de solo lectura, configure el modo sandbox
en los valores predeterminados o el agente aplicables y establezca workspaceAccess en none o
ro; el modo sandbox omitido o off no satisface una policy de solo lectura/sin escritura.
agents.workspace.denyTools admite exec, process, write,
edit y apply_patch; la configuración de OpenClaw group:fs cubre herramientas de mutación de archivos
y group:runtime cubre herramientas de shell/proceso. La policy de postura de herramientas observa
tools.profile, tools.allow, tools.alsoAllow, tools.deny,
tools.fs.workspaceOnly, tools.exec.security, tools.exec.ask,
tools.exec.host, tools.elevated.enabled y las mismas anulaciones por agente
agents.list[].tools.*. La policy de aprobación de exec lee el artefacto de producto
exec-approvals.json nombrado solo cuando hay una regla execApprovals
presente; la evidencia registra valores predeterminados, postura por agente y patrones de allowlist
sin tokens de socket ni texto de comandos usados por última vez. Policy no aplica llamadas de herramientas
en runtime. La evidencia de secretos registra
postura de proveedor/fuente y metadatos de SecretRef, nunca valores secretos sin procesar. Policy
no lee ni atesta almacenes de credenciales por agente como auth-profiles.json;
esos almacenes siguen siendo propiedad de los flujos existentes de autenticación y credenciales.
La evidencia de manejo de datos es solo postura a nivel de configuración: comprueba
el modo de redacción configurado, los interruptores de captura de contenido de telemetría, el modo de mantenimiento de sesiones y
la configuración de indexación en memoria de transcripciones de sesión. No inspecciona registros sin procesar,
exportaciones de telemetría, contenidos de transcripciones, archivos de memoria, ni prueba que no existan datos personales
o secretos.
Referencia de reglas de policy
Cada campo de policy a continuación es opcional. Una comprobación se ejecuta solo cuando la regla coincidente está
presente en policy.jsonc. El estado observado es la configuración existente de OpenClaw o
metadatos del espacio de trabajo; policy informa desviaciones pero no reescribe el comportamiento del runtime
salvo que una ruta de reparación esté disponible y habilitada explícitamente.
Los archivos de policy son estrictos: las secciones o claves de regla no admitidas se informan como
policy/policy-jsonc-invalid en lugar de ignorarse.
Las superposiciones de policy mantienen globales las reglas amplias de nivel superior y luego permiten que los bloques de alcance con nombre añadan secciones normales de policy más estrictas para selectores explícitos. Un nombre de alcance es solo un contenedor descriptivo; la coincidencia usa los valores del selector dentro del alcance. La superposición es aditiva: las afirmaciones globales siguen ejecutándose, y una afirmación con alcance puede emitir su propio hallazgo contra la misma configuración observada.
Superposiciones con alcance
Use scopes.<scopeName> cuando un conjunto de agentes o canales necesite una
policy más estricta que la línea base de nivel superior. Las secciones con alcance de agente usan agentIds, que
admite tools.*, agents.workspace.*, sandbox.*, dataHandling.memory.*
y execApprovals.*. El ingreso con alcance de canal
usa channelIds, que admite ingress.channels.*. Las secciones no admitidas
se rechazan en lugar de ignorarse. Si una entrada de agentIds no está
presente en agents.list[], OpenClaw evalúa la regla con alcance contra la postura
global/predeterminada heredada para ese id de agente de runtime.
{ "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, }, }, }, },}El mismo agente puede aparecer en varios alcances cuando cada alcance gobierna campos distintos, como se muestra arriba. Un campo con alcance repetido para el mismo agente debe ser igual o más restrictivo según los metadatos de policy; las afirmaciones duplicadas más débiles se rechazan. Los metadatos de rigurosidad tratan las allow-lists como subconjuntos, las listas de denegación como superconjuntos y los booleanos requeridos como requisitos fijos.
La policy de postura de contenedores se evalúa solo contra la evidencia que OpenClaw puede
observar para el agente coincidente. Si una regla sandbox.containers.* habilitada se aplica
a un agente cuyo backend de sandbox no puede exponer ese campo, policy informa
policy/sandbox-container-posture-unobservable en lugar de tratar la afirmación como
aprobada. Use alcances agentIds separados para grupos de agentes que usan diferentes
backends de sandbox, y deje sin definir o en falso las reglas de contenedor no admitidas para los
grupos donde esos campos no pueden observarse.
ingress.session.requireDmScope de nivel superior sigue siendo global porque
session.dmScope no es evidencia atribuible al canal.
| Selector | Secciones compatibles | Usar cuando |
|---|---|---|
agentIds |
tools, agents.workspace, sandbox, dataHandling.memory y execApprovals |
Uno o más agentes en tiempo de ejecución necesitan reglas más estrictas. |
channelIds |
ingress.channels |
Uno o más canales necesitan reglas de ingreso más estrictas. |
Cada ámbito presente en policy.jsonc debe ser válido y aplicable.
Canales
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
channels.denyRules[].when.provider |
Proveedor channels.* y estado habilitado |
Denegar canales configurados de un proveedor como telegram. |
channels.denyRules[].reason |
Mensaje de hallazgo y contexto de sugerencia de reparación | Explicar por qué se deniega el proveedor. |
Servidores MCP
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
mcp.servers.allow |
IDs mcp.servers.* |
Exigir que cada servidor MCP configurado esté en una lista de permitidos. |
mcp.servers.deny |
IDs mcp.servers.* |
Denegar IDs específicos de servidores MCP configurados. |
Proveedores de modelos
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
models.providers.allow |
IDs models.providers.* y refs de modelo seleccionadas |
Exigir que los proveedores configurados y las refs de modelo seleccionadas usen proveedores aprobados. |
models.providers.deny |
IDs models.providers.* y refs de modelo seleccionadas |
Denegar proveedores configurados y refs de modelo seleccionadas por ID de proveedor. |
Red
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
network.privateNetwork.allow |
Vías de escape SSRF de red privada | Establecer en false para exigir que el acceso a redes privadas permanezca deshabilitado. |
Ingreso y acceso a canales
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
ingress.session.requireDmScope |
session.dmScope |
Exigir un ámbito revisado de aislamiento de mensajes directos. |
ingress.channels.allowDmPolicies |
channels.*.dmPolicy y campos heredados de política de DM de canal |
Permitir solo políticas revisadas de canal de mensajes directos. |
ingress.channels.denyOpenGroups |
Política de ingreso de canal, cuenta y grupo | Denegar el ingreso de grupos abiertos para canales y cuentas configurados. |
ingress.channels.requireMentionInGroups |
Configuración de puerta de mención de canal, cuenta, grupo, guild y anidada | Exigir puertas de mención cuando el ingreso de grupo esté abierto o condicionado por mención. |
Gateway
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
gateway.exposure.allowNonLoopbackBind |
gateway.bind |
Establecer en false para exigir el enlace de Gateway por loopback. |
gateway.exposure.allowTailscaleFunnel |
Postura de Tailscale serve/funnel de Gateway | Establecer en false para denegar la exposición de Tailscale Funnel. |
gateway.auth.requireAuth |
gateway.auth.mode |
Establecer en true para rechazar la autenticación deshabilitada de Gateway. |
gateway.auth.requireExplicitRateLimit |
gateway.auth.rateLimit |
Establecer en true para exigir configuración explícita de límite de tasa de autenticación. |
gateway.controlUi.allowInsecure |
Conmutadores inseguros de autenticación/dispositivo/origen de Control UI | Establecer en false para denegar conmutadores inseguros de exposición de Control UI. |
gateway.remote.allow |
Modo/configuración de Gateway remoto | Establecer en false para denegar el modo de Gateway remoto. |
gateway.http.denyEndpoints |
Endpoints de API HTTP de Gateway | Denegar IDs de endpoint como chatCompletions o responses. |
gateway.http.requireUrlAllowlists |
Entradas de obtención de URL HTTP de Gateway | Establecer en true para exigir listas de URL permitidas en entradas de obtención de URL. |
Espacio de trabajo del agente
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
agents.workspace.allowedAccess |
agents.defaults.sandbox.workspaceAccess y agents.list[].sandbox.workspaceAccess |
Permitir solo valores de acceso al espacio de trabajo del sandbox como none o ro. |
agents.workspace.denyTools |
Configuración global y por agente de denegación de herramientas | Exigir que se denieguen herramientas de mutación de espacio de trabajo/tiempo de ejecución como exec, process, write, edit o apply_patch. |
Postura del sandbox
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
sandbox.requireMode |
agents.defaults.sandbox.mode y modo por agente |
Permitir solo modos de sandbox revisados como all o non-main. |
sandbox.allowBackends |
agents.defaults.sandbox.backend y backend por agente |
Permitir solo backends de sandbox revisados como docker. |
sandbox.containers.denyHostNetwork |
Modo de red de sandbox/navegador respaldado por contenedor | Denegar el modo de red del host. |
sandbox.containers.denyContainerNamespaceJoin |
Modo de red de sandbox/navegador respaldado por contenedor | Denegar unirse al espacio de nombres de red de otro contenedor. |
sandbox.containers.requireReadOnlyMounts |
Modo de montaje de sandbox/navegador respaldado por contenedor | Exigir que los montajes sean de solo lectura. |
sandbox.containers.denyContainerRuntimeSocketMounts |
Destinos de montaje de sandbox/navegador respaldado por contenedor | Denegar montajes de sockets de runtime de contenedores. |
sandbox.containers.denyUnconfinedProfiles |
Postura de perfil de seguridad de contenedor | Denegar perfiles de seguridad de contenedor sin confinamiento. |
sandbox.browser.requireCdpSourceRange |
Rango de origen CDP del navegador del sandbox | Exigir que la exposición CDP del navegador declare un rango de origen. |
Policy trata la ausencia de sandbox.mode como el valor predeterminado implícito off, por lo que
sandbox.requireMode informa que un sandbox nuevo o sin configurar está fuera de una
lista de permitidos como ["all"].
Manejo de datos
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
dataHandling.sensitiveLogging.requireRedaction |
logging.redactSensitive |
Establecer en true para rechazar logging.redactSensitive: "off". |
dataHandling.telemetry.denyContentCapture |
diagnostics.otel.captureContent |
Establecer en true para rechazar la captura de contenido de telemetría. |
dataHandling.retention.requireSessionMaintenance |
session.maintenance.mode |
Establecer en true para exigir el modo efectivo de mantenimiento de sesión enforce. |
dataHandling.memory.denySessionTranscriptIndexing |
memory.qmd.sessions.enabled y agents.*.memorySearch.experimental.sessionMemory |
Establecer en true para rechazar la indexación de transcripciones de sesión en la memoria. |
Secretos
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
secrets.requireManagedProviders |
SecretRefs de configuración y declaraciones secrets.providers.* |
Establecer en true para exigir que los SecretRefs apunten a proveedores declarados. |
secrets.denySources |
Orígenes de proveedor de secretos y orígenes de SecretRef | Denegar orígenes como exec, file u otro nombre de origen configurado. |
secrets.allowInsecureProviders |
Indicadores de postura insegura de proveedor de secretos | Establecer en false para rechazar proveedores que optan por una postura insegura. |
Aprobaciones de exec
La política de aprobaciones de exec observa el artefacto activo de runtime
exec-approvals.json. De forma predeterminada, es ~/.openclaw/exec-approvals.json; cuando
OPENCLAW_STATE_DIR está establecido, Policy lee
$OPENCLAW_STATE_DIR/exec-approvals.json. Las reglas de postura reales como
execApprovals.defaults.* o execApprovals.agents.* requieren evidencia de artefacto
legible; un artefacto ausente o no válido se informa como evidencia no observable
en lugar de convertirse en una aprobación de mejor esfuerzo contra valores predeterminados sintéticos de runtime. Una vez
que el artefacto es legible, los campos de aprobación omitidos heredan los valores predeterminados de runtime: la ausencia de
defaults.security es full, y la ausencia de seguridad del agente hereda ese
valor predeterminado. La evidencia incluye defaults, agents.* y
agents.*.allowlist[].pattern, además de argPattern opcional, la postura efectiva de
autoAllowSkills y el origen de la entrada. No incluye la ruta/token del socket,
commandText, lastUsedCommand, rutas resueltas ni marcas de tiempo.
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
execApprovals.requireFile |
Ruta activa de runtime exec-approvals.json |
Establece en true para exigir que el artefacto de aprobaciones exista y se analice. |
execApprovals.defaults.allowSecurity |
defaults.security, con valor predeterminado full |
Permitir solo modos de seguridad de aprobación predeterminados aprobados. |
execApprovals.agents.allowSecurity |
agents.*.security, que hereda los valores predeterminados |
Permitir solo modos de seguridad de aprobación efectivos por agente aprobados. |
execApprovals.agents.allowAutoAllowSkills |
defaults.autoAllowSkills y agents.*.autoAllowSkills, que heredan los valores predeterminados del runtime |
Establece en false para exigir listas de permitidos manuales estrictas sin aprobación implícita de CLI de Skills. |
execApprovals.agents.allowlist.expected |
Patrón agregado de agents.*.allowlist[] y entradas opcionales de argPattern |
Exigir que la lista de permitidos de aprobaciones coincida con el conjunto de patrones revisado. |
Por ejemplo, exige el artefacto de aprobaciones, deniega valores predeterminados permisivos y permite solo la postura de aprobación de exec revisada para agentes seleccionados:
{ "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", ], }, }, }, }, },}Perfiles de autenticación
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
auth.profiles.requireMetadata |
Metadatos de proveedor y modo de auth.profiles.* |
Exigir claves de metadatos como provider y mode en perfiles de autenticación de configuración. |
auth.profiles.allowModes |
auth.profiles.*.mode |
Permitir solo modos de perfil de autenticación compatibles como api_key, aws-sdk, oauth o token. |
Metadatos de herramientas
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
tools.requireMetadata |
Declaraciones gobernadas de TOOLS.md |
Exigir que las herramientas gobernadas declaren claves de metadatos como risk, sensitivity u owner. |
Postura de herramientas
| Campo de política | Estado observado | Usar cuando |
|---|---|---|
tools.profiles.allow |
tools.profile y agents.list[].tools.profile |
Permitir solo ids de perfil de herramienta como minimal, messaging o coding. |
tools.fs.requireWorkspaceOnly |
tools.fs.workspaceOnly y anulaciones tools.fs por agente |
Establece en true para exigir una postura de herramienta de sistema de archivos limitada al espacio de trabajo. |
tools.exec.allowSecurity |
tools.exec.security y seguridad de exec por agente |
Permitir solo modos de seguridad de exec como deny o allowlist. |
tools.exec.requireAsk |
tools.exec.ask y modo de solicitud de exec por agente |
Exigir una postura de aprobación como always. |
tools.exec.allowHosts |
tools.exec.host y enrutamiento de host de exec por agente |
Permitir solo modos de enrutamiento de host de exec como sandbox. |
tools.elevated.allow |
tools.elevated.enabled y postura elevada por agente |
Establece en false para exigir que el modo de herramienta elevada permanezca deshabilitado. |
tools.alsoAllow.expected |
tools.alsoAllow y tools.alsoAllow por agente |
Exigir entradas exactas de alsoAllow e informar concesiones de herramientas aditivas faltantes o inesperadas. |
tools.denyTools |
tools.deny y agents.list[].tools.deny |
Exigir que las listas de denegación de herramientas configuradas incluyan ids o grupos de herramientas como group:runtime y group:fs. |
Ejecuta comprobaciones solo de política durante la autoría:
openclaw policy checkopenclaw policy check --jsonopenclaw policy check --severity-min errorpolicy check ejecuta solo el conjunto de comprobaciones de política y emite evidencia, hallazgos y
hashes de atestación. Los mismos hallazgos también aparecen en openclaw doctor --lint
cuando el Plugin de política está habilitado.
Compara un archivo de política de operador con un archivo de política de referencia creado:
openclaw policy compare --baseline official.policy.jsoncopenclaw policy compare --baseline official.policy.jsonc --policy policy.jsonc --jsonpolicy compare compara la sintaxis de un archivo de política con la sintaxis de otro archivo de política. No
inspecciona el estado del runtime de OpenClaw, evidencia, credenciales ni secretos. El comando
usa los mismos metadatos de reglas de política que gobiernan las superposiciones con ámbito: las listas de permitidos deben
permanecer iguales o más restringidas, las listas de denegación deben permanecer iguales o más amplias, los booleanos requeridos
deben conservar su valor requerido, las cadenas ordenadas deben moverse solo hacia el extremo más
restrictivo del orden configurado, y las listas exactas deben coincidir.
El archivo de referencia puede ser una política creada por la organización. La política comprobada puede
usar valores más estrictos o agregar reglas de política adicionales. Una regla comprobada de nivel superior también puede
satisfacer una regla de referencia con ámbito cuando es igual o más restrictiva porque
la política de nivel superior se aplica ampliamente. Los nombres de ámbito no tienen que coincidir; la
comparación con ámbito se indexa por valor de selector, como agentIds o channelIds, y por
el campo de política que se comprueba.
Ejemplo de salida JSON limpia de comparación que informa solo el estado de comparación de archivos de política:
{ "ok": true, "baselinePath": "official.policy.jsonc", "policyPath": "policy.jsonc", "rulesChecked": 3, "findings": []}Ejemplo de salida limpia de policy check --json que incluye hashes estables que puede
registrar un operador o supervisor:
{ "ok": true, "attestation": { "policy": { "path": "policy.jsonc", "hash": "sha256:..." }, "workspace": { "scope": "policy", "hash": "sha256:..." }, "findingsHash": "sha256:...", "attestationHash": "sha256:..." }, "checksRun": 5, "checksSkipped": 0, "findings": []}Configurar política
La configuración de política reside en plugins.entries.policy.config.
{ "plugins": { "entries": { "policy": { "enabled": true, "config": { "enabled": true, "path": "policy.jsonc", "workspaceRepairs": false, "expectedHash": "sha256:...", "expectedAttestationHash": "sha256:...", }, }, }, },}| Configuración | Propósito |
|---|---|
enabled |
Habilitar comprobaciones de política incluso antes de que exista policy.jsonc. |
workspaceRepairs |
Permitir que doctor --fix edite ajustes del espacio de trabajo gestionados por políticas. |
expectedHash |
Bloqueo de hash opcional para el artefacto de política aprobado. |
expectedAttestationHash |
Bloqueo de hash opcional para la última comprobación de política limpia aceptada. |
path |
Ubicación relativa al espacio de trabajo del artefacto de política. |
Establece plugins.entries.policy.config.enabled en false para deshabilitar las comprobaciones de política
para un espacio de trabajo mientras dejas el plugin instalado.
Los requisitos de metadatos de herramientas se crean en policy.jsonc con
tools.requireMetadata, por ejemplo ["risk", "sensitivity", "owner"].
Aceptar estado de política
Ejemplo de salida 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": []}El hash de política identifica el artefacto de reglas creado. El bloque de evidencia
registra el estado observado de OpenClaw usado por las comprobaciones de política. El
valor workspace.hash identifica esa carga de evidencia para el alcance comprobado.
El hash de hallazgos identifica el conjunto exacto de hallazgos devuelto por la comprobación.
checkedAt registra cuándo se ejecutó la evaluación. El hash de atestación identifica
la afirmación estable: hash de política, hash de evidencia, hash de hallazgos y si el
resultado fue limpio. Intencionalmente no incluye checkedAt, por lo que el mismo
estado de política produce la misma atestación en comprobaciones repetidas. En conjunto,
estos forman la tupla de auditoría para esta comprobación de política.
Si un Gateway o supervisor posterior usa la política para bloquear, aprobar o anotar una
acción en tiempo de ejecución, debe registrar el hash de atestación de la última comprobación
de política limpia. checkedAt permanece en la salida JSON para los registros de auditoría,
pero no forma parte del hash de atestación estable.
Usa este ciclo de vida al aceptar el estado de política:
- Crea o revisa
policy.jsonc. - Ejecuta
openclaw policy check --json. - Si el resultado es limpio, registra
attestation.policy.hashcomoexpectedHash. - Registra
attestation.attestationHashcomoexpectedAttestationHash. - Vuelve a ejecutar
openclaw doctor --linten CI o en las puertas de lanzamiento.
Si las reglas de política cambian intencionalmente, actualiza ambos hashes aceptados a partir de una
comprobación limpia. Si la configuración del espacio de trabajo cambia intencionalmente pero la política se mantiene igual,
normalmente solo cambia expectedAttestationHash.
Habilitar o actualizar las reglas de agents.workspace agrega evidencia de agentWorkspace al
hash del espacio de trabajo y al hash de atestación. Los operadores deben revisar la nueva
evidencia y actualizar los hashes de atestación aceptados después de habilitar estas reglas.
Habilitar o actualizar las reglas de postura de herramientas agrega evidencia de toolPosture de la
misma manera.
openclaw policy watch ejecuta la misma comprobación repetidamente e informa cuando la
evidencia actual ya no coincide con expectedAttestationHash:
openclaw policy watch --jsonUsa --once en CI o scripts que solo necesiten una evaluación de deriva. Sin
--once, el comando sondea cada dos segundos de forma predeterminada; usa --interval-ms para
elegir un intervalo diferente.
Hallazgos
Actualmente, la política verifica:
| Id de comprobación | Hallazgo |
|---|---|
policy/policy-jsonc-missing |
La política está habilitada, pero falta policy.jsonc. |
policy/policy-jsonc-invalid |
La política no se puede analizar o contiene entradas de reglas mal formadas. |
policy/policy-hash-mismatch |
La política no coincide con el expectedHash configurado. |
policy/attestation-hash-mismatch |
La evidencia de política actual ya no coincide con la atestación aceptada. |
policy/policy-conformance-invalid |
Un archivo de política base o comprobado tiene sintaxis de comparación no válida. |
policy/policy-conformance-missing |
A un archivo de política comprobado le falta una regla requerida por el archivo base. |
policy/policy-conformance-weaker |
Un archivo de política comprobado tiene un valor más débil que el archivo de política base. |
policy/channels-denied-provider |
Un canal habilitado coincide con una regla de denegación de canales. |
policy/mcp-denied-server |
Un servidor MCP configurado está denegado por la política. |
policy/mcp-unapproved-server |
Un servidor MCP configurado está fuera de la lista de permitidos. |
policy/models-denied-provider |
Un proveedor de modelos configurado o una referencia de modelo usa un proveedor denegado. |
policy/models-unapproved-provider |
Un proveedor de modelos configurado o una referencia de modelo está fuera de la lista de permitidos. |
policy/network-private-access-enabled |
Un mecanismo de escape SSRF de red privada está habilitado cuando la política lo deniega. |
policy/ingress-dm-policy-unapproved |
Una política de DM de canal está fuera de la lista de permitidos de la política. |
policy/ingress-dm-scope-unapproved |
session.dmScope no coincide con el alcance de aislamiento de DM requerido por la política. |
policy/ingress-open-groups-denied |
Una política de grupo de canal es open mientras la política deniega la entrada de grupos abiertos. |
policy/ingress-group-mention-required |
Una entrada de canal o grupo deshabilita las puertas de mención mientras la política las requiere. |
policy/gateway-non-loopback-bind |
La postura de vinculación de Gateway permite exposición que no es loopback cuando la política la deniega. |
policy/gateway-auth-disabled |
La autenticación de Gateway está deshabilitada cuando la política requiere autenticación. |
policy/gateway-rate-limit-missing |
La postura de límite de tasa de autenticación de Gateway no es explícita cuando la política lo requiere. |
policy/gateway-control-ui-insecure |
Los conmutadores de exposición insegura de la interfaz de control de Gateway están habilitados. |
policy/gateway-tailscale-funnel |
La exposición de Gateway mediante Tailscale Funnel está habilitada cuando la política la deniega. |
policy/gateway-remote-enabled |
El modo remoto de Gateway está activo cuando la política lo deniega. |
policy/gateway-http-endpoint-enabled |
Un endpoint de API HTTP de Gateway está habilitado mientras la política lo deniega. |
policy/gateway-http-url-fetch-unrestricted |
La entrada de obtención de URL HTTP de Gateway carece de una lista de permitidos de URL requerida. |
policy/agents-workspace-access-denied |
El modo de sandbox del agente o el acceso al espacio de trabajo está fuera de la lista de permitidos de la política. |
policy/agents-tool-not-denied |
Un agente o configuración predeterminada no deniega una herramienta requerida por la política. |
policy/tools-profile-unapproved |
Un perfil de herramientas global o por agente configurado está fuera de la lista de permitidos. |
policy/tools-fs-workspace-only-required |
Las herramientas de sistema de archivos no están configuradas con una postura de rutas solo de espacio de trabajo. |
policy/tools-exec-security-unapproved |
El modo de seguridad de exec está fuera de la lista de permitidos de la política. |
policy/tools-exec-ask-unapproved |
El modo de solicitud de exec está fuera de la lista de permitidos de la política. |
policy/tools-exec-host-unapproved |
El enrutamiento de host de exec está fuera de la lista de permitidos de la política. |
policy/tools-elevated-enabled |
El modo de herramienta elevada está habilitado cuando la política lo deniega. |
policy/tools-also-allow-missing |
A una lista alsoAllow configurada le falta una entrada requerida por la política. |
policy/tools-also-allow-unexpected |
Una lista alsoAllow configurada incluye una entrada que la política no espera. |
policy/tools-required-deny-missing |
Una lista de denegación de herramientas global o por agente no incluye una herramienta denegada requerida. |
policy/sandbox-mode-unapproved |
El modo de sandbox está fuera de la lista de permitidos de la política. |
policy/sandbox-backend-unapproved |
El backend de sandbox está fuera de la lista de permitidos de la política. |
policy/sandbox-container-posture-unobservable |
Una regla de postura de contenedor está habilitada para un backend que no puede observarla. |
policy/sandbox-container-host-network-denied |
Un sandbox o navegador respaldado por contenedor usa el modo de red del host. |
policy/sandbox-container-namespace-join-denied |
Un sandbox o navegador respaldado por contenedor se une al espacio de nombres de otro contenedor. |
policy/sandbox-container-mount-mode-required |
Un montaje de sandbox o navegador respaldado por contenedor no es de solo lectura. |
policy/sandbox-container-runtime-socket-mount |
Un montaje de sandbox o navegador respaldado por contenedor expone el socket del runtime del contenedor. |
policy/sandbox-container-unconfined-profile |
El perfil de sandbox de contenedor no está confinado cuando la política lo deniega. |
policy/sandbox-browser-cdp-source-range-missing |
Falta el rango de origen CDP del navegador de sandbox cuando la política requiere uno. |
policy/data-handling-redaction-disabled |
La redacción de registros sensibles está deshabilitada cuando la política la requiere. |
policy/data-handling-telemetry-content-capture |
La captura de contenido de telemetría está habilitada cuando la política la deniega. |
policy/data-handling-session-retention-not-enforced |
El mantenimiento de retención de sesiones no se aplica cuando la política lo requiere. |
policy/data-handling-session-transcript-memory-enabled |
La indexación en memoria de transcripciones de sesión está habilitada cuando la política la deniega. |
policy/secrets-unmanaged-provider |
Un SecretRef de configuración hace referencia a un proveedor no declarado en secrets.providers. |
policy/secrets-denied-provider-source |
Un proveedor de secretos de configuración o SecretRef usa un origen denegado por la política. |
policy/secrets-insecure-provider |
Un proveedor de secretos opta por una postura insegura cuando la política la deniega. |
policy/auth-profile-invalid-metadata |
A un perfil de autenticación de configuración le faltan metadatos válidos de proveedor o modo. |
policy/auth-profile-unapproved-mode |
Un modo de perfil de autenticación de configuración está fuera de la lista de permitidos de la política. |
policy/exec-approvals-missing |
La política requiere exec-approvals.json, pero falta el artefacto. |
policy/exec-approvals-invalid |
El artefacto de aprobaciones de exec configurado no se puede analizar. |
policy/exec-approvals-default-security-unapproved |
Los valores predeterminados de aprobación de exec usan un modo de seguridad fuera de la lista de permitidos de la política. |
policy/exec-approvals-agent-security-unapproved |
Un modo de seguridad efectivo de aprobación de exec por agente está fuera de la lista de permitidos. |
policy/exec-approvals-auto-allow-skills-enabled |
Un agente de aprobación de exec permite implícitamente de forma automática las CLI de Skills cuando la política lo deniega. |
policy/exec-approvals-allowlist-missing |
A la lista de permitidos de aprobaciones le falta un patrón requerido por la política. |
policy/exec-approvals-allowlist-unexpected |
La lista de permitidos de aprobaciones incluye un patrón que la política no espera. |
policy/tools-missing-risk-level |
A una declaración de herramienta gobernada le faltan metadatos de riesgo. |
policy/tools-unknown-risk-level |
Una declaración de herramienta gobernada usa un valor de riesgo desconocido. |
policy/tools-missing-sensitivity-token |
A una declaración de herramienta gobernada le faltan metadatos de sensibilidad. |
policy/tools-missing-owner |
A una declaración de herramienta gobernada le faltan metadatos de propietario. |
policy/tools-unknown-sensitivity-token |
Una declaración de herramienta gobernada usa un valor de sensibilidad desconocido. |
Los hallazgos de política pueden incluir tanto target como requirement. target es el
elemento observado del espacio de trabajo que no cumple. requirement es la regla de
política escrita que hizo que fuera un hallazgo. Ambos valores son direcciones hoy,
normalmente rutas oc://, pero los nombres de los campos describen su rol en la política
en lugar del formato de dirección.
Ejemplo de hallazgo 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."}Ejemplo de hallazgo de herramienta:
{ "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"}Ejemplo de hallazgo 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"}Ejemplo de hallazgo de proveedor de modelos:
{ "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"}Ejemplo de hallazgo de red:
{ "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"}Ejemplo de hallazgo de exposición de 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"}Ejemplo de hallazgo del espacio de trabajo del agente:
{ "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"}Reparación
doctor --lint y policy check son de solo lectura.
doctor --fix solo edita la configuración del espacio de trabajo administrada por políticas cuando
workspaceRepairs está habilitado explícitamente. Sin esa aceptación, las comprobaciones de políticas
informan qué repararían y dejan la configuración sin cambios.
En esta versión, la reparación puede deshabilitar canales que están habilitados en la configuración de OpenClaw
pero denegados por channels.denyRules. Habilita workspaceRepairs solo después de que
se haya revisado el archivo de políticas, porque una regla de denegación válida puede desactivar un
canal configurado:
{ "plugins": { "entries": { "policy": { "config": { "workspaceRepairs": true, }, }, }, },}Códigos de salida
| Comando | 0 |
1 |
2 |
|---|---|---|---|
policy check |
No hay hallazgos en el umbral. | Uno o más hallazgos alcanzaron el umbral. | Fallo de argumento o de ejecución. |
policy compare |
El archivo de políticas es al menos tan estricto como la línea base. | El archivo de políticas no es válido, falta o es más débil que las reglas de la línea base. | Fallo de argumento o de ejecución. |
policy watch |
No hay hallazgos y el hash aceptado está actualizado. | Existen hallazgos o la atestación aceptada está obsoleta. | Fallo de argumento o de ejecución. |