Security
Model keamanan wayangi dalam satu halaman: apa yang kami lakukan, apa yang di-sign, apa yang di-hash, apa yang tidak kami kumpulkan.
Integritas download
- SHA-256 per binary — dipublikasikan di manifest.json dan di halaman download. Tiap binary yang terdaftar punya hash yang terlihat inline.
- Signature ed25519 di manifest — di-generate offline oleh
cmd/wayangi-sign, signing key tidak pernah ada di hub. Detached signature disajikan di manifest.json.sig. - Pubkey di-bake ke tiap release binary via
-ldflags="-X main.signingPubKey=...". Commandwayangi updatemenolak install kecuali manifest yang disajikan terverifikasi terhadap key yang di-bake. - Query param cache-busting di tiap URL download di-key dari prefix SHA, jadi Cloudflare tidak bisa kasih agent binary basi walau sebentar.
Autentikasi dan session
- Google OAuth via flow Authorization Code hand-rolled langsung ke endpoint Google — tanpa library OAuth pihak ketiga.
- Session token di-hash SHA-256 di storage. Cuma cookie yang pegang raw token; penyerang yang bisa baca DB tidak bisa replay session tanpa hash preimage.
- Cookie OAuth state: HttpOnly + Secure + SameSite=Lax + TTL 10 menit, dibandingkan dengan query
state=saat callback. - Validasi redirect ketat di URL
nextpasca-login: harus mulai dengan/, parse bersih, tanpa scheme, tanpa host. Menutup kelas protocol-relative-redirect (/\evil.com). - Allowlist email: allowlist domain-wide + pengecualian per-email. Signup tertutup.
Device token
- Token hex 64 karakter. Di-generate oleh
crypto/rand, 32 byte entropy. - Di-hash SHA-256 di database; raw token ditampilkan ke operator persis sekali saat pembuatan (atau setelah rotasi eksplisit).
- Satu token per device. Bootstrap sukses pertama mengikat token ke pubkey WireGuard device; bootstrap berikutnya dari pubkey berbeda butuh
--force-rebind. - Notifikasi force-rebind: kalau rebind terjadi, email terkirim ke pemilik device dengan source IP dan timestamp, jadi rebind dari token curian kelihatan.
WireGuard sisi hub
- Private key WG tiap device customer di-generate on-device dan tidak pernah meninggalkan device. Disimpan di
/etc/wayangi/state.json(mode 0700, root-only). - Hub menyimpan key publik WG device saja — cukup untuk menambahkannya sebagai peer, tidak cukup untuk meniru identitasnya.
- Policy egress inbound-only: firewall hub drop flow outbound baru apa pun yang source-nya pool customer. IP customer bisa response ke flow inbound tapi tidak bisa initiate outbound — menetralkan vektor abuse-dari-IP-customer di sumbernya.
- MSS clamp + IP forwarding ter-install otomatis saat hub startup — tidak perlu
iptablesout-of-band.
Audit log
Tabel audit_log mencatat tiap event yang mengubah state: rotasi token, force-rebind device, delete device, login akun, aktivasi pembayaran. Tiap entry membawa actor (user atau device), source IP, timestamp, dan detail event. Operator bisa review di /admin/audit dan /admin/security (view korelasi: token-rotate yang diikuti force-rebind dari IP berbeda dalam 5 menit di-flag sebagai pola klasik account-takeover).
Rate limit
/api/v1/bootstrap: burst 20 per IP, refill 1 / 6 detik./login: 10 / 30 detik per IP.POST /devices: 5 / 60 detik per user ID.POST /devices/{id}/rotate-token: 5 / 60 detik per device./wg-relay(transport fallback WebSocket): 10 / 5 detik per IP./check(probe reachability publik): 5 / 60 detik per IP, SSRF-restricted ke pool customer.
Tanpa telemetri
Agent melaporkan os/arch/hostname-nya persis sekali saat bootstrap supaya dashboard bisa menampilkan "Linux/arm64 on raspberrypi". Setelah itu dia tidak melaporkan apa-apa lagi. Tanpa usage analytics, tanpa upload crash, tanpa phone-home otomatis. wayangi update hanya menghubungi hub saat user menjalankannya secara eksplisit.
Gap yang diketahui
wayangi jujur soal apa yang belum selesai:
- CSRF token di endpoint POST — hari ini dilindungi
SameSite=Lax; CSRF token per-session ada di roadmap. - Hub single-region — Jakarta saja. HA multi-region ada di roadmap tapi belum di-ship.
- TTL session 30 hari tanpa rotasi — cookie yang dicuri tetap valid sebulan, walau session token-nya di-hash di storage.
- Tanpa SOC 2 / ISO 27001 / HIPAA — wayangi tidak tersertifikasi untuk industri teregulasi.
- Tanpa SAML / SSO — hari ini Google OAuth saja.
Melaporkan kerentanan
Email [email protected]. PGP tidak wajib. Kami merespons dalam 72 jam. Coordinated disclosure lebih disukai; mohon beri kami 30 hari sebelum rilis publik.
/.well-known/security.txt dipublikasikan sesuai RFC 9116.
Entitas operasi & data residency
DALANG PTE. LTD. (Singapore UEN 202622331M), mengoperasikan infrastruktur dalang.io. VM hub secara fisik berada di Jakarta, Indonesia. Data customer (info akun, device, audit log) disimpan di database SQLite VM tersebut. Untuk permintaan data-subject GDPR, email [email protected].