Конфигурация и операции
Управление секретами
OpenClaw поддерживает аддитивные SecretRefs, поэтому поддерживаемые учетные данные не нужно хранить в открытом виде в конфигурации. Обычны й текст по-прежнему работает. SecretRefs включаются опционально для каждого учетного поля.
Цели и модель выполнения
Секреты разрешаются в снимок состояния в памяти.
- Разрешение происходит активно во время активации, а не лениво на путях запросов.
- Запуск завершается с ошибкой при невозможности разрешить фактически активный SecretRef.
- Перезагрузка использует атомарную замену: полный успех или сохранение последнего известного рабочего снимка.
- Запросы во время выполнения читают только из активного снимка в памяти.
Это позволяет избежать влияния сбоев провайдеров секретов на активные пути запросов.
Фильтрация активных поверхностей
SecretRefs проверяются только на фактически активных поверхностях.
- Включенные поверхности: неразрешенные ссылки блокируют запуск/перезагрузку.
- Неактивные поверхности: неразрешенные ссылки не блокируют запуск/перезагрузку.
- Неактивные ссылки генерируют нефатальные диагностические сообщения с кодом
SECRETS_REF_IGNORED_INACTIVE_SURFACE.
Примеры неактивных поверхностей:
- Отключенные записи каналов/аккаунтов.
- Учетные данные канала верхнего уровня, которые не наследуются ни одним включенным аккаунтом.
- Отключенные поверхности инструментов/функций.
- Ключи, специфичные для провайдера веб-поиска, который не выбран в
tools.web.search.provider. В автоматическом режиме (провайдер не задан) провайдер-специфичные ключи также активны для автоопределения провайдера. - SecretRefs
gateway.remote.token/gateway.remote.passwordактивны (когдаgateway.remote.enabledнеfalse), если верно одно из условий:gateway.mode=remote- настроен
gateway.remote.url gateway.tailscale.modeимеет значениеserveилиfunnelВ локальном режиме без этих удаленных поверхностей:gateway.remote.tokenактивен, когда аутентификация по токену может победить и не настроен токен env/auth.gateway.remote.passwordактивен только когда аутентификация по паролю может победить и не настроен пароль env/auth.
- SecretRef
gateway.auth.tokenнеактивен для разрешения аутентификации при запуске, когда установлена переменнаяOPENCLAW_GATEWAY_TOKEN(илиCLAWDBOT_GATEWAY_TOKEN), потому что токен из окружения имеет приоритет для этого запуска.
Диагностика поверхности аутентификации шлюза
Когда SecretRef настроен для gateway.auth.token, gateway.auth.password, gateway.remote.token или gateway.remote.password, запуск/перезагрузка шлюза явно логирует состояние поверхности:
active: SecretRef является частью эффективной поверхности аутентификации и должен быть разрешен.inactive: SecretRef игнорируется для этого запуска, потому что другая поверхность аутентификации побеждает, или потому что удаленная аутентификация отключена/не активна.
Эти записи логируются с кодом SECRETS_GATEWAY_AUTH_SURFACE и включают причину, используемую политикой активной поверхности, чтобы вы могли видеть, почему учетные данные были обработаны как активные или неактивные.
Предварительная проверка при онбординге
Когда онбординг запускается в интерактивном режиме и вы выбираете хранение через SecretRef, OpenClaw выполняет предварительную проверку перед сохранением:
- Ссылки на переменные окружения (
env): проверяет имя переменной и подтверждает, что непустое значение видно во время онбординга. - Ссылки на провайдеров (
fileилиexec): проверяет выбор провайдера, разрешаетidи проверяет тип разрешенного значения. - Путь повторного использования быстрого старта: когда
gateway.auth.tokenуже является SecretRef, онбординг разрешает его перед проверкой/загрузкой панели управления (для ссылокenv,fileиexec) с использованием того же строгого контроля.
Если проверка не удалась, онбординг показывает ошибку и позволяет повторить попытку.
Контракт SecretRef
Используйте одну форму объекта везде:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }
source: "env"
{ source: "env", provider: "default", id: "OPENAI_API_KEY" }
Проверка:
providerдолжен соответствовать^[a-z][a-z0-9_-]{0,63}$idдолжен соответствовать^[A-Z][A-Z0-9_]{0,127}$
source: "file"
{ source: "file", provider: "filemain", id: "/providers/openai/apiKey" }
Проверка:
providerдолжен соответствовать^[a-z][a-z0-9_-]{0,63}$idдолжен быть абсолютным JSON-указателем (/...)- Экранирование RFC6901 в сегментах:
~=>~0,/=>~1
source: "exec"
{ source: "exec", provider: "vault", id: "providers/openai/apiKey" }
Проверка:
providerдолжен соответствовать^[a-z][a-z0-9_-]{0,63}$idдолжен соответствовать^[A-Za-z0-9][A-Za-z0-9._:/-]{0,255}$
Конфигурация провайдера
Определите провайдеров в secrets.providers:
{
secrets: {
providers: {
default: { source: "env" },
filemain: {
source: "file",
path: "~/.openclaw/secrets.json",
mode: "json", // или "singleValue"
},
vault: {
source: "exec",
command: "/usr/local/bin/openclaw-vault-resolver",
args: ["--profile", "prod"],
passEnv: ["PATH", "VAULT_ADDR"],
jsonOnly: true,
},
},
defaults: {
env: "default",
file: "filemain",
exec: "vault",
},
resolution: {
maxProviderConcurrency: 4,
maxRefsPerProvider: 512,
maxBatchBytes: 262144,
},
},
}
Провайдер переменных окружения (Env)
- Опциональный разрешительный список через
allowlist. - Отсутствующие/пустые значения переменных окружения приводят к сбою разрешения.
Файловый провайдер (File)
- Читает локальный файл по
path. mode: "json"ожидает полезную нагрузку в виде объекта JSON и разрешаетidкак указатель.mode: "singleValue"ожидает идентификатор ссылки"value"и возвращает содержимое файла.- Путь должен пройти проверки владения/разрешений.
- Примечание для Windows (закрытый режим при сбое): если проверка ACL недоступна для пути, разрешение завершается сбоем. Только для доверенных путей установите
allowInsecurePath: trueдля этого провайдера, чтобы обойти проверки безопасности пути.
Провайдер выполнения (Exec)
- Запускает настроенный абсолютный путь к бинарному файлу, без оболочки.
- По умолчанию
commandдолжен указывать на обычный файл (не символьную ссылку). - Установите
allowSymlinkCommand: true, чтобы разрешить пути команд-символьных ссылок (например, для шимов Homebrew). OpenClaw проверяет разрешенный целевой путь. - Используйте
allowSymlinkCommandвместе сtrustedDirsдля путей менеджеров пакетов (например,["/opt/homebrew"]). - Поддерживает таймаут, таймаут отсутствия вывода, ограничения на размер вывода, разрешительный список переменных окружения и доверенные каталоги.
- Примечание для Windows (закрытый режим при сбое): если проверка ACL недоступна для пути команды, разрешение завершается сбоем. Только для доверенных путей установите
allowInsecurePath: trueдля этого провайдера, чтобы обойти проверки безопасности пути.
Полезная нагрузка запроса (stdin):
{ "protocolVersion": 1, "provider": "vault", "ids": ["providers/openai/apiKey"] }
Полезная нагрузка ответа (stdout):
{ "protocolVersion": 1, "values": { "providers/openai/apiKey": "<openai-api-key>" } } // pragma: allowlist secret
Опциональные ошибки для каждого id:
{
"protocolVersion": 1,
"values": {},
"errors": { "providers/openai/apiKey": { "message": "not found" } }
}
Примеры интеграции с Exec
1Password CLI
{
secrets: {
providers: {
onepassword_openai: {
source: "exec",
command: "/opt/homebrew/bin/op",
allowSymlinkCommand: true, // требуется для символьных ссылок Homebrew на бинарные файлы
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" },
},
},
},
}
HashiCorp Vault CLI
{
secrets: {
providers: {
vault_openai: {
source: "exec",
command: "/opt/homebrew/bin/vault",
allowSymlinkCommand: true, // требуется для символьных ссылок Homebrew на бинарные файлы
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" },
},
},
},
}
sops
{
secrets: {
providers: {
sops_openai: {
source: "exec",
command: "/opt/homebrew/bin/sops",
allowSymlinkCommand: true, // требуется для символьных ссылок Homebrew на бинарные файлы
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" },
},
},
},
}
Поддерживаемая поверхность учетных данных
Канонический список поддерживаемых и неподдерживаемых учетных данных приведен в:
Динамически создаваемые или ротирующиеся учетные данные, а также материал для обновления OAuth намеренно исключены из разрешения SecretRef только для чтения.
Требуемое поведение и приоритет
- Поле без ссылки: без изменений.
- Поле со ссылкой: обязательно на активных поверхностях во время активации.
- Если присутствуют и обычный текст, и ссылка, ссылка имеет приоритет на поддерживаемых путях приоритета.
Предупреждения и сигналы аудита:
SECRETS_REF_OVERRIDES_PLAINTEXT(предупреждение во время выполнения)REF_SHADOWED(результат аудита, когда учетные данныеauth-profiles.jsonимеют приоритет над ссылками вopenclaw.json)
Поведение совместимости с Google Chat:
serviceAccountRefимеет приоритет над обычным текстомserviceAccount.- Обычное текстовое значение игнорируется, когда установлена ссылка-сосед.