CLI commands
Politique
openclaw policy
openclaw policy est fourni par le Plugin Policy intégré. Il constitue une couche de
conformité d’entreprise appliquée aux paramètres OpenClaw existants, et non un second
système de configuration. Vous définissez les exigences dans policy.jsonc ; OpenClaw
observe l’espace de travail actif comme élément de preuve ; la stratégie signale les
écarts au moyen de doctor --lint. La stratégie n’impose pas les appels d’outils et ne
réécrit pas le comportement d’exécution lors du traitement des requêtes ; elle
n’atteste pas non plus les magasins d’identifiants propres aux agents, tels que
auth-profiles.json.
La stratégie vérifie les canaux configurés, les serveurs MCP, les fournisseurs de
modèles, la posture réseau relative aux SSRF, les accès entrants et aux canaux,
l’exposition du Gateway et la posture des commandes des nœuds, l’accès des agents à
l’espace de travail, la posture du bac à sable, la posture de traitement des données,
la posture des fournisseurs de secrets et des profils d’authentification, ainsi que
les métadonnées des outils régis (TOOLS.md). Utilisez-la lorsqu’un espace de travail
nécessite une déclaration durable et vérifiable, telle que « Telegram ne doit pas être
activé » ou « les outils régis doivent déclarer des métadonnées de risque et de
propriétaire ». Si vous avez uniquement besoin d’un comportement local sans attestation
ni détection des écarts, la configuration ordinaire suffit.
Démarrage rapide
openclaw plugins enable policyLe Plugin reste activé même lorsque policy.jsonc est absent, afin que doctor puisse
signaler l’artefact manquant au lieu d’ignorer silencieusement les vérifications.
Rédigez policy.jsonc manuellement ; il n’est pas généré à partir des paramètres
actuels. Chaque section de premier niveau constitue un espace de noms de règles :
une vérification ne s’exécute que lorsqu’une règle concrète y est présente (les
sections ou clés non prises en charge échouent avec
policy/policy-jsonc-invalid au lieu d’être ignorées silencieusement). Exemple
minimal couvrant toutes les sections prises en charge :
{ "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, }, "nodes": { "denyCommands": ["system.run"], }, }, "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"], },}Remarques transversales qui ne ressortent pas clairement des tableaux de règles ci-dessous :
- Omettre
gateway.bindtout en interdisant les liaisons hors local loopback signifie que vous acceptez la valeur par défaut à l’exécution ; définissezgateway.bind: "loopback"pour une conformité stricte. - Pour un agent en lecture seule, définissez le
modedu bac à sable surallounon-maindans les valeurs par défaut ou l’agent concerné, etworkspaceAccesssurnoneouro. Un mode de bac à sable absent ou défini suroffne satisfait pas une stratégie de lecture seule. agents.workspace.denyToolsaccepteexec,process,write,edit,apply_patch. Les groupes de refus d’outils de la configurationgroup:fs(modification de fichiers) etgroup:runtime(shell/processus) satisfont la posture équivalente.- Les vérifications d’approbation d’exécution lisent l’artefact actif
exec-approvals.jsonuniquement lorsqu’une règleexecApprovalsest présente ; un artefact absent ou non valide constitue une preuve non observable, et non une réussite synthétique. - Les éléments de preuve relatifs aux secrets et aux profils d’authentification
enregistrent uniquement la posture du fournisseur ou de la source ainsi que
les métadonnées SecretRef, jamais les valeurs brutes. La stratégie ne lit ni
n’atteste les magasins d’identifiants propres aux agents, tels que
auth-profiles.json. - Les éléments de preuve relatifs au traitement des données portent uniquement sur la posture au niveau de la configuration (mode de masquage, option de capture de télémétrie, mode de maintenance des sessions, paramètre d’indexation des transcriptions). Ils n’inspectent ni les journaux, ni les exportations de télémétrie, ni les transcriptions, ni les fichiers de mémoire, et un résultat conforme ne prouve pas qu’ils ne contiennent aucune donnée personnelle ni aucun secret.
Référence des règles de stratégie
Toutes les règles ci-dessous sont facultatives ; une vérification ne s’exécute que lorsque la règle est présente. L’état observé correspond à la configuration OpenClaw existante ou aux métadonnées de l’espace de travail.
Superpositions ciblées
Utilisez scopes.<scopeName> lorsque certains agents ou canaux nécessitent une
stratégie plus stricte que la référence de premier niveau. Le nom de la portée
est uniquement une étiquette ; la correspondance utilise le sélecteur situé
dans la portée. Les superpositions sont cumulatives : la règle globale
s’exécute toujours, et la règle ciblée peut ajouter son propre constat à partir
des mêmes éléments de preuve.
| Sélecteur | Sections prises en charge | Cas d’utilisation |
|---|---|---|
agentIds |
tools, agents.workspace, sandbox, dataHandling.memory, execApprovals |
Un ou plusieurs agents d’exécution nécessitent des règles plus strictes. |
channelIds |
ingress.channels |
Un ou plusieurs canaux nécessitent des règles d’accès entrant plus strictes. |
Si une entrée agentIds n’est pas présente dans agents.list[], OpenClaw
évalue la règle ciblée par rapport à la posture globale ou par défaut héritée
pour cet identifiant d’agent d’exécution, au lieu de l’ignorer.
{ "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, }, }, }, },}Un même agent peut apparaître dans plusieurs portées si chacune régit un champ différent, comme ci-dessus. Un champ ciblé répété pour le même agent doit être aussi restrictif ou plus restrictif ; une déclaration dupliquée moins stricte est rejetée (les listes d’autorisation sont des sous-ensembles, les listes de refus sont des surensembles et les valeurs booléennes requises sont fixes).
Les règles de posture des conteneurs (sandbox.containers.*) sont vérifiées
uniquement par rapport aux éléments de preuve que le moteur de bac à sable de
l’agent correspondant peut exposer. Si un moteur ne peut pas observer une règle
que vous avez activée pour lui, la stratégie signale
policy/sandbox-container-posture-unobservable au lieu de la considérer comme
satisfaite ; limitez les règles de conteneur aux groupes d’agents qui utilisent
un moteur capable de les exposer.
La règle de premier niveau ingress.session.requireDmScope reste globale ;
session.dmScope ne constitue pas un élément de preuve attribuable à un canal
et ne peut donc pas être ciblé par channelIds.
Chaque portée présente dans policy.jsonc doit être valide et applicable.
Canaux
| Champ de stratégie | État observé | Cas d’utilisation |
|---|---|---|
channels.denyRules[].when.provider |
Fournisseur channels.* et état activé |
Interdire les canaux configurés provenant d’un fournisseur tel que telegram. |
channels.denyRules[].reason |
Message du constat et contexte du conseil de correction | Expliquer pourquoi le fournisseur est interdit. |
Serveurs MCP
| Champ de stratégie | État observé | Cas d’utilisation |
|---|---|---|
mcp.servers.allow |
Identifiants mcp.servers.* |
Exiger que chaque serveur MCP configuré figure dans une liste d’autorisation. |
mcp.servers.deny |
Identifiants mcp.servers.* |
Interdire certains identifiants de serveurs MCP configurés. |
Fournisseurs de modèles
| Champ de stratégie | État observé | Cas d’utilisation |
|---|---|---|
models.providers.allow |
Identifiants models.providers.* et références des modèles sélectionnés |
Exiger que les fournisseurs configurés et les références des modèles sélectionnés utilisent des fournisseurs approuvés. |
models.providers.deny |
Identifiants models.providers.* et références des modèles sélectionnés |
Interdire les fournisseurs configurés et les références des modèles sélectionnés selon l’identifiant du fournisseur. |
Réseau
| Champ de stratégie | État observé | Cas d’utilisation |
|---|---|---|
network.privateNetwork.allow |
Échappatoires SSRF vers le réseau privé | Définir sur false pour exiger que l’accès au réseau privé reste désactivé. |
Accès entrant et accès aux canaux
| Champ de stratégie | État observé | À utiliser pour |
|---|---|---|
ingress.session.requireDmScope |
session.dmScope |
Exiger une portée d’isolation des messages directs ayant fait l’objet d’un examen. |
ingress.channels.allowDmPolicies |
channels.*.dmPolicy et anciens champs de stratégie de messages directs des canaux |
Autoriser uniquement les stratégies de canal de messages directs ayant fait l’objet d’un examen. |
ingress.channels.denyOpenGroups |
Stratégie d’entrée des canaux, comptes et groupes | Refuser l’entrée de groupes ouverts pour les canaux et comptes configurés. |
ingress.channels.requireMentionInGroups |
Configuration des contrôles de mention des canaux, comptes, groupes, serveurs et niveaux imbriqués | Exiger des contrôles de mention lorsque l’entrée de groupe est ouverte ou soumise à une mention. |
Gateway
| Champ de stratégie | État observé | À utiliser pour |
|---|---|---|
gateway.exposure.allowNonLoopbackBind |
gateway.bind |
Définir sur false pour exiger que le Gateway soit lié à l’interface de bouclage. |
gateway.exposure.allowTailscaleFunnel |
Configuration d’exposition serve/funnel du Gateway via Tailscale | Définir sur false pour refuser l’exposition par Tailscale Funnel. |
gateway.auth.requireAuth |
gateway.auth.mode |
Définir sur true pour refuser la désactivation de l’authentification du Gateway. |
gateway.auth.requireExplicitRateLimit |
gateway.auth.rateLimit |
Définir sur true pour exiger une configuration explicite de limitation du débit d’authentification. |
gateway.controlUi.allowInsecure |
Options non sécurisées d’authentification, d’appareil et d’origine de l’interface de contrôle | Définir sur false pour refuser les options d’exposition non sécurisée de l’interface de contrôle. |
gateway.remote.allow |
Mode et configuration du Gateway distant | Définir sur false pour refuser le mode Gateway distant. |
gateway.http.denyEndpoints |
Points de terminaison de l’API HTTP du Gateway | Refuser des identifiants de points de terminaison tels que chatCompletions ou responses. |
gateway.http.requireUrlAllowlists |
Entrées de récupération d’URL HTTP du Gateway | Définir sur true pour exiger des listes d’URL autorisées pour les entrées de récupération d’URL. |
gateway.nodes.denyCommands |
gateway.nodes.denyCommands |
Exiger que des identifiants exacts de commandes de nœud tels que system.run soient refusés dans la configuration OpenClaw. |
gateway.nodes.denyCommands est une règle de sur-ensemble de refus exacte et sensible à la casse.
Utilisez-la lorsque la stratégie doit prouver que les commandes privilégiées de nœud sont explicitement
refusées par la configuration OpenClaw. Un déploiement qui autorise intentionnellement une commande
privilégiée de nœud doit mettre à jour policy.jsonc après examen au lieu de s’appuyer uniquement sur
gateway.nodes.allowCommands.
Espace de travail de l’agent
| Champ de stratégie | État observé | À utiliser pour |
|---|---|---|
agents.workspace.allowedAccess |
agents.defaults.sandbox.workspaceAccess et agents.list[].sandbox.workspaceAccess |
Autoriser uniquement les valeurs d’accès de l’espace de travail du bac à sable telles que none ou ro. |
agents.workspace.denyTools |
Configuration globale et par agent de refus des outils | Exiger le refus des outils de modification (exec, process, write, edit, apply_patch). |
Configuration de sécurité du bac à sable
| Champ de stratégie | État observé | À utiliser pour |
|---|---|---|
sandbox.requireMode |
agents.defaults.sandbox.mode et mode par agent |
Autoriser uniquement les modes de bac à sable examinés tels que all ou non-main. |
sandbox.allowBackends |
agents.defaults.sandbox.backend et moteur par agent |
Autoriser uniquement les moteurs de bac à sable examinés tels que docker. |
sandbox.containers.denyHostNetwork |
Mode réseau du bac à sable ou navigateur fondé sur des conteneurs | Refuser le mode réseau de l’hôte. |
sandbox.containers.denyContainerNamespaceJoin |
Mode réseau du bac à sable ou navigateur fondé sur des conteneurs | Refuser de rejoindre l’espace de noms réseau d’un autre conteneur. |
sandbox.containers.requireReadOnlyMounts |
Mode de montage du bac à sable ou navigateur fondé sur des conteneurs | Exiger des montages en lecture seule. |
sandbox.containers.denyContainerRuntimeSocketMounts |
Cibles de montage du bac à sable ou navigateur fondé sur des conteneurs | Refuser les montages de sockets d’exécution de conteneurs. |
sandbox.containers.denyUnconfinedProfiles |
Configuration des profils de sécurité des conteneurs | Refuser les profils de sécurité de conteneur non confinés. |
sandbox.browser.requireCdpSourceRange |
Plage source CDP du navigateur du bac à sable | Exiger que l’exposition CDP du navigateur déclare une plage source. |
La stratégie considère un sandbox.mode absent comme sa valeur implicite par défaut off. Ainsi,
sandbox.requireMode signale qu’un bac à sable nouveau ou non configuré ne figure pas dans une
liste d’autorisation telle que ["all"].
Traitement des données
| Champ de stratégie | État observé | À utiliser pour |
|---|---|---|
dataHandling.sensitiveLogging.requireRedaction |
logging.redactSensitive |
Définir sur true pour refuser logging.redactSensitive: "off". |
dataHandling.telemetry.denyContentCapture |
diagnostics.otel.captureContent |
Définir sur true pour refuser la capture de contenu par la télémétrie. |
dataHandling.retention.requireSessionMaintenance |
session.maintenance.mode |
Définir sur true pour exiger le mode effectif de maintenance de session enforce. |
dataHandling.memory.denySessionTranscriptIndexing |
memory.qmd.sessions.enabled et agents.*.memorySearch.experimental.sessionMemory |
Définir sur true pour refuser l’indexation des transcriptions de session dans la mémoire. |
Secrets
| Champ de stratégie | État observé | À utiliser pour |
|---|---|---|
secrets.requireManagedProviders |
Références SecretRef de la configuration et déclarations secrets.providers.* |
Définir sur true pour exiger que les références SecretRef pointent vers des fournisseurs déclarés. |
secrets.denySources |
Sources des fournisseurs de secrets et des références SecretRef | Refuser des sources telles que exec, file ou un autre nom de source configuré. |
secrets.allowInsecureProviders |
Indicateurs de configuration non sécurisée des fournisseurs de secrets | Définir sur false pour refuser les fournisseurs qui optent pour une configuration non sécurisée. |
Approbations d’exécution
Les vérifications des approbations d’exécution lisent l’artefact d’exécution exec-approvals.json :
~/.openclaw/exec-approvals.json par défaut, ou
$OPENCLAW_STATE_DIR/exec-approvals.json lorsque OPENCLAW_STATE_DIR est défini.
Les règles de configuration sous execApprovals.defaults.* ou execApprovals.agents.*
exigent des preuves lisibles provenant de l’artefact ; un artefact absent ou non valide est signalé
comme une preuve non observable plutôt que comme une validation au mieux. Une fois l’artefact lisible,
les champs omis héritent des valeurs d’exécution par défaut : une valeur defaults.security absente vaut full,
et la sécurité d’un agent absente hérite de cette valeur par défaut. Les preuves comprennent defaults,
agents.*, agents.*.allowlist[].pattern, l’éventuel argPattern, la configuration effective
d’autoAllowSkills et la source de l’entrée — jamais le chemin ou le jeton du socket,
commandText, lastUsedCommand, les chemins résolus ni les horodatages.
| Champ de stratégie | État observé | À utiliser pour |
|---|---|---|
execApprovals.requireFile |
Chemin actif d’exécution de exec-approvals.json |
Définir sur true pour exiger que l’artefact d’approbations existe et puisse être analysé. |
execApprovals.defaults.allowSecurity |
defaults.security, avec full comme valeur par défaut |
Autoriser uniquement les modes de sécurité d’approbation par défaut approuvés. |
execApprovals.agents.allowSecurity |
agents.*.security, héritant des valeurs par défaut |
Autoriser uniquement les modes de sécurité d’approbation effectifs approuvés par agent. |
execApprovals.agents.allowAutoAllowSkills |
defaults.autoAllowSkills et agents.*.autoAllowSkills, héritant des valeurs d’exécution par défaut |
Définir sur false pour exiger des listes d’autorisation manuelles strictes sans approbation implicite de la CLI des Skills. |
execApprovals.agents.allowlist.expected |
Ensemble des entrées de motif agents.*.allowlist[] et des entrées facultatives argPattern |
Exiger que la liste d’autorisation des approbations corresponde à l’ensemble de motifs examiné. |
Exemple : exiger l’artefact d’approbations, refuser les valeurs par défaut permissives et autoriser uniquement la configuration d’approbation d’exécution examinée pour les agents sélectionnés.
{ "execApprovals": { "requireFile": true, "defaults": { // Modes de sécurité : "deny", "allowlist" ou "full". // Cette valeur par défaut autorise uniquement la posture restrictive "deny". "allowSecurity": ["deny"], }, }, "scopes": { "restricted-shell": { "agentIds": ["family-agent", "groups-agent"], "execApprovals": { "agents": { // Les agents sélectionnés peuvent utiliser la posture "allowlist" examinée, mais pas "full". "allowSecurity": ["allowlist"], // false signifie que les CLI des Skills doivent figurer dans la liste d’autorisation examinée au lieu // d’être implicitement approuvées par autoAllowSkills. "allowAutoAllowSkills": false, "allowlist": { "expected": [ // Entrée simple : motif exact d’exécutable examiné, sans argPattern. "travel-hub", // Entrée contrainte : motif accompagné d’une expression régulière d’arguments examinée. { "pattern": "calendar-cli", "argPattern": "^sync\\b" }, "/bin/date", ], }, }, }, }, },}Profils d’authentification
| Champ de politique | État observé | Utilisation |
|---|---|---|
auth.profiles.requireMetadata |
Métadonnées de fournisseur et de mode de auth.profiles.* |
Exiger des clés de métadonnées telles que provider et mode sur les profils d’authentification de la configuration. |
auth.profiles.allowModes |
auth.profiles.*.mode |
Autoriser uniquement les modes de profil d’authentification pris en charge, tels que api_key, aws-sdk, oauth ou token. |
Métadonnées des outils
| Champ de politique | État observé | Utilisation |
|---|---|---|
tools.requireMetadata |
Déclarations TOOLS.md régies |
Exiger que les outils régis déclarent des clés de métadonnées telles que risk, sensitivity ou owner. |
Posture des outils
| Champ de politique | État observé | Utilisation |
|---|---|---|
tools.profiles.allow |
tools.profile et agents.list[].tools.profile |
Autoriser uniquement les identifiants de profil d’outil tels que minimal, messaging ou coding. |
tools.fs.requireWorkspaceOnly |
tools.fs.workspaceOnly et remplacements tools.fs propres à chaque agent |
Définir sur true pour exiger une posture des outils de système de fichiers limitée à l’espace de travail. |
tools.exec.allowSecurity |
tools.exec.security et sécurité d’exécution propre à chaque agent |
Autoriser uniquement les modes de sécurité d’exécution tels que deny ou allowlist. |
tools.exec.requireAsk |
tools.exec.ask et mode de demande d’exécution propre à chaque agent |
Exiger une posture d’approbation telle que always. |
tools.exec.allowHosts |
tools.exec.host et routage de l’hôte d’exécution propre à chaque agent |
Autoriser uniquement les modes de routage de l’hôte d’exécution tels que sandbox. |
tools.elevated.allow |
tools.elevated.enabled et posture élevée propre à chaque agent |
Définir sur false pour exiger que le mode élevé des outils reste désactivé. |
tools.alsoAllow.expected |
tools.alsoAllow et tools.alsoAllow propre à chaque agent |
Exiger des entrées alsoAllow exactes et signaler les autorisations d’outils supplémentaires manquantes ou inattendues. |
tools.denyTools |
tools.deny et agents.list[].tools.deny |
Exiger que les listes configurées de refus d’outils incluent des identifiants ou groupes d’outils tels que group:runtime et group:fs. |
Exécuter les vérifications
Exécutez uniquement les vérifications de politique pendant la rédaction :
openclaw policy checkopenclaw policy check --jsonopenclaw policy check --severity-min errorpolicy check exécute uniquement l’ensemble des vérifications de politique et produit les éléments de preuve, les constats
et les empreintes d’attestation. Les mêmes constats apparaissent également dans
openclaw doctor --lint lorsque le Plugin Policy est activé.
Comparez un fichier de politique d’opérateur à une référence rédigée :
openclaw policy compare --baseline official.policy.jsoncopenclaw policy compare --baseline official.policy.jsonc --policy policy.jsonc --jsonpolicy compare vérifie la syntaxe d’un fichier de politique par rapport à celle d’un autre fichier de politique ; il
n’inspecte pas l’état d’exécution, les éléments de preuve, les identifiants d’accès ni les secrets. Il utilise les mêmes
métadonnées de règles que celles qui régissent les superpositions délimitées : les listes d’autorisation doivent rester identiques ou
plus restrictives, les listes de refus doivent rester identiques ou plus larges, les booléens obligatoires doivent conserver
leur valeur, les chaînes ordonnées ne peuvent évoluer que vers l’extrémité la plus stricte de
l’ordre configuré, et les listes exactes doivent correspondre. La référence peut être une
politique rédigée par l’organisation ; la politique vérifiée peut ajouter des valeurs plus strictes ou
des règles supplémentaires. Une règle vérifiée de premier niveau peut satisfaire une règle de référence délimitée lorsqu’elle
est aussi restrictive ou plus restrictive. Les noms de portées n’ont pas besoin de correspondre entre
les fichiers ; la comparaison utilise le sélecteur (agentIds/channelIds) et le champ comme clés.
Comparaison sans constat (--json) :
{ "ok": true, "baselinePath": "official.policy.jsonc", "policyPath": "policy.jsonc", "rulesChecked": 3, "findings": []}Une sortie sans constat de policy check --json inclut des empreintes stables qu’un opérateur ou
un superviseur peut enregistrer :
{ "ok": true, "attestation": { "policy": { "path": "policy.jsonc", "hash": "sha256:..." }, "workspace": { "scope": "policy", "hash": "sha256:..." }, "findingsHash": "sha256:...", "attestationHash": "sha256:..." }, "checksRun": 5, "checksSkipped": 0, "findings": []}Configurer la politique
La configuration de la politique se trouve sous plugins.entries.policy.config.
{ "plugins": { "entries": { "policy": { "enabled": true, "config": { "enabled": true, "path": "policy.jsonc", "workspaceRepairs": false, "expectedHash": "sha256:...", "expectedAttestationHash": "sha256:...", }, }, }, },}| Paramètre | Objectif |
|---|---|
enabled |
Activer les vérifications de politique même avant l’existence de policy.jsonc. |
workspaceRepairs |
Autoriser doctor --fix à modifier les paramètres de l’espace de travail gérés par la politique. |
expectedHash |
Verrouillage facultatif par empreinte de l’artefact de politique approuvé. |
expectedAttestationHash |
Verrouillage facultatif par empreinte de la dernière vérification de politique sans constat acceptée. |
path |
Emplacement de l’artefact de politique relatif à l’espace de travail. |
Définissez plugins.entries.policy.config.enabled sur false pour désactiver les vérifications de
politique d’un espace de travail tout en laissant le Plugin installé.
Accepter l’état de la politique
Exemple de sortie 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.6-sol", "provider": "openai", "model": "gpt-5.6-sol", "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": []}attestation.policy.hash identifie l’artefact de règles rédigé. evidence
enregistre l’état OpenClaw observé utilisé par les vérifications, et
workspace.hash identifie cette charge utile de preuve. findingsHash identifie
l’ensemble exact des constats. checkedAt enregistre la date d’exécution de la vérification.
attestationHash identifie l’affirmation stable (empreinte de la politique, empreinte des preuves,
empreinte des constats et état sans constat/avec constats) et exclut délibérément checkedAt,
de sorte qu’un même état de politique produit toujours la même empreinte d’attestation. Ensemble,
ces quatre valeurs forment le tuple d’audit d’une vérification de politique.
Si un Gateway ou un superviseur utilise la politique pour bloquer, approuver ou annoter une
action d’exécution, il doit enregistrer l’empreinte d’attestation de la dernière vérification
sans constat. checkedAt reste dans la sortie JSON pour les journaux d’audit, mais ne fait pas partie de
l’empreinte stable.
Cycle de vie de l’acceptation de l’état de la politique :
- Rédigez ou examinez
policy.jsonc. - Exécutez
openclaw policy check --json. - En l’absence de constat, enregistrez
attestation.policy.hashcommeexpectedHash. - Enregistrez
attestation.attestationHashcommeexpectedAttestationHash. - Réexécutez
openclaw doctor --lintdans les contrôles de CI ou de publication.
Si les règles de politique changent intentionnellement, mettez à jour les deux hachages acceptés à partir d’une vérification propre. Si seuls les paramètres de l’espace de travail changent (la politique reste identique), seul expectedAttestationHash change généralement.
L’activation ou la mise à niveau des règles agents.workspace ajoute des éléments de preuve agentWorkspace au hachage de l’espace de travail et au hachage d’attestation ; examinez les nouveaux éléments de preuve et actualisez les hachages d’attestation acceptés après l’activation. L’activation ou la mise à niveau des règles de posture des outils ajoute de la même manière des éléments de preuve toolPosture.
openclaw policy watch réexécute la vérification et signale lorsque les éléments de preuve actuels ne correspondent plus à expectedAttestationHash :
openclaw policy watch --jsonUtilisez --once dans la CI ou dans les scripts nécessitant une seule évaluation de dérive. Sans --once, la commande interroge par défaut toutes les deux secondes ; utilisez --interval-ms pour modifier l’intervalle.
Constats
| Identifiant de vérification | Constat |
|---|---|
policy/policy-jsonc-missing |
La politique est activée, mais policy.jsonc est absent. |
policy/policy-jsonc-invalid |
La politique ne peut pas être analysée ou contient des entrées de règles mal formées. |
policy/policy-hash-mismatch |
La politique ne correspond pas à la valeur expectedHash configurée. |
policy/attestation-hash-mismatch |
Les éléments de preuve actuels de la politique ne correspondent plus à l’attestation acceptée. |
policy/policy-conformance-invalid |
Un fichier de politique de référence ou vérifié contient une syntaxe de comparaison non valide. |
policy/policy-conformance-missing |
Il manque dans un fichier de politique vérifié une règle requise par le fichier de politique de référence. |
policy/policy-conformance-weaker |
Un fichier de politique vérifié contient une valeur moins stricte que celle du fichier de politique de référence. |
policy/channels-denied-provider |
Un canal activé correspond à une règle d’interdiction de canal. |
policy/mcp-denied-server |
Un serveur MCP configuré est interdit par la politique. |
policy/mcp-unapproved-server |
Un serveur MCP configuré ne figure pas dans la liste d’autorisation. |
policy/models-denied-provider |
Un fournisseur de modèles configuré ou une référence de modèle utilise un fournisseur interdit. |
policy/models-unapproved-provider |
Un fournisseur de modèles configuré ou une référence de modèle ne figure pas dans la liste d’autorisation. |
policy/network-private-access-enabled |
Un mécanisme de contournement SSRF pour les réseaux privés est activé alors que la politique l’interdit. |
policy/ingress-dm-policy-unapproved |
Une politique de messages privés d’un canal ne figure pas dans la liste d’autorisation de la politique. |
policy/ingress-dm-scope-unapproved |
session.dmScope ne correspond pas à la portée d’isolation des messages privés exigée par la politique. |
policy/ingress-open-groups-denied |
Une politique de groupe d’un canal est définie sur open alors que la politique interdit les entrées de groupes ouverts. |
policy/ingress-group-mention-required |
Une entrée de canal ou de groupe désactive les contrôles de mention alors que la politique les exige. |
policy/gateway-non-loopback-bind |
La posture de liaison du Gateway autorise une exposition hors de local loopback alors que la politique l’interdit. |
policy/gateway-auth-disabled |
L’authentification du Gateway est désactivée alors que la politique l’exige. |
policy/gateway-rate-limit-missing |
La posture de limitation du débit d’authentification du Gateway n’est pas explicite alors que la politique l’exige. |
policy/gateway-control-ui-insecure |
Les options d’exposition non sécurisée de l’interface de contrôle du Gateway sont activées. |
policy/gateway-tailscale-funnel |
L’exposition du Gateway par Tailscale Funnel est activée alors que la politique l’interdit. |
policy/gateway-remote-enabled |
Le mode distant du Gateway est actif alors que la politique l’interdit. |
policy/gateway-http-endpoint-enabled |
Un point de terminaison de l’API HTTP du Gateway est activé alors que la politique l’interdit. |
policy/gateway-http-url-fetch-unrestricted |
L’entrée de récupération d’URL HTTP du Gateway ne dispose pas de la liste d’autorisation d’URL requise. |
policy/gateway-node-command-denied |
Une commande Node interdite par la politique ne l’est pas dans la configuration OpenClaw. |
policy/agents-workspace-access-denied |
Le mode de bac à sable de l’agent ou l’accès à l’espace de travail ne figure pas dans la liste d’autorisation de la politique. |
policy/agents-tool-not-denied |
La configuration d’un agent ou la configuration par défaut n’interdit pas un outil qui doit l’être selon la politique. |
policy/tools-profile-unapproved |
Un profil d’outils global ou propre à un agent ne figure pas dans la liste d’autorisation. |
policy/tools-fs-workspace-only-required |
Les outils du système de fichiers ne sont pas configurés avec une posture limitant les chemins à l’espace de travail. |
policy/tools-exec-security-unapproved |
Le mode de sécurité d’exécution ne figure pas dans la liste d’autorisation de la politique. |
policy/tools-exec-ask-unapproved |
Le mode de demande d’exécution ne figure pas dans la liste d’autorisation de la politique. |
policy/tools-exec-host-unapproved |
Le routage de l’hôte d’exécution ne figure pas dans la liste d’autorisation de la politique. |
policy/tools-elevated-enabled |
Le mode privilégié des outils est activé alors que la politique l’interdit. |
policy/tools-also-allow-missing |
Il manque dans une liste alsoAllow configurée une entrée requise par la politique. |
policy/tools-also-allow-unexpected |
Une liste alsoAllow configurée comprend une entrée non prévue par la politique. |
policy/tools-required-deny-missing |
Une liste globale ou propre à un agent d’outils interdits ne comprend pas un outil qui doit l’être. |
policy/sandbox-mode-unapproved |
Le mode de bac à sable ne figure pas dans la liste d’autorisation de la politique. |
policy/sandbox-backend-unapproved |
Le moteur de bac à sable ne figure pas dans la liste d’autorisation de la politique. |
policy/sandbox-container-posture-unobservable |
Une règle de posture de conteneur est activée pour un moteur qui ne peut pas l’observer. |
policy/sandbox-container-host-network-denied |
Un bac à sable ou un navigateur reposant sur un conteneur utilise le mode réseau de l’hôte. |
policy/sandbox-container-namespace-join-denied |
Un bac à sable ou un navigateur reposant sur un conteneur rejoint l’espace de noms d’un autre conteneur. |
policy/sandbox-container-mount-mode-required |
Un montage de bac à sable ou de navigateur reposant sur un conteneur n’est pas en lecture seule. |
policy/sandbox-container-runtime-socket-mount |
Un montage de bac à sable ou de navigateur reposant sur un conteneur expose le socket du moteur d’exécution de conteneurs. |
policy/sandbox-container-unconfined-profile |
Le profil du bac à sable de conteneur est sans confinement alors que la politique l’interdit. |
policy/sandbox-browser-cdp-source-range-missing |
Il manque la plage source CDP du navigateur en bac à sable alors que la politique en exige une. |
policy/data-handling-redaction-disabled |
La censure des données sensibles dans les journaux est désactivée alors que la politique l’exige. |
policy/data-handling-telemetry-content-capture |
La capture du contenu de télémétrie est activée alors que la politique l’interdit. |
policy/data-handling-session-retention-not-enforced |
La maintenance de la conservation des sessions n’est pas appliquée alors que la politique l’exige. |
policy/data-handling-session-transcript-memory-enabled |
L’indexation en mémoire des transcriptions de session est activée alors que la politique l’interdit. |
policy/secrets-unmanaged-provider |
Une SecretRef de configuration référence un fournisseur non déclaré sous secrets.providers. |
policy/secrets-denied-provider-source |
Un fournisseur de secrets configuré ou une SecretRef utilise une source interdite par la politique. |
policy/secrets-insecure-provider |
Un fournisseur de secrets accepte une posture non sécurisée alors que la politique l’interdit. |
policy/auth-profile-invalid-metadata |
Il manque dans un profil d’authentification configuré des métadonnées valides de fournisseur ou de mode. |
policy/auth-profile-unapproved-mode |
Le mode d’un profil d’authentification configuré ne figure pas dans la liste d’autorisation de la politique. |
policy/exec-approvals-missing |
La politique exige exec-approvals.json, mais cet artefact est absent. |
policy/exec-approvals-invalid |
L’artefact configuré d’approbations d’exécution ne peut pas être analysé. |
policy/exec-approvals-default-security-unapproved |
Les valeurs par défaut d’approbation d’exécution utilisent un mode de sécurité qui ne figure pas dans la liste d’autorisation de la politique. |
policy/exec-approvals-agent-security-unapproved |
Le mode de sécurité effectif d’approbation d’exécution propre à un agent ne figure pas dans la liste d’autorisation. |
policy/exec-approvals-auto-allow-skills-enabled |
Un agent d’approbation d’exécution autorise implicitement et automatiquement les CLI de Skills alors que la politique l’interdit. |
policy/exec-approvals-allowlist-missing |
Il manque dans la liste d’autorisation des approbations un motif requis par la politique. |
policy/exec-approvals-allowlist-unexpected |
La liste d’autorisation des approbations comprend un motif non prévu par la politique. |
policy/tools-missing-risk-level |
Il manque des métadonnées de risque dans une déclaration d’outil soumise à la gouvernance. |
policy/tools-unknown-risk-level |
Une déclaration d’outil soumise à la gouvernance utilise une valeur de risque inconnue. |
policy/tools-missing-sensitivity-token |
Il manque des métadonnées de sensibilité dans une déclaration d’outil soumise à la gouvernance. |
policy/tools-missing-owner |
Il manque des métadonnées de propriétaire dans une déclaration d’outil soumise à la gouvernance. |
policy/tools-unknown-sensitivity-token |
Une déclaration d’outil soumise à la gouvernance utilise une valeur de sensibilité inconnue. |
Un constat peut inclure à la fois target (l’élément observé dans l’espace de travail qui n’est pas conforme) et requirement (la règle définie qui a produit le constat). Ces deux champs sont actuellement des chaînes d’adresse oc://, mais leurs noms décrivent leur rôle dans la politique plutôt que le format de l’adresse.
Exemples de constats :
{ "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"}{ "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"}{ "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/gateway-node-command-denied", "severity": "error", "message": "Gateway node command 'system.run' is denied by policy but not denied by OpenClaw config.", "source": "policy", "path": "openclaw config", "ocPath": "oc://openclaw.config/gateway/nodes/denyCommands", "target": "oc://openclaw.config/gateway/nodes/denyCommands", "requirement": "oc://policy.jsonc/gateway/nodes/denyCommands", "fixHint": "Add 'system.run' to gateway.nodes.denyCommands or update policy after review."}{ "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"}Réparation
doctor --lint et policy check sont en lecture seule.
doctor --fix ne modifie les paramètres de l’espace de travail gérés par la politique que lorsque
workspaceRepairs est explicitement activé ; sinon, les vérifications indiquent ce qu’elles
répareraient et laissent les paramètres inchangés.
Dans cette version, la réparation peut désactiver les canaux interdits par channels.denyRules et
appliquer les réparations automatiques de restriction répertoriées ci-dessous. N’activez
workspaceRepairs qu’après avoir examiné le fichier de politique, car une règle valide peut modifier
la configuration de l’espace de travail :
- définir
tools.elevated.enabled=falselorsqu’une politique globale interdit les outils à privilèges élevés - ajouter les identifiants d’outils manquants dont l’interdiction est obligatoire à
tools.denyouagents.list[].tools.denylorsque la politique exige que ces outils soient interdits - définir les options non sécurisées
gateway.controlUi.*surfalse - définir
gateway.mode=locallorsque la politique interdit le mode Gateway distant - définir sur
falseles cheminsgateway.http.endpoints.*.enabledsignalés lorsque la politique interdit les points de terminaison de l’API HTTP du Gateway - définir sur
allowlistles cheminsgroupPolicysignalés pour les entrées de canal lorsque la politique interdit les entrées de groupe ouvertes - définir sur
trueles cheminsrequireMentionsignalés pour les entrées de canal lorsque la politique exige des mentions dans les groupes - définir
logging.redactSensitive=toolslorsque la politique exige le masquage des données sensibles dans les journaux - définir
diagnostics.otel.captureContent=false, oudiagnostics.otel.captureContent.enabled=falsepour les paramètres de capture télémétrique sous forme d’objet, lorsque la politique interdit la capture du contenu télémétrique
Les réparations ciblées des outils à privilèges élevés sont uniquement détectées. Les réparations ciblées du traitement des données sont également ignorées lorsque le constat signale une configuration partagée de journalisation ou de télémétrie, car la modification du paramètre partagé affecterait davantage que la cible de politique concernée.
Les réparations ciblées des interdictions obligatoires sont ignorées lorsque le constat signale un
tools.deny racine hérité, car l’ajout de l’outil requis à la configuration racine affecterait
davantage que la cible de politique concernée. Les réparations locales à un agent des interdictions
obligatoires peuvent mettre à jour le chemin agents.list[].tools.deny signalé.
Les réparations ciblées des entrées de canal sont ignorées lorsque le constat signale un
channels.defaults.* hérité, car la modification de la valeur par défaut partagée du canal affecterait
davantage que la cible de politique concernée. Les constats relatifs à la liste d’autorisation de
récupération d’URL HTTP du Gateway restent manuels, car la réparation automatique ne peut pas choisir
les valeurs correctes de la liste d’autorisation des URL de point de terminaison.
Les constats relatifs à la liaison et aux commandes de nœud du Gateway nécessitent toujours un examen. Lorsque
policy/gateway-non-loopback-bind ou policy/gateway-node-command-denied
peut être associé à un chemin de configuration, doctor --fix signale la modification proposée de
gateway.bind ou gateway.nodes.denyCommands comme un aperçu ignoré à titre indicatif.
Il n’applique pas la modification, et le constat n’est pas considéré comme réparé tant qu’un opérateur
n’a pas examiné et mis à jour la configuration ou la politique.
{ "plugins": { "entries": { "policy": { "config": { "workspaceRepairs": true, }, }, }, },}Codes de sortie
| Commande | 0 |
1 |
2 |
|---|---|---|---|
policy check |
Aucun constat n’atteint le seuil. | Un ou plusieurs constats ont atteint le seuil. | Échec d’un argument ou de l’exécution. |
policy compare |
Le fichier de politique est au moins aussi strict que la base. | Le fichier de politique est invalide, absent ou moins strict que les règles de base. | Échec d’un argument ou de l’exécution. |
policy watch |
Aucun constat et le hachage accepté est à jour. | Des constats existent ou l’attestation acceptée est obsolète. | Échec d’un argument ou de l’exécution. |