Apa yang melindungi sebuah tenant, dikatakan apa adanya.
Tidak ada sertifikasi yang tidak kami pegang, tidak ada kata sifat yang menggantikan kendali. Ini yang ditegakkan, di mana ditegakkannya, dan apa yang belum ada.
Isolasi itu struktural, bukan hasil pengawasan.
Setiap kueri atas data milik sebuah ruang kerja membawa id ruang kerja di kondisinya. Tidak ada jalur akses tanpa lingkup yang bisa lupa dipakai.
Kegagalan yang dihapus rancangan ini adalah yang paling biasa: sistem yang sudah benar, lalu satu endpoint baru yang ditulis terburu-buru melewatkan klausa WHERE. Kalau lapisan data menolak menjawab pertanyaan yang tidak menyebut ruang kerja, endpoint itu tidak terkompilasi menjadi sebuah kebocoran — ia tidak terkompilasi sama sekali.
Uji kebocoran bergaya penyerang memaku sifat ini, alih-alih memercayai kebiasaan, sebab sebuah kebiasaan hanya sebaik orang terakhir yang membaca berkas itu.
internal/tenancy · migrations/0002
Log audit hanya-tambah ada di basis data, bukan di aplikasi.
Sebuah pemicu melempar galat pada setiap pembaruan atau penghapusan. Aplikasi yang memutuskan tidak menulis ulang sejarah adalah kebijakan; basis data yang menolak menulis ulang adalah kendali.
Inilah perbedaan yang ditanyakan auditor dan biasanya tak bisa dijawab vendor. Kalau satu-satunya penghalang penyuntingan surut adalah “tidak ada jalur kode yang melakukannya”, maka satu skrip dukungan, satu migrasi, atau satu operator dengan konsol bisa melakukannya, dan log tidak akan tahu.
internal/tenancy · migrations/0002 audit_log_immutable()
Kunci berotasi tanpa gangguan layanan. Masuk akun tahan phishing.
Rotasi yang butuh jendela pemeliharaan adalah rotasi yang tidak pernah terjadi.
- 01
Id kunci dengan masa berlaku bertindih
Kunci API dan kunci tanda tangan webhook tiap ruang kerja membawa sebuah id kunci. Selama rotasi keduanya berlaku, jadi Anda berpindah sesuai jadwal Anda sendiri lalu mencabut yang lama.internal/tenancy · internal/outbox/sign.go
- 02
Passkey untuk anggota maupun operator
WebAuthn dengan verifikasi pengguna dan kredensial yang dapat ditemukan sebagai keharusan — bukan pilihan, karena token ini berdiri tepat di depan aliran uang. Masuk dengan kredensial yang dapat ditemukan menemukan akunnya dari kredensial itu sendiri, jadi tidak ada yang perlu diketik dan tidak ada yang bisa dipancing.internal/passkey
- 03
Dua faktor lewat aplikasi, disimpan dengan benar
Rahasia TOTP tidak bisa di-hash — verifikasi harus menghitung ulang kodenya dari rahasia itu — jadi rahasia anggota disegel dengan AES-256-GCM di bawah subkunci khusus konteks, bukan disimpan terbuka. Penghitung dari kode yang diterima ditulis balik, sehingga sebuah kode tidak bisa dipakai ulang dalam jendela waktunya.internal/membertotp · internal/secretbox
- 04
Di-hash bila bisa, disegel bila tidak
Kata sandi atau kode pemulihan di-hash, karena platform hanya perlu menjawab “ini bukan?”. Rahasia yang harus bisa dibaca kembali oleh platform justru disegel, dan penyimpanan yang lebih tua dari konstruksi itu sedang dipindahkan ke sana, bukan dibiarkan apa adanya.internal/secretbox
Tidak ada yang bocor lewat URL yang Anda konfigurasi.
Tujuan sebuah webhook, menurut konstruksinya, adalah masukan yang dipengaruhi penyerang — itu URL yang diketik tenant, lalu platform memanggilnya dari dalam jaringannya sendiri.
Pengirim menjalankan penjaga lalu lintas keluar sebelum permintaan dikirim, alih-alih memercayai nama host; hanya urutan itu yang berguna: pemeriksaan setelah resolusi nama, atau pemeriksaan atas teksnya alih-alih atas alamat sesungguhnya, persis pemeriksaan yang memang dirancang untuk ditembus DNS rebinding. Tujuan loopback dan jaringan privat hanya diizinkan di sandbox dan uji ujung-ke-ujung, dan pelonggaran itu adalah flag eksplisit, bukan menebak lingkungan.
internal/outbox/ssrf.go · internal/outbox/dispatcher.go
Kami bukan kustodian, dan kodenya menolak menjadi kustodian.
Tidak memegang dana anggota. Tidak memegang kunci privat. Tidak ada kredensial platform di dalam kanal pembayaran seorang tenant.
Anggota membayar Anda
internal/rails
Konfigurasi menolak milik kami
internal/rails
Penarikan memberi instruksi, tidak pernah memindahkan
internal/claims
Verifikasi tanpa menyimpan dokumen.
Sesi penyedia berjalan di akun Anda sendiri. Yang kembali adalah sebuah keputusan dan satu penanda yang tidak bisa dibalik.
Penanda itu cukup untuk menegakkan satu orang satu posisi, dan tidak lebih. Ia tidak cukup untuk menyusun ulang sebuah identitas, dan justru itulah intinya: cara paling aman menyimpan pindaian paspor adalah tidak menyimpannya, dan sebuah kebocoran tidak bisa mengungkap data yang tidak pernah disimpan.
internal/verification
Hal-hal yang tidak kami klaim.
Kalau Anda sedang mengisi kuesioner penilaian vendor, inilah baris-baris yang akan kami gagal penuhi. Lebih baik tahu di sini daripada di bulan keempat.
See /contact#security
Kirimkan kuesionernya, atau ambil sandbox dan lihat sendiri.
Keduanya sama-sama boleh. Salah satunya lebih cepat.