Langkau ke kandungan

Pusingan kunci induk dan kunci tandatangan, serta akses break-glass

Pusingkan kunci induk yang melindungi kelayakan tersimpan, dan gunakan akses break-glass.

Kawalan dalam 21-compliance.md seksyen 14 yang diminta oleh seorang juruaudit mengikut nama. Halaman ini ialah prosedurnya; rekod yang dihasilkannya ialah bukti.

Kunci-kunci tersebut

Setiap kelayakan tersimpan disulitkan dengan satu kunci penyulitan data (DEK) yang baharu. DEK dibungkus oleh kunci induk (KEK), dan rujukan kunci induk disimpan sebelahnya (key_ref, atau rujukan di dalam satu nilai berpaket). Memusingkan kunci induk membungkus semula DEK-DEK. Ia tidak pernah menyahsulit atau menyulit semula satu kelayakan.

Tetapan Makna
QUIRE_MASTER_KEY Kunci induk semasa: 32 bait, base64. Setiap rahsia baharu dibungkus di bawahnya
QUIRE_MASTER_KEY_VERSION Label versinya. v1 apabila tidak ditetapkan. Naikkan ia setiap kali anda mengubah kunci
QUIRE_MASTER_KEY_RETIRED Kunci terdahulu yang mungkin masih menyimpan rahsia di bawahnya, sebagai v1=<base64>,v0=<base64>. Dibaca, tidak pernah ditulis

Lapisan web, pekerja dan arahan bun run kek:rotate membaca ketiga-tiga tetapan ini. Ketiga-tiganya mesti mempunyai nilai yang sama, atau salah satunya tidak dapat membuka apa yang disulitkan oleh yang lain.

Tanpa QUIRE_MASTER_KEY, setiap subsistem mengekalkan kunci yang diturunkannya daripada QUIRE_SECRET_KEY. Itu berfungsi, halaman Kesihatan platform memaparkannya sebagai merosot, dan ia kekal boleh dibaca selepas anda menetapkan satu kunci induk, yang merupakan cara pusingan pertama memindahkan segalanya daripadanya. Sesiapa yang boleh membaca persekitaran proses boleh menyahsulit setiap kelayakan tersimpan, jadi sebuah pemasangan produksi sepatutnya mempunyai satu kunci induk, disimpan dalam satu kedai rahsia dan bukan dalam sandaran yang sama dengan pangkalan data.

Memutarkan

Umur kunci dipaparkan pada Konsol platform, Keselamatan, Kunci induk, dan sebagai metrik quire.secrets.master_key.age (hari). Jadual harian platform.key_age (03:41 UTC) menulis satu entri peringatan ke rantai audit platform apabila kunci mencapai 365 hari, dan sekali lagi setiap 30 hari sehingga ia diputarkan. Putarkan pada peringatan itu, dan setiap kali sebuah kunci mungkin telah terdedah.

  1. Jana kunci baharu: openssl rand -base64 32.
  2. Tetapkan QUIRE_MASTER_KEY kepadanya dan QUIRE_MASTER_KEY_VERSION kepada label seterusnya (v2). Pindahkan kunci lama ke QUIRE_MASTER_KEY_RETIRED sebagai v1=<old base64>. Simpan satu salinan kedua-duanya di tempat lain selain hos ini.
  3. Lepaskan lapisan web dan pekerja dengan tetapan baharu. Rahsia baharu kini dibungkus di bawah env:QUIRE_MASTER_KEY:v2; yang lama masih dibuka melalui kunci yang bersara.
  4. Minta pusingan tersebut, dengan sebab yang akan berada dalam jejak audit:
    • dalam konsol: Keselamatan, Kunci induk, Putarkan kunci induk; atau
    • pada satu shell dengan persekitaran yang sama: bun run kek:rotate request --reason "Annual rotation, ticket SEC-114".
  5. Pekerja membungkus semula satu hirisan seminit (jadual platform.key_rotation pada perancang) dan menyambung semula selepas satu permulaan semula. Untuk menyiapkannya dalam satu dudukan: bun run kek:rotate run. Pantau dengannya bun run kek:rotate status.
  6. Apabila rekod menunjukkan pusingan selesai dengan sifar tidak selesai dan sifar gagal, buang kunci yang bersara daripada QUIRE_MASTER_KEY_RETIRED dan lepaskan semula. Sehingga itu, kekalkan ia: satu nilai yang tidak dapat dipindahkannya masih dibungkus di bawah kunci lama.

