1 poin oleh GN⁺ 9 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • Ini adalah klien RDP berbasis web yang dapat terhubung ke Windows Remote Desktop hanya dengan browser, dan bekerja tanpa plugin
  • Dengan memisahkan Go WebAssembly di browser dan proxy WebSocket-ke-TCP di sisi server, koneksi TCP RDP yang tidak bisa dibuka langsung oleh browser ditangani sebagai pengganti
  • Koneksi mengikuti alur Browser -> WebSocket -> proxy -> TCP -> RDP Server; setelah tersambung, layar jarak jauh ditampilkan di canvas dan input keyboard serta mouse diteruskan
  • Perangkat input mendukung keyboard berbasis RDP scan codes dan mouse dengan gerakan, klik, serta roda gulir; audio jarak jauh diterima melalui RDPSND dan diputar dengan Web Audio API
  • Karena struktur proxy mengizinkan semua origin, ini sebaiknya hanya dijalankan di jaringan tepercaya, atau dilengkapi HTTPS/WSS dan lapisan autentikasi sebelum diekspos ke luar

Gambaran proyek

  • Berfungsi sebagai klien RDP berbasis web untuk mengakses Windows Remote Desktop dari browser tanpa plugin
  • Implementasinya menggunakan kombinasi Go WebAssembly dan grdp, dengan arsitektur yang memisahkan bagian eksekusi di browser dan bagian perantara proxy
  • Karena browser tidak dapat membuka soket TCP mentah secara langsung, dibutuhkan proxy Go ringan yang meneruskan koneksi WebSocket ke port TCP server RDP

Arsitektur dan cara kerja

  • Jalur keseluruhan mengikuti urutan Browser (WASM) -> WebSocket -> proxy (Go) -> TCP -> RDP Server
  • Di browser, biner WASM dijalankan, sementara proxy menangani sekaligus peran sebagai jembatan WebSocket-ke-TCP dan server file statis
  • Hasil make all dibagi menjadi static/main.wasm yang berjalan di browser, file dukungan runtime Go static/wasm_exec.js, dan server proxy proxy/proxy
  • Berkat struktur ini, sisi browser menangani koneksi dengan teknologi web standar, sedangkan komunikasi TCP aktual dengan server RDP ditangani oleh proxy

Alur penggunaan dan antarmuka pengguna

  • Buka http://localhost:8080 di browser, masukkan nilai Host, Port, Domain, User, Password, Width, Height pada formulir koneksi, lalu tekan Connect untuk memulai sesi
  • Nilai default Port adalah 3389, dan Domain dapat dikosongkan saat menggunakan akun lokal
  • Setelah koneksi berhasil, desktop jarak jauh akan ditampilkan di canvas, dan untuk menerima input keyboard Anda perlu mengklik canvas
  • Menekan Disconnect akan mengakhiri sesi

Perangkat input dan dukungan audio

  • Semua input keyboard standar diteruskan ke desktop jarak jauh melalui RDP scan codes
  • Mouse mendukung pergerakan, klik tombol, hingga roda gulir
  • Tab browser harus memiliki fokus agar event keyboard dapat diteruskan; jika input tombol berhenti, Anda perlu mengklik kembali area canvas
  • Audio jarak jauh di-streaming melalui RDPSND, dan diputar di browser menggunakan Web Audio API
    • Format audio dinyatakan sebagai PCM 44100 Hz, stereo, 16-bit signed little-endian

Kondisi operasional dan perhatian keamanan

  • Persyaratannya adalah Go 1.24 atau lebih baru dan satu server RDP yang dapat diakses; server tujuan dapat berupa Windows atau host yang kompatibel dengan RDP
  • Proxy mengizinkan koneksi dari semua origin, sehingga sebaiknya hanya dijalankan di jaringan tepercaya, atau tambahkan lapisan autentikasi sebelum diekspos ke internet
  • Kredensial dikirim dari browser ke proxy melalui WebSocket, jadi pada jaringan yang tidak tepercaya diperlukan penggunaan HTTPS/WSS
    • README juga menyebutkan pendekatan menggunakan reverse proxy terminasi TLS seperti nginx atau Caddy

Bentuk eksekusi dan informasi tambahan

  • Program dapat dijalankan dengan make serve atau ./proxy/proxy -listen :8080 -static static
  • Opsi proxy menggunakan -listen untuk menentukan alamat dan port yang didengarkan, serta -static untuk menentukan direktori file statis
  • Target untuk pengembangan dibagi menjadi make wasm untuk membangun ulang WASM saja, make proxy untuk membangun ulang proxy saja, make wasm_exec untuk memperbarui wasm_exec.js, dan make clean untuk menghapus hasil build
  • Lisensinya adalah GPLv3, dan juga disertai rujukan ke grdp LICENSE

