Gateway
Pemasangan Node
Pemasangan Node memiliki dua lapisan, yang keduanya disimpan pada rekaman perangkat yang dipasangkan dalam basis data status SQLite milik Gateway:
- Pemasangan perangkat (peran
node) membatasi handshakeconnect. Lihat Persetujuan otomatis perangkat berdasarkan CIDR tepercaya di bawah dan Pemasangan saluran. - Persetujuan kapabilitas Node (
node.pair.*) membatasi kapabilitas/perintah yang dideklarasikan dan boleh diekspos oleh Node yang terhubung. Gateway adalah sumber kebenaran; UI (aplikasi macOS, Control UI) merupakan antarmuka yang menyetujui atau menolak permintaan tertunda.
Penyimpanan pemasangan Node mandiri sebelumnya (nodes/paired.json dengan token
per Node, dihentikan dari jalur koneksi pada Januari 2026) telah dihapus:
Gateway menggabungkan semua baris yang tersisa ke dalam rekaman perangkat satu
kali saat dimulai dan mengarsipkan berkas lama dengan akhiran .migrated.
Dukungan bridge TCP lama telah dihapus.
Cara kerja persetujuan kapabilitas
- Node terhubung ke WS Gateway (pemasangan perangkat membatasi langkah ini).
- Gateway membandingkan cakupan kapabilitas/perintah yang dideklarasikan dengan
cakupan yang disetujui; cakupan baru atau yang diperluas menyimpan
permintaan tertunda pada rekaman perangkat dan memancarkan
node.pair.requested. - Anda menyetujui atau menolak permintaan tersebut (CLI atau UI).
- Hingga disetujui, perintah Node tetap difilter; persetujuan mengekspos cakupan yang dideklarasikan, dengan tetap tunduk pada kebijakan perintah normal.
Permintaan tertunda kedaluwarsa secara otomatis 5 menit setelah percobaan ulang terakhir Node — Node yang aktif menyambung kembali mempertahankan satu permintaan tertundanya tetap aktif, alih-alih membuat permintaan baru (dan perintah persetujuan) pada setiap percobaan.
Alur kerja CLI (cocok tanpa antarmuka grafis)
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 menampilkan Node yang dipasangkan/terhubung beserta
kapabilitasnya.
Permukaan API (protokol Gateway)
Peristiwa:
node.pair.requested- dipancarkan saat permintaan tertunda baru dibuat.node.pair.resolved- dipancarkan saat permintaan disetujui, ditolak, atau kedaluwarsa.
Metode:
node.pair.list- mencantumkan Node yang tertunda dan dipasangkan (operator.pairing).node.pair.approve- menyetujui permintaan tertunda.node.pair.reject- menolak permintaan tertunda.node.pair.remove- menghapus Node yang dipasangkan. Tindakan ini mencabut perannodeperangkat dalam penyimpanan perangkat terpasang, menghapus permukaan Node yang disetujui bersamanya, serta membatalkan/memutus sesi perangkat dengan peran Node tersebut. Perangkat dengan peran campuran (misalnya yang juga memilikioperator) mempertahankan barisnya dan hanya kehilangan perannode; baris perangkat yang hanya memiliki peran Node dihapus. Otorisasi:operator.pairingdapat menghapus baris Node non-operator; pemanggil dengan token perangkat yang mencabut peran Node miliknya sendiri pada perangkat dengan peran campuran juga memerlukanoperator.admin.node.rename- mengganti nama tampilan Node terpasang yang terlihat oleh operator.
Dihapus pada 2026.7: node.pair.request dan node.pair.verify. Permintaan
tertunda dibuat oleh Gateway itu sendiri saat Node terhubung, dan token mandiri
per Node yang dilayani keduanya sudah tidak ada; autentikasi Node menggunakan
token pemasangan perangkat.
Catatan:
- Penyambungan ulang dengan cakupan yang tidak berubah menggunakan kembali permintaan tertunda; permintaan berulang memperbarui metadata Node yang tersimpan dan snapshot terbaru perintah yang dideklarasikan serta masuk daftar izin agar dapat dilihat operator.
- Tingkat cakupan operator dan pemeriksaan saat persetujuan dirangkum dalam Cakupan operator.
node.pair.approvemenggunakan perintah yang dideklarasikan dalam permintaan tertunda untuk memberlakukan cakupan persetujuan tambahan:- permintaan tanpa perintah:
operator.pairing - permintaan perintah non-eksekusi:
operator.pairing+operator.write - permintaan
system.run/system.run.prepare/system.which:operator.pairing+operator.admin
- permintaan tanpa perintah:
Pembatasan perintah Node (2026.3.31+)
Saat Node terhubung untuk pertama kali, pemasangan diminta secara otomatis. Hingga permintaan tersebut disetujui, semua perintah Node tertunda dari Node tersebut difilter dan tidak akan dieksekusi. Setelah pemasangan disetujui, perintah yang dideklarasikan Node menjadi tersedia, dengan tetap tunduk pada kebijakan perintah normal.
Artinya:
- Node yang sebelumnya hanya mengandalkan pemasangan perangkat untuk mengekspos perintah kini juga harus menyelesaikan pemasangan Node.
- Perintah yang diantrekan sebelum persetujuan pemasangan akan dibuang, bukan ditunda.
Batas kepercayaan peristiwa Node (2026.3.31+)
Ringkasan yang berasal dari Node dan peristiwa sesi terkait dibatasi pada permukaan tepercaya yang dimaksudkan. Alur yang digerakkan oleh notifikasi atau dipicu Node, yang sebelumnya mengandalkan akses alat host atau sesi yang lebih luas, mungkin perlu disesuaikan. Penguatan ini mencegah peristiwa Node meningkatkan akses menjadi akses alat tingkat host melebihi batas kepercayaan yang diizinkan bagi Node tersebut.
Pembaruan keberadaan Node yang persisten mengikuti batas identitas yang sama:
peristiwa node.presence.alive hanya diterima dari sesi perangkat Node yang
terautentikasi, dan hanya memperbarui metadata pemasangan jika identitas
perangkat/Node sudah dipasangkan. Nilai client.id yang dideklarasikan sendiri
tidak cukup untuk menulis status terakhir terlihat.
Persetujuan otomatis perangkat yang diverifikasi melalui SSH (bawaan)
Pemasangan perangkat role: node pertama kali dari alamat privat/CGNAT
disetujui secara otomatis ketika Gateway dapat membuktikan kepemilikan mesin
melalui SSH: Gateway terhubung kembali ke host pemasangan (BatchMode,
StrictHostKeyChecking=yes), menjalankan openclaw node identity --json di
sana, dan hanya menyetujui jika ID perangkat jarak jauh dan kunci publik sama
persis dengan permintaan tertunda. Kecocokan kunci inilah yang membuatnya aman:
keterjangkauan saja tidak pernah menghasilkan persetujuan, sehingga sesama
penyewa NAT, pengguna lain pada host bersama, dan pemalsuan LAN semuanya akan
dialihkan ke perintah konfirmasi normal.
Diaktifkan secara bawaan. Persyaratan agar mekanisme ini berjalan:
- Pengguna proses Gateway (atau
sshVerify.user) dapat melakukan SSH ke host Node secara noninteraktif (kunci/agen; SSH Tailscale juga dapat digunakan), dan kunci host sudah dipercaya. openclawdapat ditemukan padaPATHjarak jauh untuksh -lcnoninteraktif.- IP yang terhubung adalah alamat privat, ULA, link-local, atau CGNAT langsung
(tanpa proksi dan bukan local loopback), atau cocok dengan
sshVerify.cidrsjika ditetapkan. - Ambang kelayakannya sama dengan persetujuan CIDR tepercaya: hanya pemasangan Node baru tanpa cakupan; peningkatan, browser, Control UI, dan WebChat selalu menampilkan perintah konfirmasi.
Saat pemeriksaan berjalan, klien Node diminta untuk terus mencoba kembali
(wait_then_retry) alih-alih berhenti guna menunggu persetujuan manual; jika
pemeriksaan gagal, percobaan berikutnya kembali ke alur perintah konfirmasi
normal. Target yang gagal mendapat masa tunggu singkat (5 menit setelah
ketidakcocokan kunci).
Perangkat yang disetujui merekam approvedVia: "ssh-verified" dan permukaan
kapabilitas pertama yang dideklarasikannya disetujui dalam langkah yang sama —
kecocokan kunci telah membuktikan bahwa Node berjalan di bawah akun operator
pada mesin milik operator, yang merupakan klaim yang sama dengan persetujuan
kapabilitas manual. Peningkatan permukaan berikutnya tetap menampilkan perintah
konfirmasi.
Perkuat atau nonaktifkan:
{ 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"] }, }, }, },}Persetujuan otomatis (aplikasi macOS)
Aplikasi macOS dapat mencoba persetujuan senyap atas permintaan kapabilitas Node ketika:
- permintaan ditandai
silent(Gateway menandai permukaan kapabilitas pertama sebagai senyap ketika pemasangan perangkat disetujui secara noninteraktif), dan - aplikasi dapat memverifikasi koneksi SSH ke host Gateway menggunakan pengguna yang sama.
Jika persetujuan senyap gagal, aplikasi kembali ke perintah konfirmasi normal Approve/Reject.
Persetujuan otomatis perangkat berdasarkan CIDR tepercaya
Pemasangan perangkat WS untuk role: node tetap manual secara bawaan. Untuk
jaringan Node privat tempat Gateway telah memercayai jalur jaringan, operator
dapat mengaktifkannya dengan CIDR eksplisit atau IP yang tepat:
{ gateway: { nodes: { pairing: { autoApproveCidrs: ["192.168.1.0/24"], }, }, },}Batas keamanan:
- Dinonaktifkan ketika
gateway.nodes.pairing.autoApproveCidrstidak ditetapkan. - Tidak ada mode persetujuan otomatis menyeluruh untuk LAN atau jaringan privat; persetujuan otomatis yang diverifikasi melalui SSH (di atas) memerlukan kecocokan kriptografis kunci perangkat, bukan hanya kedekatan jaringan.
- Hanya permintaan pemasangan perangkat
role: nodebaru tanpa cakupan yang diminta yang memenuhi syarat. - Klien operator, browser, Control UI, dan WebChat tetap manual.
- Peningkatan peran, cakupan, metadata, dan kunci publik tetap manual.
- Jalur header proksi tepercaya local loopback pada host yang sama tidak memenuhi syarat karena jalur tersebut dapat dipalsukan oleh pemanggil lokal.
Pembersihan penggantian pemasangan senyap
Persetujuan noninteraktif merekam asalnya pada baris perangkat terpasang:
persetujuan kebijakan lokal pada host yang sama sebagai silent, persetujuan
Node berdasarkan CIDR tepercaya sebagai trusted-cidr, dan persetujuan Node
yang diverifikasi melalui SSH sebagai ssh-verified. Klien yang direktori
statusnya bersifat sementara (direktori utama sementara, kontainer, sandbox per
proses) membuat pasangan kunci perangkat baru pada setiap proses, dan setiap
proses dipasangkan kembali secara senyap sebagai perangkat yang benar-benar
baru — tanpa pembersihan, daftar perangkat terpasang bertambah satu baris usang
per proses.
Ketika Gateway secara senyap menyetujui pemasangan perangkat lokal, Gateway
menghentikan rekaman lama yang disetujui sebagai silent, yang termasuk dalam
klaster klien yang sama (cocok berdasarkan clientId, clientMode, dan nama
tampilan) serta sedang tidak terhubung. Klien lokal berjalan pada host Gateway
itu sendiri, sehingga kunci klaster tidak mungkin cocok dengan mesin lain.
Baris yang dihentikan langsung kehilangan tokennya; setiap entri pemasangan
Node lama yang cocok dihapus dan peristiwa penghapusan node.pair.resolved
disiarkan.
Batasan:
- Hanya rekaman yang persetujuan terakhirnya berasal dari lokal pada host yang
sama (
silent) yang memenuhi syarat, baik sebagai pemicu maupun target. Pemasangan berdasarkan CIDR tepercaya dan yang diverifikasi melalui SSH melintasi host, tempat metadata tampilan bukan merupakan identitas mesin, sehingga tidak pernah dihapus secara otomatis — gunakan pembersihan Control UI atauopenclaw nodes removeuntuk pemasangan tersebut. - Pemasangan yang disetujui pemilik dan melalui kode QR/penyiapan (bootstrap) tidak pernah dihapus secara otomatis. Rekaman yang disetujui sebelum pencatatan asal tersedia tetap dilindungi, bahkan setelah persetujuan senyap berikutnya untuk ID perangkat yang sama.
- Perangkat yang sedang terhubung dilewati, sehingga sesi lokal bersamaan dengan direktori status terpisah mempertahankan tokennya selama aktif. Rekaman yang disetujui dalam satu menit terakhir juga dilewati agar handshake pemasangan yang berlangsung bersamaan tidak dapat saling menghentikan sebelum koneksinya terdaftar.
- Klien yang terpengaruh bersifat lokal berdasarkan konstruksinya, sehingga akan dipasangkan kembali secara senyap pada koneksi berikutnya.
Persetujuan otomatis peningkatan metadata
Saat perangkat yang sudah dipasangkan terhubung kembali hanya dengan perubahan
metadata yang tidak sensitif (misalnya nama tampilan atau petunjuk platform
klien), OpenClaw memperlakukannya sebagai metadata-upgrade. Persetujuan
otomatis senyap bersifat terbatas: hanya berlaku untuk penyambungan ulang lokal
tepercaya non-browser yang telah membuktikan kepemilikan kredensial lokal atau
bersama, termasuk penyambungan ulang aplikasi native pada host yang sama
setelah perubahan metadata versi OS. Klien browser/Control UI dan klien jarak
jauh tetap menggunakan alur persetujuan ulang eksplisit. Peningkatan cakupan
(baca menjadi tulis/admin) dan perubahan kunci publik tidak memenuhi syarat
untuk persetujuan otomatis metadata-upgrade; keduanya tetap menjadi
permintaan persetujuan ulang eksplisit.
Pembantu pemasangan QR
/pair qr merender payload pemasangan sebagai media terstruktur agar klien
seluler dan peramban dapat memindainya secara langsung.
Menghapus perangkat juga membersihkan setiap permintaan pemasangan tertunda
yang sudah usang untuk id perangkat tersebut, sehingga nodes pending tidak
menampilkan baris yatim setelah pencabutan.
Lokalitas dan header yang diteruskan
Pemasangan Gateway menganggap koneksi sebagai local loopback hanya jika soket
mentah dan setiap bukti proksi hulu sama-sama menyetujuinya. Jika permintaan
tiba melalui local loopback tetapi membawa bukti header Forwarded,
X-Forwarded-*, atau X-Real-IP, bukti header yang diteruskan tersebut
membatalkan klaim lokalitas local loopback, dan jalur pemasangan memerlukan
persetujuan eksplisit alih-alih secara diam-diam menganggap permintaan sebagai
koneksi dari host yang sama. Lihat
Autentikasi Proksi Tepercaya untuk aturan yang
setara pada autentikasi operator.
Penyimpanan (lokal, privat)
Status pemasangan berada dalam catatan perangkat yang dipasangkan di basis data
status SQLite bersama pada direktori status Gateway (bawaan ~/.openclaw):
~/.openclaw/state/openclaw.sqlite(perangkat yang dipasangkan dengan autentikasi perangkat, permukaan Node yang disetujui, permintaan permukaan tertunda, permintaan pemasangan perangkat tertunda, dan token bootstrap)
Jika Anda mengganti OPENCLAW_STATE_DIR, basis data akan ikut berpindah.
Gateway yang ditingkatkan dari rilis dengan penyimpanan JSON akan mengimpornya
saat mulai dan meninggalkan arsip devices/*.json.migrated serta
nodes/*.json.migrated.
Catatan keamanan:
- Token perangkat adalah rahasia; perlakukan basis data status sebagai data sensitif.
- Rotasi token perangkat menggunakan
openclaw devices rotate/device.token.rotate.
Perilaku transportasi
- Transportasi bersifat tanpa status; transportasi tidak menyimpan keanggotaan.
- Jika Gateway luring atau pemasangan dinonaktifkan, Node tidak dapat dipasangkan.
- Dalam mode jarak jauh, pemasangan dilakukan terhadap penyimpanan Gateway jarak jauh.