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,.envy los archivosmodels.jsongenerados. openclaw secrets audit --checkno 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_SURFACEno 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 essshy el modo del entorno aislado no esoff, para el agente predeterminado o un agente habilitado. - Las SecretRefs
gateway.remote.token/gateway.remote.passwordestán activas si se cumple cualquiera de estas condiciones: gateway.mode=remotegateway.remote.urlestá configuradogateway.tailscale.modeesserveofunnel- En modo local sin esas superficies remotas:
gateway.remote.tokenestá activo cuando puede prevalecer la autenticación mediante token y no hay ningún token de entorno/autenticación configurado;gateway.remote.passwordsolo 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.tokenestá inactiva para la resolución de autenticación al inicio cuando se estableceOPENCLAW_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 (
fileoexec): valida la selección del proveedor, resuelveidy comprueba el tipo del valor resuelto. - Flujo de inicio rápido: cuando
gateway.auth.tokenya es una SecretRef, la incorporación la resuelve antes de la sonda/inicialización del panel (para referenciasenv,fileyexec) 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:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }env
{ source: "env", provider: "default", id: "OPENAI_API_KEY" }También se aceptan cadenas abreviadas en los campos SecretInput:
"${OPENAI_API_KEY}""$OPENAI_API_KEY"Validación:
providerdebe coincidir con^[a-z][a-z0-9_-]{0,63}$iddebe coincidir con^[A-Z][A-Z0-9_]{0,127}$
file
{ source: "file", provider: "filemain", id: "/providers/openai/apiKey" }Validación:
providerdebe coincidir con^[a-z][a-z0-9_-]{0,63}$iddebe ser un puntero JSON absoluto (/...) o el literalvaluepara proveedoressingleValue- Escape RFC 6901 en segmentos:
~se convierte en~0,/se convierte en~1
exec
{ source: "exec", provider: "vault", id: "providers/openai/apiKey#value" }Validación:
providerdebe coincidir con^[a-z][a-z0-9_-]{0,63}$iddebe coincidir con^[A-Za-z0-9][A-Za-z0-9._:/#-]{0,255}$(admite selectores comosecret#json_key)idno debe contener.ni..como segmentos de ruta delimitados por barras (por ejemplo, se rechazaa/../b)
Configuración de proveedores
Defina los proveedores en secrets.providers:
{ 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 resuelveidcomo 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) ymaxBytes(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: trueen ese proveedor para omitir la comprobación.
Proveedor exec
- Ejecuta directamente la ruta absoluta del binario configurada, sin shell.
- De forma predeterminada,
commanddebe ser un archivo normal, no un enlace simbólico. EstablezcaallowSymlinkCommand: truepara permitir rutas de comandos con enlaces simbólicos (por ejemplo, shims de Homebrew) y combínelo contrustedDirs(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 atimeoutMs),maxOutputBytes(valor predeterminado: 1 MiB), la lista de permitidosenv/passEnvytrustedDirs. jsonOnlytiene como valor predeterminadotrue. ConjsonOnly: falsey 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: trueen ese proveedor para omitir la comprobación. - Los proveedores exec gestionados por plugins pueden usar
pluginIntegrationen lugar de unoscommand/argscopiados. 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):
{ "protocolVersion": 1, "provider": "vault", "ids": ["providers/openai/apiKey"] }Contenido de la respuesta (stdout):
{ "protocolVersion": 1, "values": { "providers/openai/apiKey": "<openai-api-key>" } } // pragma: allowlist secretErrores opcionales por id:
{"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:
{ 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
{ 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_TOKENdebe estar disponible para el servicio del Gateway.PATHdebe pasarse al resolutor, oBWS_BINdebe establecerse en la ruta absoluta del binariobws.BWS_SERVER_URLdebe establecerse en el entorno cuando se utilice una instancia de Bitwarden autoalojada.
{ 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:
openclaw secrets audit --allow-execCLI de HashiCorp Vault
{ 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:
#!/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:
{ 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:
openclaw secrets audit --checkopenclaw secrets audit --allow-execsops
{ 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:
{ 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:
{ 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 esoff), 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 credencialesauth-profiles.jsontienen precedencia sobre las referenciasopenclaw.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.applyyconfig.patchaceptan referencias no resueltas sintácticamente válidas para propietarios aislables y devuelven un informedegradedSecretOwnerscensurado. 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.reloadexplí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_DEGRADEDSECRETS_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_DEGRADEDpara cada propietario afectado. Las interrupciones limitadas al proveedor emiten una advertenciaSECRETS_PROVIDER_DEGRADEDcon 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 propietariocoldostaley la sugerencia de reintentoopenclaw secrets reload. Nunca incluyen valores resueltos ni identificadores de SecretRef. openclaw doctorenumera 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
openclaw secrets audit --checkConfigurar y aplicar SecretRefs
openclaw secrets configure --applyVolver a auditar
openclaw secrets audit --checkNo 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,.envyagents/*/agent/models.jsongenerado). - Residuos de encabezados confidenciales de proveedores en texto sin formato en entradas
models.jsongeneradas. - Referencias no resueltas.
- Ocultación por precedencia (
auth-profiles.jsontiene prioridad sobre las referenciasopenclaw.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 deauth-profiles.json, para el ámbito de un agente. - Puede crear una nueva asignación
auth-profiles.jsondirectamente 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-onlyopenclaw secrets configure --skip-provider-setupopenclaw secrets configure --agent <id>
Valores predeterminados de aplicación de configure:
- Elimina las credenciales estáticas coincidentes de
auth-profiles.jsonpara los proveedores seleccionados. - Elimina las entradas estáticas heredadas
api_keydeauth.json. - Elimina las líneas de secretos conocidos coincidentes de los archivos
.envdel estado efectivo y de la configuración activa (se eliminan los duplicados cuando ambas rutas coinciden).
aplicación de secretos
Aplicar un plan guardado:
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-execNota 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_keyse 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
- Autenticación - configuración de autenticación
- CLI: secretos - comandos de la CLI
- SecretRefs de Vault - configuración del proveedor HashiCorp Vault
- Variables de entorno - precedencia del entorno
- Superficie de credenciales de SecretRef - superficie de credenciales
- Contrato del plan de aplicación de secretos - detalles del contrato del plan
- Seguridad - postura de seguridad