Gateway
Parowanie Node
Parowanie Node ma dwie warstwy, obie przechowywane w rekordzie sparowanego urządzenia w bazie danych stanu SQLite Gateway:
- Parowanie urządzenia (rola
node) kontroluje uzgadnianieconnect. Zobacz Automatyczne zatwierdzanie urządzeń z zaufanych CIDR poniżej oraz Parowanie kanałów. - Zatwierdzanie możliwości Node (
node.pair.*) kontroluje, które zadeklarowane możliwości/polecenia może udostępniać połączony Node. Gateway jest źródłem prawdy; interfejsy użytkownika (aplikacja macOS, Control UI) służą do zatwierdzania lub odrzucania oczekujących żądań.
Dawny, niezależny magazyn parowania Node (nodes/paired.json z tokenem
dla każdego Node, wycofany ze ścieżki łączenia w styczniu 2026 roku) już nie istnieje: podczas uruchamiania Gateway
jednorazowo przenosi wszystkie pozostałe wpisy do rekordów urządzeń i archiwizuje
starsze pliki z przyrostkiem .migrated. Obsługa starszego mostu TCP została
usunięta.
Jak działa zatwierdzanie możliwości
- Node łączy się z WS Gateway (ten etap jest kontrolowany przez parowanie urządzenia).
- Gateway porównuje zadeklarowany zestaw możliwości/poleceń z
zatwierdzonym zestawem; nowe lub rozszerzone zestawy zapisują oczekujące żądanie w
rekordzie urządzenia i emitują
node.pair.requested. - Zatwierdzasz lub odrzucasz żądanie (za pomocą CLI albo interfejsu użytkownika).
- Do czasu zatwierdzenia polecenia Node pozostają filtrowane; zatwierdzenie udostępnia zadeklarowany zestaw z uwzględnieniem standardowej polityki poleceń.
Oczekujące żądania automatycznie wygasają 5 minut po ostatniej ponownej próbie Node — aktywnie ponownie łączący się Node utrzymuje swoje jedno oczekujące żądanie zamiast generować nowe żądanie (i monit o zatwierdzenie) przy każdej próbie.
Przepływ pracy CLI (odpowiedni dla środowisk bez interfejsu graficznego)
openclaw nodes pendingopenclaw nodes approve <requestId>openclaw nodes reject <requestId>openclaw nodes statusopenclaw nodes remove --node <id|name|ip>openclaw nodes rename --node <id|name|ip> --name "Living Room iPad"nodes status wyświetla sparowane/połączone Node oraz ich możliwości.
Powierzchnia API (protokół Gateway)
Zdarzenia:
node.pair.requested— emitowane po utworzeniu nowego oczekującego żądania.node.pair.resolved— emitowane po zatwierdzeniu, odrzuceniu lub wygaśnięciu żądania.
Metody:
node.pair.list— wyświetla oczekujące i sparowane Node (operator.pairing).node.pair.approve— zatwierdza oczekujące żądanie.node.pair.reject— odrzuca oczekujące żądanie.node.pair.remove— usuwa sparowany Node. Powoduje to odebranie rolinodeurządzenia w magazynie sparowanych urządzeń, usunięcie wraz z nią zatwierdzonego zestawu Node oraz unieważnienie/rozłączenie sesji tego urządzenia z rolą Node. Urządzenie z wieloma rolami (na przykład mające również rolęoperator) zachowuje swój rekord i traci jedynie rolęnode; rekord urządzenia mającego wyłącznie rolę Node zostaje usunięty. Autoryzacja:operator.pairingmoże usuwać rekordy Node bez roli operatora; wywołujący używający tokenu urządzenia, który odbiera własną rolę Node na urządzeniu z wieloma rolami, dodatkowo potrzebujeoperator.admin.node.rename— zmienia nazwę wyświetlaną sparowanego Node widoczną dla operatora.
Usunięto w wersji 2026.7: node.pair.request oraz node.pair.verify. Oczekujące
żądania są tworzone przez sam Gateway podczas łączenia Node, a
niezależny token dla każdego Node, który obsługiwały te metody, już nie istnieje; uwierzytelnianie Node korzysta z
tokenu parowania urządzenia.
Uwagi:
- Ponowne połączenia z niezmienionym zestawem ponownie wykorzystują oczekujące żądanie; kolejne żądania odświeżają przechowywane metadane Node i najnowszy dozwolony obraz zadeklarowanych poleceń, aby był widoczny dla operatora.
- Poziomy zakresu operatora i kontrole wykonywane podczas zatwierdzania podsumowano w Zakresach operatora.
node.pair.approveużywa zadeklarowanych poleceń oczekującego żądania, aby wymusić dodatkowe zakresy zatwierdzania:- żądanie bez poleceń:
operator.pairing - żądanie polecenia innego niż wykonawcze:
operator.pairing+operator.write - żądanie
system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- żądanie bez poleceń:
Kontrolowanie poleceń Node (2026.3.31+)
Gdy Node łączy się po raz pierwszy, żądanie parowania jest tworzone automatycznie. Do czasu zatwierdzenia tego żądania wszystkie oczekujące polecenia Node pochodzące z tego Node są filtrowane i nie zostaną wykonane. Po zatwierdzeniu parowania zadeklarowane przez Node polecenia stają się dostępne z uwzględnieniem standardowej polityki poleceń.
Oznacza to, że:
- Node, które wcześniej polegały wyłącznie na parowaniu urządzenia w celu udostępniania poleceń, muszą teraz również ukończyć parowanie Node.
- Polecenia umieszczone w kolejce przed zatwierdzeniem parowania są odrzucane, a nie odraczane.
Granice zaufania zdarzeń Node (2026.3.31+)
Podsumowania pochodzące z Node i powiązane zdarzenia sesji są ograniczone do zamierzonego zaufanego obszaru. Przepływy sterowane powiadomieniami lub wyzwalane przez Node, które wcześniej polegały na szerszym dostępie do narzędzi hosta albo sesji, mogą wymagać dostosowania. To wzmocnienie zabezpieczeń zapobiega eskalowaniu zdarzeń Node do dostępu do narzędzi na poziomie hosta wykraczającego poza granicę zaufania dozwoloną dla danego Node.
Trwałe aktualizacje obecności Node podlegają tej samej granicy tożsamości: zdarzenie
node.presence.alive jest akceptowane wyłącznie z uwierzytelnionych sesji urządzeń Node
i aktualizuje metadane parowania tylko wtedy, gdy tożsamość urządzenia/Node
jest już sparowana. Samodzielnie zadeklarowana wartość client.id nie wystarcza do zapisania
stanu ostatniej aktywności.
Automatyczne zatwierdzanie urządzeń zweryfikowanych przez SSH (domyślnie)
Pierwsze parowanie urządzenia z role: node z adresu prywatnego/CGNAT jest
automatycznie zatwierdzane, gdy Gateway może potwierdzić własność maszyny przez SSH:
łączy się zwrotnie z hostem parującym (BatchMode, StrictHostKeyChecking=yes),
uruchamia tam openclaw node identity --json i zatwierdza tylko wtedy, gdy identyfikator zdalnego
urządzenia oraz klucz publiczny dokładnie odpowiadają oczekującemu żądaniu. Dopasowanie klucza
zapewnia bezpieczeństwo: sama osiągalność nigdy nie powoduje zatwierdzenia, więc współużytkownicy NAT,
inni użytkownicy współdzielonego hosta i fałszowanie w sieci LAN przechodzą do standardowego
monitu.
Funkcja jest domyślnie włączona. Wymagania konieczne do jej uruchomienia:
- Użytkownik procesu Gateway (lub
sshVerify.user) może łączyć się przez SSH z hostem Node nieinteraktywnie (klucze/agent; działa również Tailscale SSH), a klucz hosta jest już zaufany. - Polecenie
openclawjest dostępne w zdalnej zmiennejPATHdla nieinteraktywnegosh -lc. - Łączący się adres IP jest bezpośrednim (bez serwera proxy i bez local loopback) adresem prywatnym, ULA,
lokalnym dla łącza lub CGNAT albo pasuje do
sshVerify.cidrs, jeśli je ustawiono. - Obowiązuje ten sam minimalny poziom kwalifikacji co w przypadku zatwierdzania z zaufanych CIDR: tylko nowe parowanie Node bez zakresów; rozszerzenia uprawnień, przeglądarki, Control UI i WebChat zawsze wymagają monitu.
Podczas działania sondy klient Node otrzymuje polecenie dalszego ponawiania prób
(wait_then_retry) zamiast wstrzymywania się w oczekiwaniu na ręczne zatwierdzenie; jeśli sonda
zawiedzie, następna próba przechodzi do standardowego przepływu z monitem. Dla celów, których weryfikacja się nie powiodła,
obowiązuje krótki okres oczekiwania (5 minut po niezgodności klucza).
Zatwierdzone urządzenia zapisują approvedVia: "ssh-verified", a ich pierwszy zadeklarowany
zestaw możliwości jest zatwierdzany w tym samym kroku — dopasowanie klucza już dowodzi,
że Node działa na koncie operatora na należącej do niego maszynie, co stanowi
to samo zapewnienie co ręczne zatwierdzenie możliwości. Późniejsze rozszerzenia zestawu nadal
wymagają monitu.
Wzmocnienie zabezpieczeń lub wyłączenie:
{ gateway: { nodes: { pairing: { // Disable entirely: sshVerify: false, // ...or scope/tune the probe: // sshVerify: { user: "me", identity: "~/.ssh/probe", timeoutMs: 7000, cidrs: ["10.0.0.0/8"] }, }, }, },}Automatyczne zatwierdzanie (aplikacja macOS)
Aplikacja macOS może podjąć próbę cichego zatwierdzenia żądań możliwości Node, gdy:
- żądanie jest oznaczone jako
silent(Gateway oznacza pierwszy zestaw możliwości jako cichy, gdy parowanie urządzenia zatwierdzono nieinteraktywnie), oraz - aplikacja może zweryfikować połączenie SSH z hostem Gateway przy użyciu tego samego użytkownika.
Jeśli ciche zatwierdzanie się nie powiedzie, aplikacja przechodzi do standardowego monitu Approve/Reject.
Automatyczne zatwierdzanie urządzeń z zaufanych CIDR
Parowanie urządzenia WS dla role: node domyślnie pozostaje ręczne. W prywatnych sieciach
Node, w których Gateway już ufa ścieżce sieciowej, operatorzy mogą włączyć tę funkcję
za pomocą jawnie określonych CIDR lub dokładnych adresów IP:
{ gateway: { nodes: { pairing: { autoApproveCidrs: ["192.168.1.0/24"], }, }, },}Granica bezpieczeństwa:
- Funkcja jest wyłączona, gdy
gateway.nodes.pairing.autoApproveCidrsnie jest ustawione. - Nie istnieje ogólny tryb automatycznego zatwierdzania sieci LAN ani sieci prywatnej; automatyczne zatwierdzanie zweryfikowane przez SSH (powyżej) wymaga kryptograficznego dopasowania klucza urządzenia, nigdy wyłącznie lokalizacji sieciowej.
- Kwalifikuje się wyłącznie nowe żądanie parowania urządzenia z
role: nodebez żądanych zakresów. - Klienci operatora, przeglądarki, Control UI i WebChat pozostają obsługiwani ręcznie.
- Rozszerzenia ról, zakresów, metadanych i kluczy publicznych pozostają obsługiwane ręcznie.
- Ścieżki nagłówków zaufanego serwera proxy dla local loopback na tym samym hoście nie kwalifikują się, ponieważ taka ścieżka może zostać sfałszowana przez lokalnych wywołujących.
Czyszczenie zastąpionych cichych parowań
Nieinteraktywne zatwierdzenia zapisują swoje pochodzenie w rekordzie sparowanego urządzenia:
zatwierdzenia przez lokalną politykę tego samego hosta jako silent, zatwierdzenia Node z zaufanych CIDR jako
trusted-cidr, a zatwierdzenia Node zweryfikowane przez SSH jako ssh-verified. Klienci, których katalog stanu jest efemeryczny (tymczasowe katalogi domowe,
kontenery, piaskownice dla poszczególnych uruchomień), generują nową parę kluczy urządzenia przy każdym uruchomieniu, a każde
uruchomienie ponownie paruje się po cichu jako zupełnie nowe urządzenie — bez czyszczenia lista sparowanych urządzeń
powiększałaby się o jeden nieaktualny rekord przy każdym uruchomieniu.
Gdy Gateway po cichu zatwierdza lokalne parowanie urządzenia, wycofuje
starsze rekordy zatwierdzone jako silent, które należą do tego samego klastra klienta
(zgodne clientId, clientMode i nazwa wyświetlana) i nie są obecnie
połączone. Lokalni klienci działają na samym hoście Gateway, dlatego klucz klastra
nie może pasować do innej maszyny. Wycofane rekordy natychmiast tracą swoje tokeny;
każdy pasujący starszy wpis parowania Node zostaje usunięty i rozgłaszane jest zdarzenie usunięcia
node.pair.resolved.
Granice:
- Kwalifikują się wyłącznie rekordy, których ostatnie zatwierdzenie było lokalne dla tego samego hosta (
silent), zarówno jako wyzwalacze, jak i cele. Parowania z zaufanych CIDR i zweryfikowane przez SSH obejmują różne hosty, na których metadane wyświetlania nie są tożsamością maszyny, dlatego nigdy nie są usuwane automatycznie — użyj czyszczenia w Control UI lubopenclaw nodes remove. - Parowania zatwierdzone przez właściciela oraz za pomocą kodu QR/kodu konfiguracji (rozruchowe) nigdy nie są usuwane automatycznie. Rekordy zatwierdzone przed wprowadzeniem informacji o pochodzeniu pozostają chronione, nawet po późniejszym cichym ponownym zatwierdzeniu tego samego identyfikatora urządzenia.
- Obecnie połączone urządzenia są pomijane, dzięki czemu współbieżne lokalne sesje z oddzielnymi katalogami stanu zachowują swoje tokeny, dopóki są aktywne. Rekordy zatwierdzone w ciągu ostatniej minuty również są pomijane, aby równoczesne uzgadnianie parowania nie mogło wzajemnie wycofać rekordów przed zarejestrowaniem połączeń.
- Klienci, których to dotyczy, są z założenia lokalni, dlatego przy następnym połączeniu ponownie parują się po cichu.
Automatyczne zatwierdzanie aktualizacji metadanych
Gdy już sparowane urządzenie ponownie łączy się wyłącznie z niepoufnymi zmianami metadanych
(na przykład nazwy wyświetlanej lub wskazówek dotyczących platformy klienta), OpenClaw traktuje
to jako metadata-upgrade. Ciche automatyczne zatwierdzanie ma wąski zakres: dotyczy wyłącznie
zaufanych, lokalnych połączeń innych niż przeglądarkowe, które już potwierdziły posiadanie
lokalnych lub współdzielonych danych uwierzytelniających, w tym ponownych połączeń natywnej aplikacji na tym samym hoście po
zmianach metadanych wersji systemu operacyjnego. Klienci przeglądarkowi/Control UI oraz klienci zdalni
nadal korzystają z jawnego przepływu ponownego zatwierdzania. Rozszerzenia zakresu (z odczytu do
zapisu/administracji) oraz zmiany klucza publicznego nie kwalifikują się do
automatycznego zatwierdzania metadata-upgrade; pozostają jawnymi żądaniami ponownego zatwierdzenia.
Narzędzia pomocnicze parowania QR
/pair qr renderuje dane parowania jako ustrukturyzowane multimedia, dzięki czemu klienty mobilne i przeglądarkowe mogą je bezpośrednio zeskanować.
Usunięcie urządzenia powoduje również wyczyszczenie wszystkich nieaktualnych oczekujących żądań parowania dla identyfikatora tego urządzenia, dzięki czemu po cofnięciu uprawnień polecenie nodes pending nie wyświetla osieroconych wierszy.
Lokalność i przekazywane nagłówki
Podczas parowania Gateway uznaje połączenie za local loopback tylko wtedy, gdy potwierdzają to zarówno surowe gniazdo, jak i wszelkie dane pochodzące z pośredniczącego serwera proxy. Jeśli żądanie dociera przez local loopback, ale zawiera dane z nagłówka Forwarded, dowolnego nagłówka X-Forwarded-* lub nagłówka X-Real-IP, dane te wykluczają uznanie połączenia za lokalne, a ścieżka parowania wymaga jawnego zatwierdzenia zamiast automatycznie traktować żądanie jako połączenie z tego samego hosta. Odpowiednik tej reguły dotyczący uwierzytelniania operatora opisano w sekcji Uwierzytelnianie zaufanego serwera proxy.
Przechowywanie (lokalne, prywatne)
Stan parowania jest przechowywany w rekordach sparowanych urządzeń we współdzielonej bazie danych stanu SQLite w katalogu stanu Gateway (domyślnie ~/.openclaw):
~/.openclaw/state/openclaw.sqlite(sparowane urządzenia z uwierzytelnianiem urządzeń, zatwierdzone interfejsy węzłów, oczekujące żądania dostępu do interfejsów, oczekujące żądania parowania urządzeń oraz tokeny inicjalizacyjne)
Jeśli zmienisz wartość OPENCLAW_STATE_DIR, baza danych zostanie przeniesiona wraz z tym katalogiem. Gateway zaktualizowane z wersji korzystających z magazynów JSON importują je podczas uruchamiania i pozostawiają archiwa devices/*.json.migrated oraz nodes/*.json.migrated.
Uwagi dotyczące bezpieczeństwa:
- Tokeny urządzeń są danymi poufnymi; bazę danych stanu należy traktować jako wrażliwą.
- Do rotacji tokenu urządzenia służy
openclaw devices rotate/device.token.rotate.
Działanie transportu
- Transport jest bezstanowy; nie przechowuje informacji o członkostwie.
- Jeśli Gateway jest niedostępny lub parowanie jest wyłączone, węzły nie mogą się parować.
- W trybie zdalnym parowanie odbywa się z użyciem magazynu zdalnego Gateway.