Kehendak soalan dan konteks
Beberapa perkhidmatan perniagaan perlu menjawab soalan yang sama: siapa yang boleh melakukan tindakan apa pada sumber mana? Reka bentuk perkhidmatan keputusan dikongsi yang menerima subjek, tindakan, sumber, dan konteks, mengembalikan ALLOW atau DENY, serta menyokong pengguna, akaun perkhidmatan, sumber berhierarki, sempadan penyewa, dan perubahan dasar.
Gunakan andaian temu duga ini: 100,000 semakan autorisasi sesaat pada garis dasar, puncak 3x ganda purata, sasaran kependaman p99 sebanyak 20 ms, penulisan dasar yang jauh lebih jarang berbanding pembacaan, dan pemanggil yang mesti membezakan penafian eksplisit daripada ketidaksediaan sementara perkhidmatan autorisasi. Ini adalah andaian masalah, bukan penanda aras industri. Pengambilan bayaran, pengeluaran kunci, dan penulisan pangkalan data perniagaan kekal di luar perkhidmatan ini.
Perkara yang diuji oleh penemu duga
Jawapan yang mantap mengubah autorisasi menjadi tupel empat dan kontrak ketekalan dan bukannya sekadar berkata “tambah perkhidmatan RBAC”:
- memodelkan sempadan untuk subjek, sumber, tindakan, konteks, hierarki, dan rujukan rentas penyewa;
- bila dasar ACL, RBAC, ABAC, atau berasaskan hubungan sesuai, dan cara mencegah logik dasar daripada bercapah merentasi perkhidmatan;
- bagaimana laluan baca keputusan, laluan tulis dasar, cache, dan peristiwa pembatalan bekerjasama;
- bila perubahan dasar mula kelihatan dan sama ada cache lapuk masih boleh membenarkan akses;
- sama ada gangguan adalah fail-open atau fail-closed bagi setiap kelas risiko;
- bagaimana log, penjelasan, main semula, dan suntikan kerosakan membuktikan penafian yang betul tanpa kebocoran rentas penyewa.
Soalan penjelasan untuk ditanya
Tanya kekangan yang mengubah reka bentuk:
- Apakah tetingkap ketekalan? Jika pembatalan hak (revocation) mesti berkuat kuasa dalam masa 5 saat, pajakan cache dan token versi mesti memenuhi 5 saat; kelonggaran skala minit membenarkan TTL yang lebih lama.
- Adakah semakan ini carian sumber tunggal atau pertanyaan hubungan? “Bolehkah pengguna ini membaca dokumen?” mungkin bergantung pada keahlian, pewarisan kumpulan, dan sumber induk; perkara tersebut menentukan sama ada graf hubungan atau semakan kelompok diperlukan.
- Apakah yang dibenarkan semasa gangguan? Kandungan awam mungkin dibenarkan untuk fail open, manakala pembayaran, data peribadi, dan pentadbiran biasanya fail closed. Buat pilihan berdasarkan risiko, bukan kebiasaan.
- Siapa yang menulis dan menyemak dasar? Penerbitan langsung oleh pasukan perniagaan memerlukan versi, kelulusan, semakan statik, dan pengunduran (rollback); penulis khusus keselamatan sahaja boleh mengurangkan permukaan kawalan.
- Adakah pemanggil memerlukan penjelasan? Penyahpepijatan mungkin memerlukan ID peraturan yang sepadan, tetapi penjelasan yang menghadap pelanggan tidak boleh mendedahkan sumber atau dasar penyewa lain.
Rangka kerja jawapan 30 saat
Mulakan dengan struktur ini:
“Saya memodelkan permintaan sebagai (principal, action, resource, context). Enjin dasar mengembalikan allow, deny, versi dasar, dan ID peraturan dalaman apabila penyahpepijatan terkawal memerlukannya. Satah kawalan (control plane) menguruskan dasar berskopkan penyewa dan data hubungan; satah data (data plane) menilai snapshot berversi yang tidak boleh diubah (immutable) dalam cache setempat baca sahaja. Penerbitan mengeluarkan peristiwa pembatalan yang boleh dimainkan semula, dan pemanggil menghantar versi dasar minimum supaya snapshot lapuk tidak dapat mengatasi keputusan yang lebih baharu secara senyap. Laluan sensitif menjadi fail closed apabila autorisasi tidak tersedia; pembacaan berisiko rendah merosot kualitinya hanya di bawah dasar produk yang eksplisit. Saya mengesahkan penyebaran pembatalan hak, sempadan rentas penyewa, perlumbaan cache (cache races), dan kegagalan kebergantungan dengan suntikan kerosakan dan main semula.”
Ini memberikan model, aliran data, ketekalan, dan tingkah laku kegagalan sebelum soalan susulan memilih satu bahagian untuk dihuraikan lebih lanjut.
Analisis mendalam langkah demi langkah
Tentukan semantik dasar terlebih dahulu. Subjek mungkin pengguna, akaun perkhidmatan, atau kumpulan. Sumber mungkin penyewa, projek, atau dokumen dalam sesuatu hierarki. Tindakan mestilah perbendaharaan kata yang terhad seperti read, write, dan share. Konteks boleh merangkumi keadaan peranti, sumber, atau masa, tetapi medan pelanggan yang tidak disahkan bukanlah fakta yang dipercayai. Panduan ABAC NIST menganggap atribut subjek, objek, dan persekitaran sebagai input keputusan; dasar hubungan mewakili keahlian sebagai sisi (edge) yang boleh dilalui.
Asingkan satah kawalan dan data. Satah kawalan mengedit, mengesahkan, meluluskan, mengversi, dan mengundurkan dasar. Satah data hanya memuatkan snapshot tidak boleh ubah yang telah diterbitkan dan menjawab semakan. Perkhidmatan perniagaan tidak sepatutnya masing-masing membina penghurai dasar yang berbeza. Sesuatu penerbitan mencipta versi monotonik dan peristiwa pembatalan; satah data menukar snapshot tersebut secara atomik supaya set peraturan yang baru diterbitkan separuh tidak akan sesekali kelihatan.
Reka bentuk API semakan. Antara muka dalaman boleh menjadi:
Check(principal, action, resource, context, min_policy_version)
-> decision, policy_version, rule_id, expires_at
BatchCheck(principal, [(action, resource, context)...])
-> decisions[]rule_id adalah untuk log terkawal dan penyahpepijatan. Pemanggil rentas penyewa tidak boleh mengetahui kewujudan sumber melalui butiran ralat. Semakan kelompok mengurangkan perjalanan pergi-balik (round trips) tetapi memerlukan had pada saiz kelompok dan kos penilaian.
Kendalikan ketekalan dan pemecahan cache. Cache setempat boleh memenuhi sasaran 20 ms, tetapi pembatalan hak tidak boleh bergantung pada TTL semata-mata. Pemanggil boleh menghantar versi dasar terakhir yang diperhatikannya; jika versi setempat ketinggalan, perkhidmatan membaca replika yang dikongsi atau mengembalikan “tidak dapat diputuskan buat sementara waktu.” Peristiwa pembatalan memerlukan kursor main semula dan penyesuaian berkala supaya pemberitahuan yang hilang tidak meninggalkan status allow yang lapuk. Untuk sumber yang sangat sensitif, sertakan versi sumber atau pajakan pendek supaya kebenaran dan versi objek disemak bersama.
Pilih tingkah laku gangguan. Jika satah data tidak dapat menghubungi satah kawalan, snapshot termuat yang belum tamat tempoh boleh terus memberikan perkhidmatan. Selepas ia tamat tempoh, tindakan pembayaran, data peribadi, dan pentadbiran harus fail closed; kandungan statik awam boleh fail open hanya di bawah peraturan produk yang diluluskan. Tamat masa mestilah dalam bentuk UNAVAILABLE yang eksplisit, bukan DENY yang menyamar, atau logik perniagaan akan mengelirukan kegagalan infrastruktur dengan kegagalan kebenaran pengguna.
Asingkan penyewa dan penyalahgunaan. Setiap objek dasar dan kunci cache membawa ID penyewa. Pelayan memperoleh penyewa daripada identiti yang disahkan dan bukannya mempercayai medan badan permintaan yang sewenang-wenangnya. Kenakan kuota bagi setiap subjek, penyewa, dan kelompok; hadkan kedalaman hubungan dan kerumitan dasar supaya satu penyewa tidak dapat menghabiskan sumber penilaian.
Audit dan sahkan. Rekodkan cincangan permintaan, subjek, tindakan, jenis sumber, keputusan, versi dasar, kependaman, dan kelas kegagalan; simpan nilai sensitif sebagai pengecam yang tidak boleh dipulihkan. Uji cache lapuk selepas pembatalan hak, kitaran pewarisan kumpulan, ID sumber yang serupa merentasi penyewa, ranap semasa penerbitan, peristiwa pembatalan pendua atau hilang, permulaan semula satah data, dan tamat masa kebergantungan. Penerimaan memerlukan main semula versi dasar dan penjelasan sesuatu keputusan, bukan sekadar mengembalikan DENY.
Anggarkan kekangan utama (bottleneck). Pada garis dasar 100,000 semakan sesaat dan 300,000 pada waktu puncak, 2 KB bagi setiap permintaan membayangkan kira-kira 600 MB/s kemasukan data (ingress) waktu puncak. Menghantar dasar penuh pada setiap permintaan meningkatkan kependaman dan lebar jalur, jadi utamakan snapshot setempat, semakan kelompok, dan replika bacaan. Jika penelusuran hubungan menjadi kekangan, bahagikan (shard) mengikut penyewa atau sumber dan hadkan kedalaman serta fan-out. Nyatakan bagaimana ujian beban akan menggantikan andaian-andaian ini.
Contoh jawapan berkualiti tinggi
“Saya mula-mula akan mengesahkan sasaran pembatalan hak dan sempadan keselamatan semasa kegagalan. Andaikan 300,000 semakan sesaat pada waktu puncak, sasaran p99 sebanyak 20 ms, dan pembatalan hak berkuat kuasa dalam masa 5 saat. Saya akan mengasingkan satah kawalan dan data. Satah kawalan menyimpan ACL berskopkan penyewa, hubungan kumpulan, dan syarat ABAC; sebelum menerbitkan, ia menyemak sintaks, kitaran, dan rujukan rentas penyewa, kemudian mencipta snapshot tidak boleh ubah dan versi monotonik. Satah data setiap rantau menilai (subject, action, resource, context) daripada cache setempat baca sahaja. Peristiwa pembatalan membawa kursor dan boleh dimainkan semula; pemanggil boleh menghantar min_policy_version, supaya cache yang ketinggalan membaca replika yang dikongsi atau mengembalikan UNAVAILABLE.
Untuk tindakan pembayaran, data peribadi, dan pentadbiran, snapshot yang tamat tempoh atau kebergantungan yang tidak tersedia akan fail closed; penurunan kualiti perkhidmatan kandungan awam memerlukan kelulusan produk yang eksplisit. Hasil keputusan membawa versi dasar dan ID peraturan dalaman. Log merekodkan keputusan, kependaman, dan kelas ralat tanpa mengulangi data penyewa lain. Versi sumber atau pajakan pendek melindungi objek yang paling sensitif daripada status allow lama selepas pembatalan hak. Ujian beban meliputi trafik puncak dan penelusuran hubungan paling dalam; suntikan kerosakan merangkumi pembatalan yang hilang, perlumbaan pembatalan hak, ID rentas penyewa, dan permulaan semula rantau. Penyesuaian dan main semula berversi mesti menunjukkan tiada status allow yang tidak dapat dijelaskan.”
Ini menghubungkan andaian, model, ketekalan, pengendalian kegagalan, dan pengesahan. Dalam temu duga, kurangkan butiran apabila kekangan berubah; 300,000 semakan sesaat dan 5 saat bukanlah fakta pengeluaran yang universal.
Kesilapan lazim
- Mengurangkan setiap kes kepada RBAC. Peranan tidak menyatakan hierarki, hubungan yang diwarisi, atau keadaan persekitaran secara semula jadi. Tentukan semantik kebenaran sebelum memilih model.
- Menggunakan TTL tetap sebagai pembatalan hak. TTL mengehadkan satu kes kelapukan tetapi tidak menyelesaikan pemberitahuan yang hilang atau perlumbaan versi. Tambahkan versi, pembatalan yang boleh dimainkan semula, dan penyesuaian.
- Sentiasa fail open atau sentiasa fail closed. Risiko sumber adalah berbeza. Tentukan tingkah laku daripada tahap asas keselamatan, kesegaran snapshot, dan kebolehbalikan perniagaan.
- Menyalin logik dasar ke dalam setiap perkhidmatan. Penghurai berbilang akan terpesong dan menghasilkan penafian yang berbeza. Versikan dasar dan panggil satu antara muka keputusan.
- Mengembalikan “sumber tiada” atau peraturan terperinci. Perkara itu membocorkan maklumat rentas penyewa. Gunakan ralat luaran yang stabil dan ID peraturan dalaman terkawal.
- Hanya menguji laluan allow yang normal. Pembatalan hak, main semula, kitaran, dan sempadan penyewa adalah tempat berlakunya kegagalan autorisasi. Gunakan suntikan kerosakan dan main semula berversi.
Soalan susulan dan jawapan
Bolehkah cache setempat dikekalkan jika pembatalan hak mestilah serta-merta?
Boleh, tetapi cache tidak boleh membuat keputusan secara bersendirian. Pembatalan hak mesti mencipta versi yang boleh diperhatikan secara global atau pembatalan pajakan. Permintaan sensitif membawa versi dasar minimum; cache yang ketinggalan memintas data setempat atau menunggu pengesahan. Jika pengesahan tidak dapat dimuatkan dalam bajet masa, kembalikan UNAVAILABLE atau deny daripada menggunakan allow lama secara senyap.
Bagaimana jika penelusuran hubungan menemui kitaran melalui kumpulan induk?
Tolak kitaran semasa penerbitan, kemudian tetap kuatkuasakan kedalaman maksimum, bilangan nod, dan bajet masa semasa masa jalan (runtime). Penilai menjejak nod yang dilawati, menghentikan cabang yang berulang, dan mengembalikan ralat dalaman yang boleh didiagnosis. Sesuatu kitaran tidak boleh sesekali mengubah satu semakan menjadi kerja tanpa had.
Bagaimanakah anda membuktikan tiada autorisasi rentas penyewa?
Wajibkan skop penyewa dalam ruang nama dasar dan awalan kunci cache, serta terbitkan penyewa subjek daripada identiti pihak pelayan. Hasilkan ID sumber yang serupa di bawah penyewa berbeza dengan ujian berasaskan sifat (property tests); setiap allow mesti memenuhi kesamarataan penyewa subjek, sumber, dan dasar. Tambahkan pensampelan log dan main semula laluan penafian.
Adakah anda perlu menyalin model ketekalan luaran Zanzibar?
Tidak. Pilih token versi, pajakan, atau ketekalan yang lebih kukuh berdasarkan sasaran pembatalan hak dan risiko perniagaan. Jika sesuatu produk menjanjikan bahawa ahli yang baru dikeluarkan tidak boleh terus membaca objek lama, susunan bersebab (causal ordering) dan versi objek adalah wajar. Untuk kandungan awam berisiko rendah, ketekalan yang lebih lemah dan pemecahan cache yang lebih lama mungkin lebih mudah. Nyatakan janji tersebut berserta kosnya.