I cuntrolli in a sezzione 14 di 21-compliance.md chì un auditore dumanda per nome. Sta pagina hè a prucedura; i registri ch’ella produce sò e prove.
E chjave
Ogni credenziale cunservata hè sigillata cù una nova chjave di cifratura di dati (DEK). A
DEK hè incapsulata da a chjave maestra (KEK), è a riferenza di a chjave maestra
hè cunservata accantu (key_ref, o a riferenza ind’è un valore imballatu). Rotà
a chjave maestra incapsula di novu e DEK. Ùn decifra nè ricifra mai una credenziale.
| Paràmetru | Significatu |
|---|---|
QUIRE_MASTER_KEY |
A chjave maestra attuale: 32 byte, base64. Ogni sicretu novu hè incapsulatu cù ella |
QUIRE_MASTER_KEY_VERSION |
A so etichetta di versione. v1 s’ella ùn hè stabilita. Aumentate la ogni volta chì cambiate a chjave |
QUIRE_MASTER_KEY_RETIRED |
E chjave precedenti chì ponu sempre prutege sicreti, cum’è v1=<base64>,v0=<base64>. Solu letta, mai scritta |
U nivellu web, u worker è u cumandu bun run kek:rotate leghjenu i listessi trè
paràmetri. Devenu avè tutti i listessi valori, altrimenti unu ùn pò apre ciò chì
un altru hà sigillatu.
Senza QUIRE_MASTER_KEY, ogni sottusistema mantene a chjave derivata da
QUIRE_SECRET_KEY. Funziona, a pagina di salute di Sistema l’indica cum’è degradata, è
ferma leggibile dopu avè stabilitu una chjave maestra, ciò chì permette a prima rotazione di
spustà tuttu fora di ella. Chiunque possi leghje l’ambiente di prucessu pò decifrà
ogni credenziale cunservata, dunque un’installazione di pruduzzione deve avè una chjave maestra,
cunservata in un magazinu di sicreti è micca in a stessa copia di salvezza chè a basa di dati.
Rotazione
L’età di a chjave apparisce in a cunsola di a piattaforma, Sicurezza, Chjave maestra, è cum’è metrica
quire.secrets.master_key.age (ghjorni). A pianificazione cutidiana platform.key_age (03:41 UTC)
scrive una voce di ricordu in a catena d’audit di a piattaforma quandu a chjave ghjunghje à 365
ghjurnate, dopu ogni 30 ghjorni finu à ch’ella sia stata rotata. Fate a rotazione à u ricordu, è ogni volta chì una chjave pò esse stata esposta.
- Generate a chjave nova:
openssl rand -base64 32. - Stabilite
QUIRE_MASTER_KEYà ella èQUIRE_MASTER_KEY_VERSIONà l’etichetta successiva (v2). Spustate a chjave vechja inQUIRE_MASTER_KEY_RETIREDcum’èv1=<old base64>. Cunservate una copia di e duie in un locu fora di questu host. - Distribuite u nivellu web è u worker cù i paràmetri novi. I sicreti novi sò avà
incapsulati sottu à
env:QUIRE_MASTER_KEY:v2; quelli vechji ponu sempre esse aperti cù a chjave ritirata. - Dumandate a rotazione cù a ragione chì appariscerà in a pista d’audit:
- in a cunsola: Sicurezza, Chjave maestra, Rotate a chjave maestra; o
- in una shell cù u listessu ambiente:
bun run kek:rotate request --reason "Annual rotation, ticket SEC-114".
- U worker ricincapsula un gruppu per minutu (pianificazione
platform.key_rotationdi u scheduler) è ripiglia dopu un riavviu. Per compie la d’un colpu:bun run kek:rotate run. Seguitate la cùbun run kek:rotate status. - Quandu u registru indica chì a rotazione hè compia cù zeru irrisolti è zeru
fiaschi, cacciate a chjave ritirata da
QUIRE_MASTER_KEY_RETIREDè ridistribuite. Fin’à tandu cunservate la: un valore ch’ella ùn hà pussutu spustà hè sempre incapsulatu cù a chjave vechja.
Ciò chì u travagliu percorre
Ogni magazinu chì tene una DEK incapsulata: quelli in SEALED_STORES
(apps/worker/src/key-rotation.ts). I magazini di a basa di cuntrollu sò percorsi in a
basa di cuntrollu; i magazini d’urganizazione sò percorsi una urganizazione à volta, sottu
à a sicurezza à livellu di fila, in a basa di dati chì cuntene l’urganizazione. Cusì un tenant
fissatu à una basa di dati dedicata hè rotatu in quella basa. Un test falla quandu u
schema aghjusta una culonna di chjave incapsulata chì a lista ùn nomina, è un altru falla quandu
l’analisi di credenziali classifica una culonna sigillata chì a lista omette.
U registru
ops.key_rotation: una fila per rotazione, cù a so ragione, quale l’hà dumandata, u so statu è i so totali (ricincapsulati, digià attuali, irrisolti, falliti).ops.key_rotation_progress: una fila per magazinu è scopu una volta percorsu, cù i riferimenti di chjave ch’ùn hà pussutu leghje è u numeru di valori sottu à ognunu. Una rotazione ripresa salta questi.- Catena d’audit di a piattaforma:
platform/key_rotation_request(cù a ragione), unaplatform/key_rotation_storeper magazinu cù i so totali, èplatform/key_rotation_completeoplatform/key_rotation_fail;platform/key_age_reminderper u ricordu. - Metriche:
quire.secrets.master_key.ageèquire.secrets.rewrap.outstanding(valori chì l’ultima rotazione ùn hà pussutu spustà).
Quandu i valori ùn sò micca risolvibili
Un valore irrisolvibile hè incapsulatu cù un riferimentu di chjave chì st’installazione ùn
cuntene, o ùn hà a forma prumessa da a so culonna. U registru di prugressu nomina a
riferenza (per esempiu env:QUIRE_MASTER_KEY:v0 (unreadable)). Rimettite quella chjave
in QUIRE_MASTER_KEY_RETIRED è eseguite un’altra rotazione, o, s’è a chjave hè persa
per sempre, dumandate à l’amministratore di l’urganizazione di inserisce torna a credenziale:
allora serà sigillata cù a chjave attuale. E rotazioni fallite mostranu l’errore in u
registru; curregge a causa è dumandate torna.
Chjave di firma
Indipendentemente da a chjave maestra: ogni urganizazione firma i so gettoni OpenID Connect
où missaghji LTI cù a so propria chjave RSA, publicata in /.well-known/jwks.json.
Quì ùn ci vole nisuna intervenzione. A pianificazione oraria platform.signing_keys
publicheghja una chjave successiva sette ghjorni prima di compie i novanta ghjorni di l’attuale; una settimana
dopu, a successiva principia à firmà è a vechja diventa in ritirata; novanta
ghjurnate più tardi, a vechja hè sguassata è esce da l’inseme di chjave. Ogni passu hè una
voce platform/signing_key_advance in a catena d’audit di a piattaforma.
Per rimpiazzà prima a chjave d’una urganizazione, per esempiu dopu una esposizione:
- in a cunsola: Sicurezza, Chjave maestra, Publicà una chjave di firma nova (ci vole
platform/keys_manage); o - in una shell cù l’ambiente di u worker:
bun run kek:rotate signing-keys rotate --tenant <slug or id> --reason "Key exposed, INC-3310".bun run kek:rotate signing-keys statuselenca e chjave d’ogni urganizazione secondu u stadiu.
A chjave nova hè publicata subitu è principia à firmà dopu sette ghjorni, quandu a
chjave attuale entre in ritirata. A settimana hè intenzionale: e parti fidate tenenu in cache l’inseme di chjave,
è una sovrappusizione più corta rompe tutti i strumenti d’un colpu. A chjave in ritirata ferma in l’inseme
per novanta ghjorni in più, affinchì i gettoni digià firmati cun ella cuntinuinu à esse verificati; s’è
l’esposizione impone di ùn fidassi più d’ella prima, sguassà a so fila hè un cambiamentu
fattu cù l’accessu propiu di l’operatore à a basa di dati sottu à un registru di cambiamentu (l’accessu
d’urgenza hè solu di lettura), è tandu i gettoni firmati cun ella ùn passanu più a verifica. A
rotazione furzata hè platform/signing_key_rotate in a catena d’audit, cù a
ragione. U worker hà bisognu di i listessi paràmetri QUIRE_MASTER_KEY cum’è u nivellu web per
incapsulà a chjave nova; bun run kek:rotate per a chjave maestra ricincapsula e chjave
di firma cù tuttu u restu (oauth_signing_key hè in SEALED_STORES).
Accessu d’urgenza à pruduzzione
Nimu ùn hà un accessu permanente à pruduzzione. Quandu qualcosa ùn pò aspettà, un pruprietariu emette una cuncessione d’urgenza: cunsola di a piattaforma, Sicurezza, Accessu d’urgenza.
- Una cuncessione hà un scopu (una urganizazione, o u registru di a piattaforma), una ragione d’almenu 20 caratteri chì nomina l’incidente o u bigliettu, è una finestra da 5 à 240 minuti. Scade da per ella: hè verificata contr’à l’ora à ogni dichjarazione.
- Pò esse emessa à u pruprietariu chì l’emettera o à un altru pruprietariu (a forma à duie persone).
Solu a persona à quale hè stata emessa pò aduprà la. Per emette ci vole
platform/break_glass_issueè per aduprà ci voleplatform/break_glass_use; per predefinitu, tramindui sò riservati à i pruprietarii. - E dichjarazioni passanu per a porta d’accessu, micca per un login di basa di dati: solu lettura, una à volta, cunfinate à l’urganizazione o à u registru di cuntrollu, cù un timeout di cinque seconde è à u più 500 filari. I valori binarii sò mustrati secondu a so dimensione.
- A catena d’audit di a piattaforma registra a cuncessione (cù a ragione), a revoca,
ogni dichjarazione prima ch’ella si eseguisca (
platform/break_glass_statement, e dichjarazioni ricusate anu u risultatudenied) è ogni risultatu (platform/break_glass_result).ops.break_glass_statementcuntene l’ID di e voce d’audit, dunque u registru di cuncessione hè ligatu à e so voci d’audit. - E scritture ùn sò micca pruposte. Un cambiamentu chì ùn pò aspettà una versione usa l’ accessu propiu di l’operatore à a basa di dati sottu à u so registru di cambiamentu, fora di stu pruduttu, è u registru deve cità a riferenza d’incidente aduprata quì.
Perchè ùn dà credenziali di basa di dati: un login Postgres dura più chè a sessione chì l’hà dumandatu, elude a sicurezza à livellu di fila nantu à a quale s’appoghja l’applicazione, è ùn pò scrive in a catena d’audit di stu pruduttu, dunque e so dichjarazioni serianu verificabili solu finu à u registru di servitore chì qualchissia hà mandatu. A porta d’accessu face di a pista d’audit una pruprietà di l’accessu, micca una pratica fatta intornu à ellu.
Per risponde à una dumanda d’audit: elencate e cuncessioni di u periodu (Accessu d’urgenza),
aprite a storia d’una cuncessione per e so dichjarazioni è l’ID di e voce d’audit, è leghjite quelle
voci in a catena d’audit di a piattaforma (bun run audit:verify --platform prova chì a
catena hè intatta).