Ano ang nagpoprotekta sa isang tenant, sabihin nang tuwiran.
Walang sertipikasyong hindi namin hawak, walang pang-uri na kapalit ng kontrol. Narito ang ipinatutupad, kung saan ito ipinatutupad, at kung ano ang kulang.
Estruktura ang paghihiwalay, hindi pagbabantay.
Bawat query sa datos na pag-aari ng isang workspace ay may dalang workspace id sa kondisyon nito. Walang daan ng akses na walang saklaw na puwedeng makalimutang gamitin.
Ang karaniwang pagkabigo ang inaalis ng disenyong ito: isang tamang sistema, na may bagong endpoint na isinulat nang minadali at nakaligtaan ang isang WHERE clause. Kung tumatanggi ang data layer na sumagot sa tanong na hindi nagpangalan ng workspace, hindi nagiging leak ang endpoint na iyon pagka-compile — hindi nga ito nagko-compile.
Ipinapako ng mga adbersaryong leak test ang katangiang ito sa halip na magtiwala sa kaugalian, dahil kasinghusay lang ng huling taong bumasa ng file ang isang kaugalian.
internal/tenancy · migrations/0002
Nasa database ang pagiging puwede-lang-dagdagan ng audit log, hindi sa aplikasyon.
Nagre-raise ng error ang isang trigger sa anumang update o delete. Patakaran ang aplikasyong nagpapasyang huwag baguhin ang kasaysayan; kontrol ang database na tumatangging baguhin ito.
Ito ang pagkakaibang tinatanong ng auditor at karaniwang hindi masagot ng vendor. Kung ang tanging humahadlang sa pabalik na pag-edit ay wala lang code path na gumagawa nito, kaya iyon ng isang support script, isang migration, o isang operator na may console — at hindi malalaman ng log.
internal/tenancy · migrations/0002 audit_log_immutable()
Umiikot ang mga key nang walang downtime. Hindi napa-phish ang pag-sign in.
Ang pag-ikot ng key na kailangang may maintenance window ay pag-ikot na hindi nangyayari.
- 01
Mga key id na nagsasapawan ang bisa
May key id ang API key at webhook signing key ng bawat workspace. Habang umiikot, parehong may bisa ang luma at bago, kaya lilipat ka ayon sa sarili mong iskedyul at saka babawiin ang luma.internal/tenancy · internal/outbox/sign.go
- 02
Passkey para sa mga miyembro at sa mga operator
WebAuthn na kinakailangan ang user verification at discoverable credential — hindi opsyonal, dahil nasa harap mismo ng daloy ng pera ang mga token na ito. Hinahanap ng discoverable login ang account mula mismo sa kredensyal, kaya walang tinitipa at wala ring mapa-phish.internal/passkey
- 03
Two-factor sa authenticator, tamang pag-iimbak
Hindi puwedeng i-hash ang TOTP secret — muling kinukuwenta ng beripikasyon ang mga code mula rito — kaya sinesyelyuhan ang mga sikreto ng miyembro gamit ang AES-256-GCM sa ilalim ng subkey na naka-ukol sa konteksto, sa halip na itago nang hayag. Isinusulat pabalik ang counter ng tinanggap na code, kaya hindi na ito magagamit muli sa loob ng bisa nito.internal/membertotp · internal/secretbox
- 04
I-hash kung kaya, iselyo kung hindi
Hinahash ang password o recovery code, dahil ang kailangan lang sagutin ng platform ay “ito ba iyon?”. Ang sikretong kailangang mabasa muli ng platform ay sinesyelyuhan, at ang mga imbakang mas matanda pa sa konstruksyong ito ay inililipat na, hindi iniiwan sa dati.internal/secretbox
Walang lumalabas sa URL na ikaw ang nag-configure.
Ang destinasyon ng isang webhook ay likas na input na naiimpluwensiyahan ng umaatake — URL iyon na tinipa ng tenant, at saka ito tatawagin ng platform mula sa loob ng sarili nitong network.
Pinapatakbo ng dispatcher ang egress guard bago ipadala ang request, sa halip na pagkatiwalaan ang hostname; iyon lang ang pagkakasunod na may saysay: ang tsek na ginawa matapos ang resolution, o ginawa sa teksto sa halip na sa aktuwal na address, ay siya mismong tsek na sadyang nilalampasan ng DNS rebinding. Pinapayagan lang ang loopback at pribadong destinasyon sa sandbox at sa end-to-end na pagsubok, at tahasang flag ang pagluwag na iyon, hindi paghula sa kapaligiran.
internal/outbox/ssrf.go · internal/outbox/dispatcher.go
Hindi kami kustodyan, at tumatanggi ang code na maging kustodyan.
Walang pondo ng miyembro. Walang private key. Walang kredensyal ng platform sa loob ng paraan ng bayad ng isang tenant.
Sa iyo nagbabayad ang mga miyembro
internal/rails
Tinatanggihan ng konpigurasyon ang sa amin
internal/rails
Nag-uutos ang claim, hindi ito naglilipat
internal/claims
Beripikasyon nang walang itinatabing dokumento.
Sa sarili mong account tumatakbo ang session ng provider. Ang bumabalik ay isang desisyon at isang handle na hindi na maibabalik.
Sapat lang ang handle na iyon para ipatupad ang isang tao, isang posisyon, at wala nang iba. Hindi ito sapat para buuin muli ang isang pagkakakilanlan, at iyon mismo ang punto: ang pinakaligtas na paraan ng pag-iingat ng scan ng pasaporte ay ang hindi pag-iingat nito, at hindi maibubunyag ng isang breach ang datos na hindi naman naitabi.
internal/verification
Ang mga hindi namin inaangkin.
Kung pinupunan mo ang isang vendor questionnaire, ito ang mga hanay na babagsak kami. Mas mabuting malaman dito kaysa sa ikaapat na buwan.
See /contact#security
Ipadala ang questionnaire, o kumuha ng sandbox at tingnan mo mismo.
Parehong maayos. Mas mabilis lang ang isa.