Gateway

Gestión de secretos

OpenClaw admite SecretRefs aditivas para que las credenciales compatibles no tengan que almacenarse como texto sin formato en la configuración.

Modelo de ejecución

  • Los secretos se resuelven en una instantánea de ejecución en memoria, de forma anticipada durante la activación, no de forma diferida en las rutas de solicitudes.
  • El inicio en frío del Gateway aísla un fallo reintentable de SecretRef en un propietario conocido ajeno al Gateway cuando ese propietario admite el aislamiento. Las clases de propietarios asignadas incluyen proveedores de modelos y Skills, proveedores de medios/TTS/cron, perfiles de autenticación aptos, memoria por agente, SSH del entorno aislado, cuentas de canales y rutas de Plugin declaradas en el manifiesto. El Gateway se inicia, registra al propietario como configurado pero no disponible y emite una advertencia de degradación redactada. La autenticación de entrada del Gateway, las referencias o los valores resueltos estructuralmente no válidos, los propietarios con cierre seguro y las referencias cuyo propietario de ejecución no está asignado siguen impidiendo el inicio.
  • La recarga valida cada propietario asignado de forma independiente y después publica una única instantánea atómica. Los propietarios en buen estado se actualizan. Un propietario apto que falle conserva su último valor válido conocido y solo pasa a estar obsoleto cuando las identidades de sus referencias, las definiciones de los proveedores y el contrato completo no secreto del propietario permanecen sin cambios; un propietario nuevo o modificado que falle pasa a estar en frío. Un fallo estricto rechaza la recarga y conserva la instantánea activa.
  • Las infracciones de políticas (por ejemplo, un perfil de autenticación en modo OAuth combinado con una entrada SecretRef) impiden la activación antes de sustituir el entorno de ejecución.
  • Las solicitudes de ejecución solo leen la instantánea activa en memoria. Las credenciales SecretRef de proveedores de modelos pasan por el almacenamiento de autenticación y las opciones de transmisión como centinelas locales del proceso hasta la salida. Las rutas de entrega saliente (entrega de respuestas/hilos de Discord y envíos de acciones de Telegram) también leen esa instantánea y no vuelven a resolver las referencias en cada envío.

Esto evita que las interrupciones de los proveedores de secretos afecten a las rutas críticas de solicitudes.

La protección de entrada del Gateway, la configuración o los valores resueltos estructuralmente no válidos, las infracciones de políticas y la propiedad desconocida siguen provocando un cierre seguro. Los propietarios aislados nunca recurren a una fuente de credenciales de menor precedencia.

Inyección en el momento de la salida (centinelas)

Para las credenciales de proveedores de modelos respaldadas por SecretRefs, OpenClaw genera un centinela opaco y local del proceso durante la resolución de la autenticación del modelo. Por tanto, el almacenamiento de autenticación, las opciones de transmisión, la configuración del SDK, los registros, los objetos de error y la mayor parte de la introspección del entorno de ejecución ven un valor como oc-sent-v1-..., no la credencial del proveedor. La obtención protegida del modelo y las sondas administradas de estado de proveedores locales sustituyen los centinelas conocidos en los valores de URL y cabeceras inmediatamente antes de que cada solicitud salga del proceso.

Los valores desconocidos con forma de centinela provocan un cierre seguro antes de cualquier actividad de red. OpenClaw se niega a enviar la solicitud en lugar de reenviar a un proveedor un centinela sin resolver. Los valores secretos resueltos también se registran para la redacción exacta de valores en los registros como medida de defensa en profundidad.

Los adaptadores de proveedores utilizan el punto de inyección más tardío que admite su SDK:

  • Los SDK con una opción de obtención personalizada reciben la función de obtención protegida de OpenClaw, por lo que el SDK conserva el centinela.
  • Los SDK sin una opción de obtención personalizada desenvuelven el centinela inmediatamente antes de construir el cliente. Las transmisiones de proveedores propiedad de Plugins y los entornos de agentes lo desenvuelven en la transferencia final propiedad del núcleo porque esos transportes no comparten la función de obtención protegida de OpenClaw.

Los centinelas reducen la exposición del texto sin formato a lo largo de la cadena de llamadas al modelo, pero no proporcionan aislamiento de procesos. El valor real sigue existiendo en la memoria del mismo proceso y aparece en el límite final del adaptador. Las credenciales de entorno en texto sin formato que no estén configuradas mediante SecretRefs permanecen como texto sin formato y quedan fuera de este mecanismo.