Apa yang ditelusuri tugas itu

Setiap stor yang memegang satu DEK yang dibungkus: yang dalam SEALED_STORES (apps/worker/src/key-rotation.ts). Stor pangkalan data kawalan ditelusuri pada pangkalan data kawalan; stor organisasi ditelusuri satu organisasi pada satu masa di bawah keselamatan tahap baris, dalam mana-mana pangkalan data yang memegang organisasi tersebut, supaya sebuah penyewa yang disemat pada pangkalan data khusus diputarkan dalam pangkalan data itu. Sebuah ujian gagal apabila skema memperoleh satu lajad kunci berbungkus yang tidak dinamakan oleh senarai, dan satu lagi apabila semakan kelayakan mengklasifikasikan satu lajad tersulit yang terlepas oleh senarai.

Rekod tersebut

  • ops.key_rotation: satu baris setiap pusingan, dengan sebabnya, siapa yang memintanya, statusnya dan jumlahnya (dibungkus semula, sudah semasa, tidak selesai, gagal).
  • ops.key_rotation_progress: satu baris setiap stor dan skop sebaik sahaja ditelusuri, dengan rujukan kunci yang tidak dapat dibacanya dan berapa banyak nilai berada di bawah setiap satu. Sebuah pusingan yang disambung semula melangkau ini.
  • Rantai audit platform: platform/key_rotation_request (dengan sebabnya), satu platform/key_rotation_store setiap stor dengan kiraannya, dan platform/key_rotation_complete atau platform/key_rotation_fail; platform/key_age_reminder untuk peringatan itu.
  • Metrik: quire.secrets.master_key.age dan quire.secrets.rewrap.outstanding (nilai yang tidak dapat dipindahkan oleh pusingan terakhir).

Apabila nilai tidak selesai

Satu nilai tidak selesai dibungkus di bawah satu rujukan kunci yang tidak dipegang oleh pemasangan ini, atau bukan dalam bentuk yang dijanjikan oleh lajadnya. Rekod kemajuan menamakan rujukan tersebut (contohnya env:QUIRE_MASTER_KEY:v0 (unreadable)). Pulihkan kunci itu ke dalam QUIRE_MASTER_KEY_RETIRED dan jalankan satu lagi pusingan, atau, jika kunci itu hilang selama-lamanya, minta pentadbir organisasi tersebut memasukkan kelayakan semula: ia kemudian disulitkan di bawah kunci semasa. Pusingan yang gagal memaparkan ralatnya pada rekod tersebut; baiki puncanya dan minta semula.

Kunci tandatangan

Berasingan daripada kunci induk: setiap organisasi menandatangani token OpenID Connect dan mesej LTI dengan kunci RSA-nya sendiri, diterbitkan di /.well-known/jwks.json. Tiada apa-apa di sini memerlukan seorang pengendali. Jadual setiap jam platform.signing_keys menerbitkan satu pengganti tujuh hari sebelum sembilan puluh hari kunci semasa tamat, seminggu kemudian pengganti itu mula menandatangani dan kunci lama menjadi bersara, dan sembilan puluh hari selepas itu kunci lama dipadam dan meninggalkan set kunci. Setiap langkah ialah satu entri platform/signing_key_advance pada rantai audit platform.

Untuk menggantikan kunci sebuah organisasi lebih awal, contohnya selepas satu pendedahan:

  • dalam konsol: Keselamatan, Kunci induk, Terbitkan satu kunci tandatangan baharu (memerlukan platform/keys_manage); atau
  • pada satu shell dengan persekitaran pekerja: bun run kek:rotate signing-keys rotate --tenant <slug or id> --reason "Key exposed, INC-3310". bun run kek:rotate signing-keys status menyenaraikan kunci setiap organisasi mengikut peringkat.

