Kontrole koje revizor po imenu traži navedene su u odjeljku 14 dokumenta 21-compliance.md. Ova stranica sadrži postupak; zapisi koje on proizvodi predstavljaju dokaz.
Ključevi
Svaki sačuvani pristupni podatak zapečaćen je svježim ključem za šifrovanje podataka (DEK). DEK se omotava glavnim ključem (KEK), a referenca glavnog ključa čuva se uz njega (key_ref ili referenca unutar zapakovane vrijednosti). Rotacijom glavnog ključa DEK-ovi se ponovo omotavaju. Pristupni podaci se pritom nikada ne dešifruju niti ponovo šifruju.
| Postavka | Značenje |
|---|---|
QUIRE_MASTER_KEY |
Trenutni glavni ključ: 32 bajta, base64. Svaka nova tajna omotava se njime |
QUIRE_MASTER_KEY_VERSION |
Oznaka verzije. Ako nije postavljena, v1. Povećajte je pri svakoj promjeni ključa |
QUIRE_MASTER_KEY_RETIRED |
Raniji ključevi kojima su tajne možda još omotane, u obliku v1=<base64>,v0=<base64>. Čitaju se, ali se njima ne šifruje |
Web sloj, worker i komanda bun run kek:rotate čitaju iste tri postavke. Njihove vrijednosti moraju biti jednake ili neki proces neće moći otvoriti ono što je drugi zapečatio.
Bez QUIRE_MASTER_KEY svaka podsistema koristi ključ izveden iz QUIRE_SECRET_KEY. To funkcioniše, stranica Zdravlje sistema prikazuje pogoršano stanje, a podaci ostaju čitljivi kada postavite glavni ključ; tako se prvom rotacijom sve premješta sa starog ključa. Svako ko može čitati okruženje procesa može dešifrovati sve sačuvane pristupne podatke, pa produkcijska instalacija treba imati glavni ključ u spremištu tajni, odvojeno od sigurnosne kopije baze.
Rotiranje ključa
Starost ključa prikazuje se u konzoli Platform, u Security, Master key i putem metrike quire.secrets.master_key.age (dani). Dnevni zadatak platform.key_age (03:41 UTC) upisuje podsjetnik u revizorski lanac platforme kada ključ navrši 365 dana, a zatim svakih 30 dana dok se ne rotira. Rotirajte ga nakon podsjetnika i uvijek kada je možda otkriven.
- Generišite novi ključ:
openssl rand -base64 32. - Postavite
QUIRE_MASTER_KEYna novu vrijednost, aQUIRE_MASTER_KEY_VERSIONna sljedeću oznaku (v2). Stari ključ premjestite uQUIRE_MASTER_KEY_RETIREDkaov1=<old base64>. Sačuvajte kopije oba ključa izvan ovog hosta. - Implementirajte web sloj i worker s novim postavkama. Nove tajne sada se omotavaju referencom
env:QUIRE_MASTER_KEY:v2; stare se još mogu otvoriti pomoću povučenog ključa. - Zatražite rotaciju i navedite razlog koji će se upisati u revizorski dnevnik:
- u konzoli: Security, Master key, Rotate the master key; ili
- u shellu s istim okruženjem:
bun run kek:rotate request --reason "Annual rotation, ticket SEC-114".
- Worker svake minute ponovo omotava dio vrijednosti (zadatak schedulera
platform.key_rotation) i nastavlja nakon ponovnog pokretanja. Za dovršetak u jednom koraku pokrenitebun run kek:rotate run. Napredak pratite pomoćubun run kek:rotate status. - Kada zapis pokaže da je rotacija završena uz nula neriješenih i nula neuspjelih vrijednosti, uklonite povučeni ključ iz
QUIRE_MASTER_KEY_RETIREDi ponovo implementirajte. Dotad ga zadržite: vrijednost koju rotacija nije uspjela premjestiti i dalje je omotana starim ključem.
Šta zadatak obrađuje
Svako spremište koje čuva omotani DEK: stavke iz SEALED_STORES (apps/worker/src/key-rotation.ts). Spremišta kontrolne baze obrađuju se u toj bazi, a spremišta organizacija obrađuju se jednu po jednu uz row-level security u bazi gdje se organizacija nalazi; zato se organizacija vezana za namjensku bazu rotira upravo u njoj. Test pada kada se šemi doda kolona omotanog ključa koja nije navedena u popisu; drugi test pada ako pregled pristupnih podataka klasifikuje zapečaćenu kolonu koju popis propušta.
Evidencija
ops.key_rotation: po jedan red za rotaciju s razlogom, podnosiocem zahtjeva, stanjem i ukupnim brojevima (ponovo omotane, već aktuelne, neriješene, neuspjele).ops.key_rotation_progress: po jedan red za obrađeno spremište i opseg s referencama ključeva koje nije bilo moguće pročitati i brojem vrijednosti ispod svake reference. Nastavljena rotacija preskače te stavke.- Revizorski lanac platforme:
platform/key_rotation_request(s razlogom), po jedanplatform/key_rotation_storepo spremištu s brojevima iplatform/key_rotation_completeiliplatform/key_rotation_fail;platform/key_age_reminderza podsjetnik. - Metrike:
quire.secrets.master_key.ageiquire.secrets.rewrap.outstanding(vrijednosti koje posljednja rotacija nije mogla premjestiti).
Neriješene vrijednosti
Neriješena vrijednost omotana je referencom ključa koja nedostaje u ovoj instalaciji ili nema oblik koji njena kolona zahtijeva. Zapis napretka navodi referencu (npr. env:QUIRE_MASTER_KEY:v0 (unreadable)). Vratite ključ u QUIRE_MASTER_KEY_RETIRED i ponovo pokrenite rotaciju; ako je ključ trajno izgubljen, zamolite administratora organizacije da ponovo unese pristupni podatak koji će se tada zapečatiti aktuelnim ključem. Neuspjela rotacija navodi grešku u zapisu; uklonite uzrok i ponovo je zatražite.
Ključevi za potpisivanje
Nezavisno od glavnog ključa, svaka organizacija potpisuje vlastite OpenID Connect tokene i LTI poruke svojim RSA ključem objavljenim na /.well-known/jwks.json. Ovdje operater ne treba ništa poduzimati. Satni zadatak platform.signing_keys objavljuje sljedeći ključ sedam dana prije isteka devedesetodnevnog važenja aktuelnog ključa; sedmicu poslije sljedeći počinje potpisivati, a stari prelazi u povlačenje; nakon još 90 dana stari se briše i uklanja iz skupa ključeva. Svaki korak evidentira se kao platform/signing_key_advance u revizorskom lancu platforme.
Da biste ranije zamijenili ključ organizacije, npr. nakon njegovog otkrivanja:
- u konzoli: Security, Master key, Publish a new signing key (potrebno je
platform/keys_manage); ili - u shellu s okruženjem workera:
bun run kek:rotate signing-keys rotate --tenant <slug or id> --reason "Key exposed, INC-3310".bun run kek:rotate signing-keys statusprikazuje fazu ključa za svaku organizaciju.
Novi ključ objavljuje se odmah i počinje potpisivati nakon sedam dana, kada se aktuelni povuče. Sedmica je namjerna: oslanjajuće strane keširaju skup ključeva, pa bi kraće preklapanje istovremeno pokvarilo sve alate. Povučeni ključ ostaje u skupu još 90 dana da bi se i dalje provjeravali tokeni koje je već potpisao. Ako nakon otkrivanja treba ranije prestati vjerovati ključu, njegov red se briše direktnim pristupom operatera bazi i uz vlastitu evidenciju promjene (hitni pristup je samo za čitanje); tada verifikacija tokena potpisanih tim ključem ne uspijeva. Prisilna rotacija bilježi se kao platform/signing_key_rotate u revizorskom lancu, uz razlog. Workeru trebaju iste postavke QUIRE_MASTER_KEY kao web sloju da bi omotao novi ključ; komanda bun run kek:rotate za glavni ključ ponovo omotava i ključeve za potpisivanje (oauth_signing_key se nalazi u SEALED_STORES).
Hitni produkcijski pristup
Niko nema stalni pristup produkciji. Kada nešto ne može čekati, vlasnik izdaje privremeno hitno odobrenje u Platform konzoli: Security, Break-glass access.
- Odobrenje ima opseg (jedna organizacija ili registar platforme), razlog od najmanje 20 znakova koji navodi incident ili tiket i period od 5 do 240 minuta. Ističe automatski i provjerava se pri svakoj naredbi.
- Može ga dobiti vlasnik koji ga izdaje ili drugi vlasnik (postupak s dvije osobe). Koristi ga samo osoba kojoj je izdato. Izdavanje zahtijeva
platform/break_glass_issue, a korištenjeplatform/break_glass_use; prema podrazumijevanim postavkama oba su prava samo za vlasnike. - Naredbe se izvršavaju kroz gateway, ne prijavom u bazu: samo za čitanje, jedna po jedna, ograničene na organizaciju ili kontrolni registar, uz vremensko ograničenje od pet sekundi i najviše 500 redova. Binarne vrijednosti prikazuju se prema veličini.
- Revizorski lanac platforme bilježi izdavanje s razlogom, opoziv, svaku naredbu prije izvršenja (
platform/break_glass_statement; odbijene imaju ishoddenied) i svaki rezultat (platform/break_glass_result).ops.break_glass_statementsadrži ID-jeve revizorskih stavki kako bi se zapis izdavanja povezao s njima. - Upis nije dostupan. Promjenu koja ne može čekati izdanje provodi operater vlastitim pristupom bazi i u zasebnom zapisu o promjeni, izvan ovog proizvoda; taj zapis treba navesti isti ID incidenta.
Zašto se ne izdaju pristupni podaci za bazu: Postgres prijava traje duže od sesije koja ju je zatražila, zaobilazi row-level security na koju se aplikacija oslanja i ne može zapisati u revizorski lanac ovog proizvoda. Naredbe bi se evidentirale samo ako je neko isporučio serverski dnevnik. Gateway čini revizorski trag osobinom samog pristupa, a ne postupkom oko njega.
Da biste odgovorili na revizorski zahtjev: izlistajte odobrenja za traženi period (Break-glass access), otvorite historiju odobrenja da vidite naredbe i ID-jeve revizorskih zapisa, pa ih pročitajte u revizorskom lancu platforme (bun run audit:verify --platform potvrđuje cjelovitost lanca).