Establezca OPENCLAW_SECRET_SENTINELS=off (también acepta 0 o false, sin distinguir entre mayúsculas y minúsculas) para desactivar la generación de centinelas durante la respuesta a incidentes o la resolución de problemas de compatibilidad. El interruptor de emergencia no desactiva el registro para la redacción exacta de valores.

Límite de acceso del agente

Las SecretRefs evitan que las credenciales se conserven en la configuración y en los archivos de modelos generados, pero no constituyen un límite de aislamiento de procesos. Una credencial en texto sin formato que permanezca en el disco en una ruta que el agente pueda leer sigue siendo accesible mediante herramientas de archivos o del shell, eludiendo la redacción a nivel de API.

En implementaciones de producción en las que se incluyan archivos accesibles para el agente, considere que la migración está completa solo cuando se cumplan todas estas condiciones:

  • Las credenciales compatibles utilizan SecretRefs en lugar de valores en texto sin formato.
  • Los residuos heredados de texto sin formato se han eliminado de openclaw.json, auth-profiles.json, .env y los archivos models.json generados.
  • openclaw secrets audit --check no detecta problemas después de la migración.
  • Todas las credenciales restantes que no sean compatibles o estén en rotación están protegidas mediante aislamiento del sistema operativo, aislamiento de contenedores o un proxy externo de credenciales.

Por este motivo, el flujo de auditoría/configuración/aplicación es una barrera de migración de seguridad, no solo una herramienta auxiliar práctica.

Filtrado de superficies activas

Las SecretRefs solo se validan en superficies que están activas de forma efectiva:

  • Superficies habilitadas: los fallos reintentables de propietarios asignados y aislables entran en degradación fría u obsoleta. Los fallos estrictos, con cierre seguro, necesarios para el Gateway o sin asignar bloquean el inicio o la recarga.
  • Superficies inactivas: las referencias sin resolver no bloquean el inicio ni la recarga; emiten un diagnóstico SECRETS_REF_IGNORED_INACTIVE_SURFACE no fatal.
Ejemplos de superficies inactivas
  • Entradas de canales/cuentas deshabilitadas.
  • Credenciales de canales de nivel superior que ninguna cuenta habilitada hereda.
  • Superficies de herramientas/funciones deshabilitadas.
  • Claves específicas de proveedores de búsqueda web no seleccionadas por tools.web.search.provider. En el modo automático (proveedor sin establecer), las claves se consultan por orden de precedencia para la detección automática hasta que una se resuelve; después de la selección, las claves de proveedores no seleccionados quedan inactivas.
  • El material de autenticación SSH del entorno aislado (agents.defaults.sandbox.ssh.identityData, certificateData, knownHostsData, además de las anulaciones por agente) solo está activo cuando el backend efectivo del entorno aislado es ssh y el modo del entorno aislado no es off, para el agente predeterminado o un agente habilitado.
  • Las SecretRefs gateway.remote.token / gateway.remote.password están activas si se cumple cualquiera de estas condiciones:
  • gateway.mode=remote
  • gateway.remote.url está configurado
  • gateway.tailscale.mode es serve o funnel
  • En modo local sin esas superficies remotas: gateway.remote.token está activo cuando puede prevalecer la autenticación mediante token y no hay ningún token de entorno/autenticación configurado; gateway.remote.password solo está activo cuando puede prevalecer la autenticación mediante contraseña y no hay ninguna contraseña de entorno/autenticación configurada.
  • La SecretRef gateway.auth.token está inactiva para la resolución de autenticación al inicio cuando se establece OPENCLAW_GATEWAY_TOKEN, porque la entrada de token del entorno prevalece en ese entorno de ejecución.

Diagnósticos de la superficie de autenticación del Gateway

Cuando se establece una SecretRef en gateway.auth.token, gateway.auth.password, gateway.remote.token o gateway.remote.password, el inicio o la recarga del Gateway registra el estado de la superficie con el código SECRETS_GATEWAY_AUTH_SURFACE:

  • active: la SecretRef forma parte de la superficie de autenticación efectiva y debe resolverse.
  • inactive: prevalece otra superficie de autenticación o la autenticación remota está deshabilitada/inactiva.

La entrada del registro incluye el motivo utilizado por la política de superficies activas.

Comprobación previa de referencias durante la incorporación

