Kontrol dalam bagian 14 dari 21-compliance.md yang diminta auditor secara spesifik. Halaman ini menjelaskan prosedurnya; catatan yang dihasilkannya menjadi buktinya.
Kunci
Setiap kredensial tersimpan disegel dengan kunci enkripsi data (DEK) yang baru.
DEK dibungkus oleh kunci utama (KEK), dan referensi kunci utama disimpan di
sebelahnya (key_ref, atau referensi di dalam nilai yang dipaketkan). Rotasi
kunci utama membungkus ulang DEK. Rotasi ini tidak pernah mendekripsi atau
mengenkripsi ulang kredensial.
| Pengaturan | Arti |
|---|---|
QUIRE_MASTER_KEY |
Kunci utama saat ini: 32 byte, base64. Setiap rahasia baru dibungkus dengannya |
QUIRE_MASTER_KEY_VERSION |
Label versinya. v1 jika tidak disetel. Naikkan nilainya setiap kali Anda mengganti kunci |
QUIRE_MASTER_KEY_RETIRED |
Kunci sebelumnya yang mungkin masih digunakan untuk menyimpan rahasia, dalam format v1=<base64>,v0=<base64>. Hanya dibaca, tidak pernah ditulis |
Tingkat web, worker, dan perintah bun run kek:rotate membaca ketiga pengaturan
yang sama. Nilainya harus sama di semuanya, jika tidak salah satunya tidak dapat
membuka nilai yang disegel oleh yang lain.
Tanpa QUIRE_MASTER_KEY, setiap subsistem menyimpan kunci yang diturunkannya
dari QUIRE_SECRET_KEY. Cara ini berfungsi; halaman Kesehatan Sistem akan
menunjukkan status terdegradasi, dan data tetap dapat dibaca setelah Anda
menetapkan kunci utama. Dengan cara inilah rotasi pertama memindahkan semuanya
dari kunci tersebut. Siapa pun yang dapat membaca lingkungan proses bisa
mendekripsi setiap kredensial tersimpan, jadi instalasi produksi sebaiknya
memiliki kunci utama yang disimpan di penyimpanan rahasia, bukan di cadangan yang
sama dengan basis data.
Rotasi
Usia kunci ditampilkan di konsol Platform, Keamanan, Kunci utama, dan sebagai
metrik quire.secrets.master_key.age (hari). Jadwal harian platform.key_age
(03:41 UTC) menulis pengingat ke rantai audit platform saat kunci mencapai usia
365 hari, lalu setiap 30 hari sampai kunci dirotasikan. Lakukan rotasi saat ada
pengingat, serta setiap kali kunci mungkin telah terpapar.
- Buat kunci baru:
openssl rand -base64 32. - Setel
QUIRE_MASTER_KEYke nilai tersebut danQUIRE_MASTER_KEY_VERSIONke label berikutnya (v2). Pindahkan kunci lama keQUIRE_MASTER_KEY_RETIREDsebagaiv1=<old base64>. Simpan salinan keduanya di tempat selain host ini. - Terapkan tingkat web dan worker dengan pengaturan baru. Rahasia baru kini
dibungkus dengan
env:QUIRE_MASTER_KEY:v2; rahasia lama tetap bisa dibuka melalui kunci pensiun. - Minta rotasi dengan alasan yang akan tercatat di jejak audit:
- di konsol: Keamanan, Kunci utama, Rotasikan kunci utama; atau
- di shell dengan lingkungan yang sama:
bun run kek:rotate request --reason "Annual rotation, ticket SEC-114".
- Worker membungkus ulang sebagian data setiap menit (jadwal penjadwal
platform.key_rotation) dan melanjutkan setelah dimulai ulang. Untuk menyelesaikannya sekaligus:bun run kek:rotate run. Pantau denganbun run kek:rotate status. - Setelah catatan menunjukkan rotasi selesai dengan nol belum terselesaikan
dan nol gagal, hapus kunci pensiun dari
QUIRE_MASTER_KEY_RETIREDlalu terapkan ulang. Sampai saat itu, simpan kunci tersebut: nilai yang tidak dapat dipindahkannya masih dibungkus dengan kunci lama.
Data yang diproses oleh tugas
Setiap penyimpanan yang menampung DEK terbungkus: yang tercantum dalam
SEALED_STORES (apps/worker/src/key-rotation.ts). Penyimpanan basis data
kontrol diproses di basis data kontrol; penyimpanan organisasi diproses satu
organisasi pada satu waktu di bawah keamanan tingkat baris, di basis data mana
pun yang menampung organisasi tersebut. Dengan demikian, penyewa yang
ditempatkan pada basis data khusus akan dirotasikan di basis data itu. Sebuah tes
akan gagal jika skema menambahkan kolom berkunci terbungkus yang tidak tercantum
di daftar, dan tes lain akan gagal jika tinjauan kredensial mengklasifikasikan
kolom tersegel yang terlewat dari daftar.
Catatan
ops.key_rotation: satu baris untuk setiap rotasi, beserta alasannya, peminta, status, dan jumlahnya (dibungkus ulang, sudah terkini, belum terselesaikan, gagal).ops.key_rotation_progress: satu baris untuk setiap penyimpanan dan cakupan setelah diproses, beserta referensi kunci yang tidak dapat dibaca dan jumlah nilai di bawah tiap referensi. Rotasi yang dilanjutkan akan melewati data ini.- Rantai audit Platform:
platform/key_rotation_request(dengan alasannya), satuplatform/key_rotation_storeuntuk setiap penyimpanan beserta jumlahnya, danplatform/key_rotation_completeatauplatform/key_rotation_fail;platform/key_age_reminderuntuk pengingat. - Metrik:
quire.secrets.master_key.agedanquire.secrets.rewrap.outstanding(nilai yang tidak dapat dipindahkan oleh rotasi terakhir).
Jika nilai belum terselesaikan
Nilai yang belum terselesaikan dibungkus dengan referensi kunci yang tidak
dimiliki instalasi ini, atau bentuknya tidak sesuai dengan yang dijanjikan
kolomnya. Catatan progres menyebut referensinya (misalnya
env:QUIRE_MASTER_KEY:v0 (unreadable)). Pulihkan kunci itu ke
QUIRE_MASTER_KEY_RETIRED lalu jalankan rotasi lagi; atau, jika kuncinya hilang
selamanya, minta administrator organisasi memasukkan kembali kredensial tersebut:
kredensial itu kemudian disegel dengan kunci saat ini. Rotasi yang gagal
menampilkan kesalahannya di catatan; perbaiki penyebabnya lalu ajukan permintaan
lagi.
Kunci penandatanganan
Terpisah dari kunci utama: setiap organisasi menandatangani token OpenID Connect
dan pesan LTI dengan kunci RSA miliknya sendiri, yang dipublikasikan di
/.well-known/jwks.json. Operator tidak perlu melakukan apa pun di sini. Jadwal
per jam platform.signing_keys memublikasikan kunci penerus tujuh hari sebelum
masa berlaku kunci saat ini yang 90 hari berakhir. Seminggu kemudian, kunci
penerus mulai menandatangani dan kunci lama memasuki masa pensiun. Sembilan puluh
hari setelah itu, kunci lama dihapus dan dikeluarkan dari kumpulan kunci. Setiap
langkah dicatat sebagai entri platform/signing_key_advance di rantai audit
platform.
Untuk mengganti kunci organisasi lebih awal, misalnya setelah terjadi paparan:
- di konsol: Keamanan, Kunci utama, Publikasikan kunci penandatanganan baru
(memerlukan
platform/keys_manage); atau - di shell dengan lingkungan worker:
bun run kek:rotate signing-keys rotate --tenant <slug or id> --reason "Key exposed, INC-3310". Perintahbun run kek:rotate signing-keys statusmencantumkan kunci setiap organisasi berdasarkan tahapnya.
Kunci baru langsung dipublikasikan dan mulai menandatangani setelah tujuh hari,
saat kunci saat ini memasuki masa pensiun. Jeda satu minggu ini disengaja:
pihak yang mengandalkan layanan menyimpan salinan kumpulan kunci dalam cache,
dan tumpang tindih yang lebih singkat akan membuat semua alat gagal sekaligus.
Kunci pensiun tetap ada di kumpulan kunci selama 90 hari lagi agar token yang
telah ditandatanganinya tetap bisa diverifikasi. Jika paparan mengharuskan
kunci itu berhenti dipercaya lebih awal, menghapus barisnya merupakan perubahan
yang dilakukan dengan akses basis data milik operator sendiri di bawah catatan
perubahan (akses darurat hanya baca). Setelah itu token yang ditandatangani
dengannya akan gagal diverifikasi. Rotasi paksa dicatat sebagai
platform/signing_key_rotate di rantai audit, beserta alasannya. Worker
memerlukan pengaturan QUIRE_MASTER_KEY yang sama dengan tingkat web untuk
membungkus kunci baru; perintah bun run kek:rotate untuk kunci utama membungkus
ulang kunci penandatanganan bersama data lainnya (oauth_signing_key tercantum
di SEALED_STORES).
Akses darurat produksi
Tidak seorang pun memiliki akses tetap ke produksi. Jika sesuatu tidak bisa menunggu, pemilik menerbitkan izin akses darurat: konsol Platform, Keamanan, Akses darurat.
- Izin memiliki cakupan (satu organisasi atau registri platform), alasan minimal 20 karakter yang menyebut insiden atau tiket, serta jangka waktu 5 hingga 240 menit. Izin kedaluwarsa sendiri: masa berlakunya diperiksa terhadap waktu pada setiap pernyataan.
- Izin dapat diterbitkan untuk pemilik yang menerbitkannya sendiri atau untuk
pemilik lain (mekanisme dua orang). Hanya orang yang dituju izin tersebut yang
dapat menggunakannya. Penerbitan memerlukan
platform/break_glass_issuedan penggunaan memerlukanplatform/break_glass_use; secara bawaan keduanya hanya untuk pemilik. - Pernyataan dijalankan melalui gateway, bukan melalui login basis data: hanya baca, satu per satu, terbatas pada organisasi atau registri kontrol, dengan batas waktu lima detik dan paling banyak 500 baris. Nilai biner ditampilkan berdasarkan ukurannya.
- Rantai audit platform mencatat penerbitan (beserta alasannya), pencabutan,
setiap pernyataan sebelum dijalankan (
platform/break_glass_statement, yang ditolak dengan hasildenied), serta setiap hasil (platform/break_glass_result).ops.break_glass_statementmenyimpan ID entri audit sehingga catatan penerbitan dapat ditautkan ke entri auditnya. - Penulisan tidak tersedia. Perubahan yang tidak bisa menunggu rilis menggunakan akses basis data milik operator sendiri di bawah catatan perubahan tersendiri, di luar produk ini, dan catatan tersebut sebaiknya mencantumkan referensi insiden yang digunakan di sini.
Mengapa tidak menerbitkan kredensial basis data: login Postgres tetap aktif setelah sesi yang memintanya berakhir, melewati keamanan tingkat baris yang digunakan aplikasi, serta tidak dapat menulis ke rantai audit produk ini. Akibatnya, pernyataannya hanya akan diaudit sejauh seseorang mengirim log server. Gateway menjadikan jejak audit sebagai bagian dari akses itu sendiri, bukan sekadar praktik di sekitarnya.
Untuk menjawab permintaan audit: tampilkan daftar izin dalam periode tersebut
(Akses darurat), buka riwayat izin untuk melihat pernyataan dan ID entri
auditnya, lalu baca entri tersebut di rantai audit platform
(bun run audit:verify --platform membuktikan rantainya utuh).