Kunci baharu diterbitkan serta-merta dan mula menandatangani selepas tujuh hari, apabila kunci semasa bersara. Minggu itu adalah disengajakan: pihak yang bergantung menyimpan set kunci dalam cache, dan satu pertindihan yang lebih pendek akan menggagalkan setiap alat serentak. Kunci yang bersara kekal dalam set kunci selama sembilan puluh hari lagi supaya token yang sudah ia tandatangani terus disahkan; jika pendedahan bermakna ia mesti berhenti dipercayai lebih awal, memadam barisnya ialah satu perubahan yang dibuat dengan akses pangkalan data pengendali sendiri di bawah satu rekod perubahan (akses break-glass hanya baca), dan token yang ditandatanganinya kemudian gagal pengesahan. Pusingan paksa ialah platform/signing_key_rotate dalam rantai audit, dengan sebabnya. Pekerja memerlukan tetapan QUIRE_MASTER_KEY yang sama seperti lapisan web untuk membungkus kunci baharu; bun run kek:rotate untuk kunci induk membungkus semula kunci tandatangan dengan segala-galanya yang lain (oauth_signing_key berada dalam SEALED_STORES).

Akses produksi break-glass

Tiada siapa yang memegang akses berterusan kepada produksi. Apabila sesuatu tidak boleh menunggu, seorang pemilik mengeluarkan satu gerakan break-glass: Konsol platform, Keselamatan, Akses break-glass.

  • Satu gerakan mempunyai satu skop (satu organisasi, atau registri platform), satu sebab sekurang-kurangnya 20 aksara yang menamakan insiden atau tiket, dan satu tetingkap 5 hingga 240 minit. Ia tamat tempoh dengan sendirinya: ia disemak terhadap jam pada setiap pernyataan.
  • Ia boleh dikeluarkan kepada pemilik yang mengeluarkannya, atau kepada pemilik lain (borang dua orang). Hanya orang ia dikeluarkan kepada yang boleh menggunakannya. Mengeluarkan memerlukan platform/break_glass_issue dan menggunakan memerlukan platform/break_glass_use; kedua-duanya hanya pemilik secara lalai.
  • Pernyataan berjalan melalui gerbang, bukan pada satu log masuk pangkalan data: hanya baca, satu pada satu masa, terhad kepada organisasi atau registri kawalan, dengan satu had masa lima saat dan paling banyak 500 baris. Nilai binari dipaparkan mengikut saiz.
  • Rantai audit platform merekodkan pengeluaran (dengan sebabnya), pembatalan, setiap pernyataan sebelum ia berjalan (platform/break_glass_statement, yang ditolak dengan hasil denied) dan setiap hasil (platform/break_glass_result). ops.break_glass_statement memegang id entri audit, jadi rekod pengeluaran bersambung kepada entri auditnya.
  • Penulisan tidak ditawarkan. Satu perubahan yang tidak boleh menunggu satu keluaran menggunakan akses pangkalan data pengendali sendiri di bawah rekod perubahannya sendiri, di luar produk ini, dan rekod itu sepatutnya memetik rujukan insiden yang digunakan di sini.

Mengapa tidak mengeluarkan kelayakan pangkalan data: satu log masuk Postgres mengatasi sesi yang memintanya, memintas keselamatan tahap baris yang bergantung kepada aplikasi, dan tidak dapat menulis ke rantai audit produk ini, jadi pernyataannya hanya akan diaudit setakat seseorang menghantar log pelayan. Gerbang menjadikan jejak audit sebagai satu sifat akses dan bukan satu amalan di sekelilingnya.

Untuk menjawab satu permintaan audit: senaraikan gerakan dalam tempoh tersebut (Akses break-glass), buka sejarah satu gerakan untuk pernyataannya dan id entri audit, dan baca entri-entri itu pada rantai audit platform (bun run audit:verify --platform membuktikan rantai itu utuh).

Navigasi

Taip untuk mencari…

↑↓ navigasi↵ pilihEsc tutup