En la incorporación interactiva, al elegir el almacenamiento mediante SecretRef se ejecuta una validación previa antes de guardar:

  • Referencias de entorno: valida el nombre de la variable de entorno y confirma que haya un valor no vacío visible durante la configuración.
  • Referencias de proveedores (file o exec): valida la selección del proveedor, resuelve id y comprueba el tipo del valor resuelto.
  • Flujo de inicio rápido: cuando gateway.auth.token ya es una SecretRef, la incorporación la resuelve antes de la sonda/inicialización del panel (para referencias env, file y exec) mediante la misma barrera de fallo rápido.

Un fallo de validación muestra el error y permite volver a intentarlo.

Contrato de SecretRef

Una única estructura de objeto en todas partes:

json5
{ source: "env" | "file" | "exec", provider: "default", id: "..." }

env

json5
{ source: "env", provider: "default", id: "OPENAI_API_KEY" }

También se aceptan cadenas abreviadas en los campos SecretInput:

json5
"${OPENAI_API_KEY}""$OPENAI_API_KEY"

Validación:

  • provider debe coincidir con ^[a-z][a-z0-9_-]{0,63}$
  • id debe coincidir con ^[A-Z][A-Z0-9_]{0,127}$

file

json5
{ source: "file", provider: "filemain", id: "/providers/openai/apiKey" }

Validación:

  • provider debe coincidir con ^[a-z][a-z0-9_-]{0,63}$
  • id debe ser un puntero JSON absoluto (/...) o el literal value para proveedores singleValue
  • Escape RFC 6901 en segmentos: ~ se convierte en ~0, / se convierte en ~1

exec

json5
{ source: "exec", provider: "vault", id: "providers/openai/apiKey#value" }

