Сопряжение Node имеет два уровня, оба хранятся в записи сопряжённого устройства в
базе данных состояния SQLite Gateway:
- Сопряжение устройства (роль
node) ограничивает рукопожатие connect. См.
Автоматическое одобрение устройства для доверенного CIDR
ниже и Сопряжение каналов.
- Одобрение возможностей Node (
node.pair.*) определяет, какие заявленные
возможности/команды может предоставлять подключённый Node. Gateway является
источником истины; интерфейсы (приложение macOS, Control UI) служат клиентскими оболочками, которые одобряют или
отклоняют ожидающие запросы.
Прежнее отдельное хранилище сопряжений Node (nodes/paired.json с отдельным для каждого Node
токеном, исключённым из пути подключения в январе 2026 года) удалено: при запуске шлюзы однократно переносят
все оставшиеся строки в записи устройств и архивируют
устаревшие файлы с суффиксом .migrated. Поддержка устаревшего моста TCP
удалена.
Как работает одобрение возможностей
- Node подключается к WS Gateway (на этом этапе требуется сопряжение устройства).
- Gateway сравнивает заявленный набор возможностей/команд с
одобренным; новые или расширенные наборы сохраняются как ожидающий запрос в
записи устройства и вызывают событие
node.pair.requested.
- Запрос одобряется или отклоняется (через CLI или интерфейс).
- До одобрения команды Node остаются отфильтрованными; после одобрения заявленный
набор становится доступен с учётом обычной политики команд.
Ожидающие запросы автоматически истекают через 5 минут после последней
повторной попытки Node — активно переподключающийся Node поддерживает один ожидающий запрос,
а не создаёт новый запрос (и приглашение к одобрению) при каждой попытке.
Рабочий процесс CLI (подходит для среды без графического интерфейса)
nodes status показывает сопряжённые/подключённые Node и их возможности.
Поверхность API (протокол Gateway)
События:
node.pair.requested — вызывается при создании нового ожидающего запроса.
node.pair.resolved — вызывается, когда запрос одобрен, отклонён или
истёк.
Методы:
node.pair.list — выводит список ожидающих и сопряжённых Node (operator.pairing).
node.pair.approve — одобряет ожидающий запрос.
node.pair.reject — отклоняет ожидающий запрос.
node.pair.remove — удаляет сопряжённый Node. Это отзывает роль node
устройства в хранилище сопряжённых устройств, вместе с ней удаляет одобренную поверхность Node и
делает недействительными/отключает сеансы этого устройства с ролью Node. Устройство со смешанными ролями
(например, также имеющее operator) сохраняет свою строку и только
теряет роль node; строка устройства только с ролью Node удаляется. Авторизация:
operator.pairing может удалять строки Node, не относящиеся к оператору; вызывающей стороне с токеном устройства,
отзывающей собственную роль Node на устройстве со смешанными ролями, дополнительно требуется
operator.admin.
node.rename — переименовывает отображаемое для оператора имя сопряжённого Node.
Удалены в версии 2026.7: node.pair.request и node.pair.verify. Ожидающие
запросы создаются самим Gateway при подключении Node, а
отдельного токена для каждого Node, который они обслуживали, больше не существует; для аутентификации Node используется
токен сопряжения устройства.
Примечания:
- При переподключении с неизменившейся поверхностью повторно используется ожидающий запрос; повторные
запросы обновляют сохранённые метаданные Node и последний снимок заявленных команд из списка разрешённых
для отображения оператору.
- Уровни областей действия оператора и проверки во время одобрения кратко описаны в разделе
Области действия оператора.
node.pair.approve использует заявленные в ожидающем запросе команды, чтобы требовать
дополнительные области действия для одобрения:
- запрос без команд:
operator.pairing
- запрос обычной команды:
operator.pairing + operator.write
- запрос с административно-чувствительными командами, содержащий
system.run, system.run.prepare,
system.which, browser.proxy, fs.listDir или
system.execApprovals.get/set: operator.pairing + operator.admin
Одобрение сопряжения Node фиксирует доверенную поверхность возможностей. Оно не закрепляет активную поверхность команд Node отдельно для каждого Node.
- Активные команды Node определяются тем, что Node заявляет при подключении, и фильтруются
глобальной политикой команд Node шлюза (
gateway.nodes.allowCommands и
denyCommands).
- Политика разрешения и запроса
system.run для каждого Node хранится на Node в
exec.approvals.node.*, а не в записи сопряжения.
Ограничение команд Node (2026.3.31+)
Критическое изменение: начиная с 2026.3.31, команды Node отключены до одобрения сопряжения Node. Одного сопряжения устройства больше недостаточно для предоставления заявленных команд Node.
При первом подключении Node сопряжение запрашивается автоматически.
Пока этот запрос не одобрен, все ожидающие команды Node от этого Node
фильтруются и не выполняются. После одобрения сопряжения заявленные Node
команды становятся доступны с учётом обычной политики команд.
Это означает:
- Node, которые ранее полагались только на сопряжение устройства для предоставления команд, теперь
также должны выполнить сопряжение Node.
- Команды, поставленные в очередь до одобрения сопряжения, отбрасываются, а не откладываются.
Границы доверия событий Node (2026.3.31+)
Критическое изменение: запуски, инициированные Node, теперь остаются в пределах сокращённой доверенной поверхности.
Сводки, инициированные Node, и связанные события сеанса ограничены
предусмотренной доверенной поверхностью. Потоки, запускаемые уведомлениями или Node,
которые ранее полагались на более широкий доступ к инструментам хоста или сеанса, могут потребовать корректировки.
Это усиление защиты не позволяет событиям Node повышать привилегии до доступа к инструментам уровня хоста
за пределами, разрешёнными границей доверия Node.
Долговременные обновления присутствия Node следуют той же границе идентификации: событие
node.presence.alive принимается только от аутентифицированных сеансов устройств Node
и обновляет метаданные сопряжения, только если идентичность устройства/Node
уже сопряжена. Самостоятельно заявленного значения client.id недостаточно для записи
состояния последнего присутствия.
Автоматическое одобрение устройства с проверкой по SSH (по умолчанию)
Первичное сопряжение устройства role: node с частного адреса/адреса CGNAT
одобряется автоматически, когда шлюз может подтвердить владение машиной по SSH: он
подключается обратно к хосту сопряжения (BatchMode, StrictHostKeyChecking=yes),
запускает там openclaw node identity --json и одобряет запрос, только если удалённые
идентификатор устройства и открытый ключ точно совпадают с ожидающим запросом. Именно совпадение ключа
обеспечивает безопасность: одной доступности недостаточно для одобрения, поэтому соседи по NAT,
другие пользователи общего хоста и подмена в LAN переводятся в обычный
процесс с запросом подтверждения.
Включено по умолчанию. Условия срабатывания:
- Пользователь процесса шлюза (или
sshVerify.user) может подключиться по SSH к хосту Node
без интерактивного ввода (ключи/агент; Tailscale SSH также поддерживается), а ключ хоста
уже является доверенным.
openclaw разрешается на удалённом PATH для неинтерактивного sh -lc.
- IP-адрес подключения является прямым (без прокси и не loopback) частным адресом, ULA,
link-local или адресом CGNAT либо соответствует
sshVerify.cidrs, если этот параметр задан.
- Минимальные требования совпадают с одобрением доверенного CIDR: только новое сопряжение Node
без областей действия; обновления, браузеры, Control UI и WebChat всегда требуют подтверждения.
Пока выполняется проверка, клиенту Node предписывается продолжать повторные попытки
(wait_then_retry), а не приостанавливаться для ручного одобрения; если проверка
завершается неудачно, следующая попытка возвращается к обычному процессу подтверждения. Для неуспешно проверенных целей
действует короткая пауза (5 минут после несовпадения ключа).
Для одобренных устройств записывается approvedVia: "ssh-verified", а их первая заявленная
поверхность возможностей одобряется на том же этапе — совпадение ключа уже подтверждает,
что Node работает под учётной записью оператора на принадлежащей ему машине, то есть подтверждает
то же утверждение, что и ручное одобрение возможностей. Последующие расширения поверхности по-прежнему
требуют подтверждения.
Усиление защиты или отключение:
Автоматическое одобрение (приложение macOS)
Приложение macOS может попытаться выполнить тихое одобрение запросов возможностей Node,
если:
- запрос помечен как
silent (шлюз помечает первую поверхность возможностей
как тихую, если сопряжение устройства было одобрено неинтерактивно), и
- приложение может проверить SSH-подключение к хосту шлюза с использованием того же
пользователя.
Если тихое одобрение завершается неудачно, используется обычный запрос Approve/Reject.
Автоматическое одобрение устройства для доверенного CIDR
Сопряжение устройства по WS для role: node по умолчанию остаётся ручным. Для частных сетей Node,
в которых Gateway уже доверяет сетевому пути, операторы могут включить эту функцию,
явно указав CIDR или точные IP-адреса:
Граница безопасности:
- Отключено, если
gateway.nodes.pairing.autoApproveCidrs не задан.
- Режима автоматического одобрения для всей LAN или частной сети не существует; автоматическое одобрение
с проверкой по SSH (выше) требует криптографического совпадения ключа устройства, а не только
нахождения в той же сети.
- Допускается только новый запрос сопряжения устройства
role: node без запрошенных областей действия.
- Для клиентов оператора, браузера, Control UI и WebChat сохраняется ручное одобрение.
- Изменения роли, области действия, метаданных и открытого ключа требуют ручного одобрения.
- Пути заголовков доверенного прокси через loopback того же хоста не допускаются, поскольку этот
путь может быть подделан локальными вызывающими сторонами.
Очистка заменённых тихих сопряжений
При неинтерактивном одобрении его происхождение записывается в строке сопряжённого устройства:
одобрения локальной политикой того же хоста — как silent, одобрения Node для доверенного CIDR — как
trusted-cidr, одобрения Node с проверкой по SSH — как ssh-verified. Клиенты с эфемерным каталогом состояния (временные домашние каталоги,
контейнеры, отдельные песочницы для каждого запуска) создают новую пару ключей устройства при каждом запуске, и каждый
запуск тихо сопрягается заново как совершенно новое устройство — без очистки список сопряжённых устройств
увеличивается на одну устаревшую строку при каждом запуске.
Когда Gateway тихо одобряет локальное сопряжение устройства, он выводит из эксплуатации
более старые одобренные записи silent, принадлежащие тому же кластеру клиентов
(совпадают clientId, clientMode и отображаемое имя) и не подключённые в данный момент.
Локальные клиенты работают непосредственно на хосте шлюза, поэтому ключ кластера
не может совпасть с другой машиной. Токены выведенных из эксплуатации строк немедленно отзываются;
все соответствующие устаревшие записи сопряжения Node очищаются, а событие удаления node.pair.resolved
рассылается всем клиентам.
Границы:
- Подходят только записи, последнее одобрение которых было локальным на том же хосте (
silent) —
как в качестве инициатора, так и в качестве цели. Сопряжения, подтверждённые через доверенный CIDR и SSH,
охватывают разные хосты, где отображаемые метаданные не идентифицируют машину, поэтому они
никогда не удаляются автоматически — для них используйте очистку в Control UI или
openclaw nodes remove.
- Сопряжения, одобренные владельцем, а также сопряжения по QR-коду/коду настройки (первичной загрузки) никогда не удаляются
автоматически. Записи, одобренные до появления данных о происхождении, остаются защищёнными
даже после последующего автоматического повторного одобрения того же идентификатора устройства.
- Подключённые в данный момент устройства пропускаются, поэтому параллельные локальные сеансы с
отдельными каталогами состояния сохраняют свои токены, пока активны. Записи, одобренные
в течение последней минуты, также пропускаются, чтобы одновременные процедуры установления сопряжения
не могли аннулировать друг друга до регистрации подключений.
- Затронутые клиенты по определению являются локальными, поэтому при
следующем подключении они автоматически устанавливают сопряжение заново.
Автоматическое одобрение при обновлении метаданных
Когда уже сопряжённое устройство переподключается, изменив только неконфиденциальные метаданные
(например, отображаемое имя или сведения о платформе клиента), OpenClaw рассматривает
это как metadata-upgrade. Область автоматического одобрения узка: оно применяется только
к доверенным локальным переподключениям не из браузера, которые уже подтвердили владение
локальными или общими учётными данными, включая переподключения нативного приложения на том же хосте после
изменения метаданных версии ОС. Клиенты браузера/Control UI и удалённые клиенты
по-прежнему используют явную процедуру повторного одобрения. Расширения области доступа (с чтения до
записи/администрирования) и изменения открытого ключа не допускают
автоматического одобрения при обновлении метаданных; они остаются явными запросами на повторное одобрение.
Вспомогательные средства сопряжения по QR-коду
/pair qr отображает данные сопряжения как структурированный медиаконтент, чтобы мобильные и
браузерные клиенты могли сканировать его напрямую.
При удалении устройства также удаляются все устаревшие ожидающие запросы на сопряжение для этого
идентификатора устройства, поэтому nodes pending не показывает потерянные строки после отзыва.
Локальность и перенаправленные заголовки
При сопряжении Gateway считает подключение петлевым, только если с этим согласуются как исходный сокет,
так и все данные вышестоящего прокси. Если запрос поступает через петлевой интерфейс, но
содержит данные заголовка Forwarded, любого X-Forwarded-* или X-Real-IP,
эти данные перенаправленных заголовков делают утверждение о петлевой локальности недействительным, и
процедура сопряжения требует явного одобрения, а не автоматически считает
запрос подключением с того же хоста. Эквивалентное правило для
аутентификации оператора см. в разделе Аутентификация доверенного прокси.
Хранилище (локальное, закрытое)
Состояние сопряжения хранится в записях сопряжённых устройств в общей базе данных состояния SQLite
в каталоге состояния Gateway (по умолчанию ~/.openclaw):
~/.openclaw/state/openclaw.sqlite (сопряжённые устройства с аутентификацией устройств,
одобренные поверхности Node, ожидающие запросы поверхностей, ожидающие запросы на сопряжение
устройств и токены первичной загрузки)
Если переопределить OPENCLAW_STATE_DIR, база данных переместится вместе с ним. При обновлении Gateway
с выпусков, использовавших хранилища JSON, они импортируются при запуске, а их архивы
devices/*.json.migrated и nodes/*.json.migrated сохраняются.
Примечания по безопасности:
- Токены устройств являются секретами; считайте базу данных состояния конфиденциальной.
- Для ротации токена устройства используются
openclaw devices rotate /
device.token.rotate.
Поведение транспорта
- Транспорт не сохраняет состояние; он не хранит данные о членстве.
- Если Gateway не подключён или сопряжение отключено, узлы не могут установить сопряжение.
- В удалённом режиме сопряжение выполняется с хранилищем удалённого Gateway.
Связанные разделы