1 komentar

 
GN⁺ 9 jam lalu
Komentar Hacker News
  • Terlihat cukup keren. Kalau sampai mendukung perekaman sesi dan autentikasi SSO, ini bisa langsung dipakai sebagai jump host RDP
    Saya pernah memakai Azure Bastion dengan cara serupa: login ke portal Azure memakai metode autentikasi yang dikonfigurasi di tenant, lalu melakukan koneksi RDP ke VM dari browser, dan login di sisi VM memakai akun lokal. Penanganan file dan clipboard juga cukup bagus, dan sesi konsol di dalam browser juga didukung
    Saya belum pernah mencoba sisi Windows/RDP jadi tidak tahu apakah itu juga didukung, tetapi browser SSH milik GCP termasuk yang paling rapi yang pernah saya lihat
    Di Linux pun kadang terasa xrdp lebih baik daripada alternatif lain
    Salah satu nilai besar yang diselesaikan ini adalah pemisahan antarmuka administrasi untuk VM/server. Hanya dengan memastikan layanan administrasi server web tidak berada pada IP/domain/antarmuka yang sama dengan layanan HTTP, keamanan sudah meningkat jauh

    • Untuk kebutuhan ini kami memakai Apache Guacamole dengan proxy OIDC kami
  • Di RDP dalam browser, clipboard itu mimpi buruk tersendiri. Negosiasi protokol wire-nya sendiri berjalan baik, tetapi Clipboard API di sisi browser terikat pada izin dan persyaratan user gesture
    Untuk membaca, kebanyakan browser hampir selalu meminta konfirmasi pengguna. Jadi pilihannya biasanya membuat buffer clipboard terpisah di dalam halaman, atau paste ke dalam RDP berjalan mulus tetapi saat menyalin keluar dari RDP pengguna harus klik setiap kali
    Keduanya jauh dari perilaku yang diharapkan orang dari klien RDP web. Sebelum menganggapnya setara dengan mstsc native, pastikan untuk memeriksa bagaimana perilakunya berbeda di Chrome dan Firefox

    • Sepertinya tidak selalu begitu. Google Docs, Office 365, dan Notion bisa berjalan tanpa terus-menerus meminta izin
  • Karena HP menghentikan Anyware / Teradici / PCoIP, cukup banyak orang sekarang mencari alternatif. Yang paling dibutuhkan terutama adalah dukungan multi-monitor resolusi tinggi, 60fps, pemutaran dengan kedalaman bit tinggi, dukungan tablet Wacom, dan dukungan untuk ketiga OS
    Di sisi berbayar ada Parsec dan DCV, dan menyenangkan melihat upaya open source. Ada proyek seperti rustdesk, kyber, dan teraguchi, jadi komunitas tampaknya benar-benar membutuhkan opsi open source berperforma tinggi
    https://github.com/rustdesk/rustdesk
    https://github.com/thedepartmentofexternalservices/teraguchi
    https://kyber.tech/

    • Sebagai catatan, DCV gratis di EC2, dan bahkan di lingkungan lain pun peringatannya sangat ringan saat tidak ada lisensi
  • Ini memang terlihat menarik, tetapi agak mengejutkan bahwa fitur yang paling penting tidak disebutkan. Saya penasaran seberapa baik berbagi clipboard benar-benar bekerja

    • Saya tidak terlalu suka Windows, tetapi saat sesi RDP bertingkat 3 lapis tetap bisa saling copy/paste file, itu masih terasa seperti sihir
    • Kami juga sedang membuat klien RDP kustom, jadi punya sedikit pengalaman implementasi seperti ini. Kami mengimplementasikannya dengan cara yang mirip
      Berbagi clipboard serta upload/download melalui drive bersama adalah fitur FreeRDP, jadi relatif bisa langsung dimanfaatkan
      Dan perekaman sesi adalah hal yang tidak bisa ditawar dalam lingkungan PAM
      [1] https://adaptive.live
  • Penskalaan desktop, dukungan multi-monitor, transfer file, pengalihan drive, dan pengalihan periferal juga semuanya penting

  • Saya penasaran apakah ini juga bekerja saat membuka file RDP yang diterima dari CyberArk PAM

  • Saya juga penasaran apakah klien RDP bisa menangkap Alt-Tab dari dalam tab browser
    Dulu itu masalah terbesar pada RDP browser milik Guacamole

  • Secara teknis ini menarik, tetapi saya kurang paham kenapa ini diperlukan karena hampir semua platform sudah punya klien RDP native

    • Kalau bisa dari browser, tidak perlu memasang apa pun di mesin lokal. Dulu saat saya harus diam di kubikel kantor, saya sering memakai Apache Guacamole untuk mengakses komputer rumah
      https://guacamole.apache.org/
    • Baru 1 kontributor, 1 commit, dan proyek baru, jadi terasa agak seperti vibe-coding
    • Browser itu sandbox, sedangkan klien native umumnya tidak, jadi jelas ada kelebihannya. Portabilitas dan kemudahan embed juga ada, dan lebih mudah juga untuk menginspeksi trafik atau melakukan MITM
    • Di native RDP/RDG, pilihan MFA yang layak tidak banyak. Kalau dipindahkan ke browser, seluruhnya bisa dibungkus dengan OAuth atau passkey
    • Ini juga sepertinya bisa dipakai untuk klien web remote desktop yang terhubung ke chip BMC