Validación:

  • provider debe coincidir con ^[a-z][a-z0-9_-]{0,63}$
  • id debe coincidir con ^[A-Za-z0-9][A-Za-z0-9._:/#-]{0,255}$ (admite selectores como secret#json_key)
  • id no debe contener . ni .. como segmentos de ruta delimitados por barras (por ejemplo, se rechaza a/../b)

Configuración de proveedores

Defina los proveedores en secrets.providers:

json5
{  secrets: {    providers: {      default: { source: "env" },      filemain: {        source: "file",        path: "~/.openclaw/secrets.json",        mode: "json", // or "singleValue"      },      vault: {        source: "exec",        command: "/usr/local/bin/openclaw-vault-resolver",        args: ["--profile", "prod"],        passEnv: ["PATH", "VAULT_ADDR"],        jsonOnly: true,      },      "team-secrets": {        source: "exec",        pluginIntegration: {          pluginId: "acme-secrets",          integrationId: "secret-store",        },      },    },    defaults: {      env: "default",      file: "filemain",      exec: "vault",    },  },}
Proveedor de entorno
  • Lista de nombres exactos permitidos opcional mediante allowlist.
  • Los valores de entorno ausentes o vacíos provocan un fallo de resolución.
Proveedor de archivos
  • Lee el archivo local en path.
  • mode: "json" (valor predeterminado) espera una carga útil de objeto JSON y resuelve id como un puntero JSON.
  • mode: "singleValue" espera el identificador de referencia "value" y devuelve el contenido sin procesar del archivo (sin el salto de línea final).
  • La ruta debe superar las comprobaciones de propiedad/permisos; timeoutMs (valor predeterminado: 5000) y maxBytes (valor predeterminado: 1 MiB) limitan la lectura.
  • Cierre seguro en Windows: si la verificación de ACL no está disponible para la ruta, la resolución falla. Solo para rutas de confianza, establezca allowInsecurePath: true en ese proveedor para omitir la comprobación.
Proveedor exec
  • Ejecuta directamente la ruta absoluta del binario configurada, sin shell.
  • De forma predeterminada, command debe ser un archivo normal, no un enlace simbólico. Establezca allowSymlinkCommand: true para permitir rutas de comandos con enlaces simbólicos (por ejemplo, shims de Homebrew) y combínelo con trustedDirs (por ejemplo, ["/opt/homebrew"]) para que solo cumplan los requisitos las rutas del gestor de paquetes.
  • Admite timeoutMs (valor predeterminado: 5000), noOutputTimeoutMs (valor predeterminado igual a timeoutMs), maxOutputBytes (valor predeterminado: 1 MiB), la lista de permitidos env/passEnv y trustedDirs.
  • jsonOnly tiene como valor predeterminado true. Con jsonOnly: false y un único id solicitado, se acepta la salida stdout sin formato JSON como valor de ese id.
  • Comportamiento de cierre seguro en Windows: si no está disponible la verificación de ACL para la ruta del comando, la resolución falla. Solo para rutas de confianza, establezca allowInsecurePath: true en ese proveedor para omitir la comprobación.
  • Los proveedores exec gestionados por plugins pueden usar pluginIntegration en lugar de unos command/args copiados. OpenClaw resuelve los detalles actuales del comando a partir del manifiesto del plugin instalado durante el inicio o la recarga; si el plugin está deshabilitado, se elimina, deja de ser de confianza o ya no declara la integración, las SecretRefs activas de ese proveedor fallan con cierre seguro.

Contenido de la solicitud (stdin):

json
{ "protocolVersion": 1, "provider": "vault", "ids": ["providers/openai/apiKey"] }

Contenido de la respuesta (stdout):

jsonc
{ "protocolVersion": 1, "values": { "providers/openai/apiKey": "<openai-api-key>" } } // pragma: allowlist secret

Errores opcionales por id:

json
{"protocolVersion": 1,"values": {},"errors": { "providers/openai/apiKey": { "code": "NOT_FOUND" } }}

code es un diagnóstico opcional legible por máquina. OpenClaw muestra los códigos reconocidos NOT_FOUND y AMBIGUOUS_DUPLICATE_KEY junto con el proveedor y el id de referencia. Se aceptan otros códigos y campos de formato libre como message para mantener la compatibilidad con la versión 1 del protocolo, pero no se muestran porque la salida del resolutor puede contener material de credenciales.

Claves de API respaldadas por archivos

No coloque cadenas file:... en el bloque env de la configuración. Ese bloque es literal y no permite sobrescrituras, por lo que file:... nunca se resuelve allí.

En su lugar, use una SecretRef de archivo en un campo de credenciales compatible:

json5
{  secrets: {    providers: {      xai_key_file: {        source: "file",        path: "~/.openclaw/secrets/xai-api-key.txt",        mode: "singleValue",      },    },  },  models: {    providers: {      xai: {        apiKey: { source: "file", provider: "xai_key_file", id: "value" },      },    },  },}

Para mode: "singleValue", el id de SecretRef es "value". Para mode: "json", use un puntero JSON absoluto como "/providers/xai/apiKey".

Consulte Superficie de credenciales SecretRef para conocer los campos que aceptan SecretRefs.

Ejemplos de integración exec

Para consultar una guía específica de 1Password que abarca las cuentas de servicio, la skill de agente incluida y la solución de problemas, consulte 1Password.

CLI de 1Password
json5
{  secrets: {    providers: {      onepassword_openai: {        source: "exec",        command: "/opt/homebrew/bin/op",        allowSymlinkCommand: true, // required for Homebrew symlinked binaries        trustedDirs: ["/opt/homebrew"],        args: ["read", "op://Personal/OpenClaw QA API Key/password"],        passEnv: ["HOME"],        jsonOnly: false,      },    },  },  models: {    providers: {      openai: {        baseUrl: "https://api.openai.com/v1",        models: [{ id: "gpt-5", name: "gpt-5" }],        apiKey: { source: "exec", provider: "onepassword_openai", id: "value" },      },    },  },}
Bitwarden Secrets Manager (`bws`)

Use un contenedor de resolución para asignar los ids de SecretRef a las claves de elementos de Bitwarden Secrets Manager. El repositorio incluye scripts/secrets/openclaw-bws-resolver.mjs; instálelo o cópielo en una ruta absoluta de confianza del host que ejecuta el Gateway.

Requisitos:

  • La CLI de Bitwarden Secrets Manager (bws) debe estar instalada en el host del Gateway.
  • BWS_ACCESS_TOKEN debe estar disponible para el servicio del Gateway.
  • PATH debe pasarse al resolutor, o BWS_BIN debe establecerse en la ruta absoluta del binario bws.
  • BWS_SERVER_URL debe establecerse en el entorno cuando se utilice una instancia de Bitwarden autoalojada.
json5
{  secrets: {    providers: {      bws: {        source: "exec",        command: "/usr/local/bin/openclaw-bws-resolver.mjs",        passEnv: ["BWS_ACCESS_TOKEN", "BWS_SERVER_URL", "PATH", "BWS_BIN"],        jsonOnly: true,      },    },  },  models: {    providers: {      openai: {        baseUrl: "https://api.openai.com/v1",        models: [{ id: "gpt-5", name: "gpt-5" }],        apiKey: {          source: "exec",          provider: "bws",          id: "openclaw/providers/openai/apiKey",        },      },    },  },}

El resolutor agrupa por lotes los ids solicitados, ejecuta bws secret list y devuelve valores para los campos key de secretos coincidentes. Use claves que cumplan el contrato de ids de SecretRef exec, como openclaw/providers/openai/apiKey; las claves de estilo variable de entorno con guiones bajos se rechazan antes de ejecutar el resolutor. Si más de un secreto visible de Bitwarden comparte la clave solicitada, el resolutor marca ese id como ambiguo y falla en lugar de hacer una suposición. Después de actualizar la configuración, verifique la ruta del resolutor:

bash
openclaw secrets audit --allow-exec
CLI de HashiCorp Vault
json5
{  secrets: {    providers: {      vault_openai: {        source: "exec",        command: "/opt/homebrew/bin/vault",        allowSymlinkCommand: true, // required for Homebrew symlinked binaries        trustedDirs: ["/opt/homebrew"],        args: ["kv", "get", "-field=OPENAI_API_KEY", "secret/openclaw"],        passEnv: ["VAULT_ADDR", "VAULT_TOKEN"],        jsonOnly: false,      },    },  },  models: {    providers: {      openai: {        baseUrl: "https://api.openai.com/v1",        models: [{ id: "gpt-5", name: "gpt-5" }],        apiKey: { source: "exec", provider: "vault_openai", id: "value" },      },    },  },}
password-store (`pass`)

Use un pequeño contenedor de resolución para asignar los ids de SecretRef directamente a las entradas pass. Guárdelo como ejecutable en una ruta absoluta que supere las comprobaciones de ruta del proveedor exec, por ejemplo, /usr/local/bin/openclaw-pass-resolver. La línea shebang #!/usr/bin/env node resuelve node a partir de PATH del proceso resolutor, por lo que debe incluir PATH en passEnv. Si pass no se encuentra en ese PATH, establezca PASS_BIN en el entorno principal e inclúyalo también en passEnv:

js
#!/usr/bin/env nodeconst { spawnSync } = require("node:child_process"); let stdin = "";process.stdin.setEncoding("utf8");process.stdin.on("data", (chunk) => {  stdin += chunk;});process.stdin.on("error", (err) => {  process.stderr.write(`${err.message}\n`);  process.exit(1);});process.stdin.on("end", () => {  let request;  try {    request = JSON.parse(stdin || "{}");  } catch (err) {    process.stderr.write(`Failed to parse request: ${err.message}\n`);    process.exit(1);  }   const passBin = process.env.PASS_BIN || "pass";  const values = {};  const errors = {};   for (const id of request.ids ?? []) {    const result = spawnSync(passBin, ["show", id], { encoding: "utf8" });    if (result.status === 0) {      values[id] = result.stdout.split(/\r?\n/, 1)[0] ?? "";    } else {      errors[id] = { message: (result.stderr || `pass exited ${result.status}`).trim() };    }  }   process.stdout.write(JSON.stringify({ protocolVersion: 1, values, errors }));});

A continuación, configure el proveedor exec y haga que apiKey apunte a la ruta de la entrada pass:

json5
{  secrets: {    providers: {      pass_store: {        source: "exec",        command: "/usr/local/bin/openclaw-pass-resolver",        passEnv: ["PATH", "HOME", "GNUPGHOME", "GPG_TTY", "PASSWORD_STORE_DIR", "PASS_BIN"],        jsonOnly: true,      },    },  },  models: {    providers: {      openai: {        baseUrl: "https://api.openai.com/v1",        models: [{ id: "gpt-5", name: "gpt-5" }],        apiKey: {          source: "exec",          provider: "pass_store",          id: "openclaw/providers/openai/apiKey",        },      },    },  },}

Mantenga el secreto en la primera línea de la entrada pass o personalice el contenedor para que devuelva la salida completa de pass show. Después de actualizar la configuración, verifique tanto la auditoría estática como la ruta del resolutor exec:

bash
openclaw secrets audit --checkopenclaw secrets audit --allow-exec
sops
json5
{  secrets: {    providers: {      sops_openai: {        source: "exec",        command: "/opt/homebrew/bin/sops",        allowSymlinkCommand: true, // required for Homebrew symlinked binaries        trustedDirs: ["/opt/homebrew"],        args: ["-d", "--extract", '["providers"]["openai"]["apiKey"]', "/path/to/secrets.enc.json"],        passEnv: ["SOPS_AGE_KEY_FILE"],        jsonOnly: false,      },    },  },  models: {    providers: {      openai: {        baseUrl: "https://api.openai.com/v1",        models: [{ id: "gpt-5", name: "gpt-5" }],        apiKey: { source: "exec", provider: "sops_openai", id: "value" },      },    },  },}

Variables de entorno del servidor MCP

Las variables de entorno del servidor MCP configuradas mediante plugins.entries.acpx.config.mcpServers aceptan SecretInput, lo que mantiene las claves de API y los tokens fuera de la configuración en texto sin formato:

json5
{  plugins: {    entries: {      acpx: {        enabled: true,        config: {          mcpServers: {            github: {              command: "npx",              args: ["-y", "@modelcontextprotocol/server-github"],              env: {                GITHUB_PERSONAL_ACCESS_TOKEN: {                  source: "env",                  provider: "default",                  id: "MCP_GITHUB_PAT",                },              },            },          },        },      },    },  },}

Los valores de cadena en texto sin formato siguen funcionando. Las referencias de plantilla de entorno como ${MCP_SERVER_API_KEY} y los objetos SecretRef se resuelven durante la activación del Gateway, antes de que se genere el proceso del servidor MCP. Al igual que con otras superficies SecretRef, las referencias sin resolver solo bloquean la activación cuando el plugin acpx está efectivamente activo.

Material de autenticación SSH del entorno aislado

El backend de entorno aislado principal ssh también admite SecretRefs para el material de autenticación SSH:

json5
{  agents: {    defaults: {      sandbox: {        mode: "all",        backend: "ssh",        ssh: {          target: "user@gateway-host:22",          identityData: { source: "env", provider: "default", id: "SSH_IDENTITY" },          certificateData: { source: "env", provider: "default", id: "SSH_CERTIFICATE" },          knownHostsData: { source: "env", provider: "default", id: "SSH_KNOWN_HOSTS" },        },      },    },  },}

Comportamiento en tiempo de ejecución:

  • OpenClaw resuelve estas referencias durante la activación del entorno aislado, no de forma diferida en cada llamada SSH.
  • Los valores resueltos se escriben en un directorio temporal con permisos de archivo restrictivos (0o600) y se utilizan en la configuración SSH generada.
  • Si el backend efectivo del entorno aislado no es ssh (o el modo del entorno aislado es off), estas referencias permanecen inactivas y no bloquean el inicio.

Superficie de credenciales compatible

Las credenciales compatibles y no compatibles canónicas se enumeran en Superficie de credenciales de SecretRef.

Comportamiento requerido y precedencia

  • Campo sin referencia: sin cambios.
  • Campo con referencia: obligatorio en las superficies activas durante la activación.
  • Si están presentes tanto el texto sin formato como la referencia, la referencia tiene precedencia en las rutas de precedencia compatibles.
  • El centinela de censura __OPENCLAW_REDACTED__ está reservado para la censura/restauración interna de la configuración y se rechaza como dato literal de configuración enviado.

Señales de advertencia y auditoría:

  • SECRETS_REF_OVERRIDES_PLAINTEXT (advertencia en tiempo de ejecución)
  • REF_SHADOWED (hallazgo de auditoría cuando las credenciales auth-profiles.json tienen precedencia sobre las referencias openclaw.json)

Google Chat serviceAccount acepta JSON insertado o una SecretRef. Doctor mueve el elemento hermano retirado serviceAccountRef a este campo canónico cuando no está definido.

Desencadenadores de activación

La activación de secretos se ejecuta durante:

  • El inicio (comprobación previa más activación final)
  • La ruta de aplicación en caliente de la recarga de configuración
  • La ruta de comprobación de reinicio de la recarga de configuración
  • La recarga manual mediante secrets.reload
  • La comprobación previa de la RPC de escritura de configuración del Gateway (config.set / config.apply / config.patch), que valida las SecretRefs de las superficies activas dentro de la carga útil de configuración enviada antes de guardar los cambios

Contrato de activación:

  • En caso de éxito, la instantánea se sustituye de forma atómica.
  • Un fallo estricto durante el inicio interrumpe el inicio del Gateway.
  • Durante un inicio en frío, un fallo de resolución reintentable de un propietario no perteneciente al Gateway, asignado y aislable, puede publicar la instantánea con ese propietario exacto configurado como no disponible. Las solicitudes para el propietario fallan con SECRET_SURFACE_UNAVAILABLE; los propietarios de proveedores de modelos no recurren a credenciales del entorno ni del perfil de autenticación después de que falle una referencia explícita.
  • La recarga y la comprobación de reinicio aíslan a los propietarios asignados aptos. Las identidades de referencia sin cambios, con definiciones de proveedor sin cambios y un contrato completo no secreto del propietario sin cambios, conservan sus valores exactos válidos más recientes como obsoletos; las referencias no resueltas modificadas o recién configuradas se publican en frío solo para ese propietario. Un fallo estricto de recarga conserva la instantánea activa anterior.
  • config.set, config.apply y config.patch aceptan referencias no resueltas sintácticamente válidas para propietarios aislables y devuelven un informe degradedSecretOwners censurado. La autenticación de entrada del Gateway, la configuración o los valores resueltos estructuralmente no válidos, las infracciones de políticas y los propietarios desconocidos siguen rechazándose antes de modificar el disco.
  • Los propietarios hermanos en buen estado se resuelven y publican con normalidad incluso cuando otro propietario está en frío u obsoleto.
  • Proporcionar un token de canal explícito por llamada a una llamada de herramienta o auxiliar de salida no desencadena la activación de SecretRef; los puntos de activación siguen siendo el inicio, la recarga y el secrets.reload explícito.

Señales de degradación y recuperación

Cuando la activación durante la recarga falla después de un estado en buen funcionamiento, OpenClaw entra en un estado de secretos degradado y emite eventos del sistema de una sola vez y códigos de registro:

  • SECRETS_RELOADER_DEGRADED
  • SECRETS_RELOADER_RECOVERED

Comportamiento:

  • Degradado: los propietarios en buen estado se actualizan, los propietarios obsoletos conservan el último valor válido conocido y los propietarios en frío permanecen no disponibles.
  • Recuperado: se emite una vez después de la siguiente activación correcta.
  • Los fallos repetidos mientras el sistema ya está degradado registran advertencias, pero no vuelven a emitir el evento.
  • Un fallo estricto durante el inicio nunca emite un evento de degradación, porque el entorno de ejecución nunca llegó a estar activo. Un inicio correcto con propietarios en frío registra la degradación del propietario, pero no emite un evento del recargador.
  • Los fallos de inicio y recarga limitados a referencias emiten una advertencia estructurada SECRETS_DEGRADED para cada propietario afectado. Las interrupciones limitadas al proveedor emiten una advertencia SECRETS_PROVIDER_DEGRADED con el proveedor y la lista completa de propietarios afectados, en lugar de repetir el fallo del proveedor para cada propietario. Las advertencias incluyen un motivo censurado, el estado del propietario cold o stale y la sugerencia de reintento openclaw secrets reload. Nunca incluyen valores resueltos ni identificadores de SecretRef.
  • openclaw doctor enumera los propietarios en frío y obsoletos con sus rutas de configuración afectadas, el motivo censurado y las instrucciones para reintentar.

Resolución de rutas de comandos

Las rutas de comandos pueden habilitar la resolución de SecretRef compatible mediante una RPC de instantánea del Gateway. Se aplican dos comportamientos generales:

Rutas de comandos estrictas

Por ejemplo, las rutas de memoria remota openclaw memory y openclaw qr --remote cuando necesita referencias remotas de secretos compartidos. Leen de la instantánea activa y fallan de inmediato cuando una SecretRef obligatoria no está disponible.

Rutas de comandos de solo lectura

Por ejemplo, openclaw status, openclaw status --all, openclaw channels status, openclaw channels resolve, openclaw security audit y los flujos de reparación de configuración/Doctor de solo lectura. También prefieren la instantánea activa, pero se degradan en lugar de interrumpirse cuando una SecretRef específica no está disponible.

Comportamiento de solo lectura:

  • Cuando el Gateway está en ejecución, estos comandos leen primero de la instantánea activa.
  • Si la resolución del Gateway está incompleta o el Gateway no está disponible, intentan una alternativa local específica para esa superficie de comandos.
  • Si una SecretRef específica sigue sin estar disponible, el comando continúa con una salida degradada de solo lectura y un diagnóstico explícito que indica que la referencia está configurada, pero no disponible en esta ruta de comandos.
  • Este comportamiento degradado solo se aplica localmente al comando; no debilita las rutas de inicio, recarga, envío o autenticación del entorno de ejecución.

Otras notas:

  • La actualización de la instantánea después de la rotación de secretos del backend se gestiona mediante openclaw secrets reload.
  • Método RPC del Gateway utilizado por estas rutas de comandos: secrets.resolve.

Flujo de trabajo de auditoría y configuración

Flujo predeterminado del operador:

  • Auditar el estado actual

    bash
    openclaw secrets audit --check
  • Configurar y aplicar SecretRefs

    bash
    openclaw secrets configure --apply
  • Volver a auditar

    bash
    openclaw secrets audit --check
  • No se debe considerar que la migración está completa hasta que la nueva auditoría no detecte problemas. Si la auditoría sigue informando de valores en texto sin formato almacenados, el riesgo de acceso por parte del agente permanece incluso cuando las API del entorno de ejecución devuelven valores censurados.

    Si se guarda un plan en lugar de aplicarlo durante configure, se debe aplicar ese plan guardado con openclaw secrets apply --from <plan-path> antes de volver a realizar la auditoría.

    auditoría de secretos

    Los hallazgos incluyen:

    • Valores en texto sin formato almacenados (openclaw.json, auth-profiles.json, .env y agents/*/agent/models.json generado).
    • Residuos de encabezados confidenciales de proveedores en texto sin formato en entradas models.json generadas.
    • Referencias no resueltas.
    • Ocultación por precedencia (auth-profiles.json tiene prioridad sobre las referencias openclaw.json).
    • Residuos heredados (auth.json, recordatorios de OAuth).

    Nota sobre la ejecución: de forma predeterminada, la auditoría omite las comprobaciones de resolución de SecretRef de ejecución para evitar efectos secundarios de los comandos. Se debe utilizar openclaw secrets audit --allow-exec para ejecutar proveedores de ejecución durante la auditoría.

    Nota sobre los residuos de encabezados: la detección de encabezados confidenciales de proveedores se basa en heurísticas de nombres (nombres comunes de encabezados de autenticación/credenciales y fragmentos como authorization, x-api-key, token, secret, password y credential).

    configuración de secretos

    Asistente interactivo que:

    • Configura primero secrets.providers (env/file/exec, añadir/editar/eliminar).
    • Permite seleccionar campos compatibles que contienen secretos en openclaw.json, además de auth-profiles.json, para el ámbito de un agente.
    • Puede crear una nueva asignación auth-profiles.json directamente en el selector de destino.
    • Captura los detalles de SecretRef (source, provider, id).
    • Ejecuta la resolución previa y puede aplicarla inmediatamente.

    Nota sobre la ejecución: la comprobación previa omite las comprobaciones de SecretRef de ejecución a menos que se establezca --allow-exec. Si se aplica directamente desde configure --apply y el plan incluye referencias/proveedores de ejecución, se debe mantener --allow-exec establecido también para el paso de aplicación.

    Modos útiles:

    • openclaw secrets configure --providers-only
    • openclaw secrets configure --skip-provider-setup
    • openclaw secrets configure --agent <id>

    Valores predeterminados de aplicación de configure:

    • Elimina las credenciales estáticas coincidentes de auth-profiles.json para los proveedores seleccionados.
    • Elimina las entradas estáticas heredadas api_key de auth.json.
    • Elimina las líneas de secretos conocidos coincidentes de los archivos .env del estado efectivo y de la configuración activa (se eliminan los duplicados cuando ambas rutas coinciden).
    aplicación de secretos

    Aplicar un plan guardado:

    bash
    openclaw secrets apply --from /tmp/openclaw-secrets-plan.jsonopenclaw secrets apply --from /tmp/openclaw-secrets-plan.json --allow-execopenclaw secrets apply --from /tmp/openclaw-secrets-plan.json --dry-runopenclaw secrets apply --from /tmp/openclaw-secrets-plan.json --dry-run --allow-exec

    Nota sobre la ejecución: el ensayo omite las comprobaciones de ejecución a menos que se establezca --allow-exec; el modo de escritura rechaza los planes que contienen SecretRefs/proveedores de ejecución a menos que se establezca --allow-exec.

    Para obtener información detallada sobre el contrato estricto de destinos/rutas y las reglas exactas de rechazo, consulte Contrato del plan de aplicación de secretos.

    Política de seguridad unidireccional

    Modelo de seguridad:

    • La comprobación previa debe completarse correctamente antes del modo de escritura.
    • La activación del entorno de ejecución se valida antes de confirmar los cambios.
    • La aplicación actualiza los archivos mediante sustitución atómica y restauración de mejor esfuerzo en caso de fallo.

    Notas sobre la compatibilidad con la autenticación heredada

    Para las credenciales estáticas, el entorno de ejecución ya no depende del almacenamiento de autenticación heredado en texto sin formato.

    • La fuente de credenciales del entorno de ejecución es la instantánea resuelta en memoria.
    • Las entradas estáticas heredadas api_key se eliminan al detectarse.
    • El comportamiento de compatibilidad relacionado con OAuth se mantiene separado.

    Nota sobre la interfaz web

    Algunas uniones SecretInput son más fáciles de configurar en el modo de editor sin formato que en el modo de formulario.

    Contenido relacionado

    Was this useful?
    On this page

    On this page