Kontrollerne i afsnit 14 i 21-compliance.md, som en revisor beder om ved navn. Denne side beskriver fremgangsmåden; de optegnelser, den producerer, er dokumentationen.
Nøglerne
Hver gemt legitimationsoplysning forsegles med en ny datakrypteringsnøgle (DEK). DEK’en
indpakkes af hovednøglen (KEK), og hovednøglens reference gemmes ved siden af den (key_ref eller referencen i en pakket værdi). Rotation
af hovednøglen indpakker DEK’erne igen. Den dekrypterer eller krypterer aldrig en legitimationsoplysning på ny.
| Indstilling | Betydning |
|---|---|
QUIRE_MASTER_KEY |
Den aktuelle hovednøgle: 32 byte, base64. Alle nye hemmeligheder indpakkes med den |
QUIRE_MASTER_KEY_VERSION |
Dens versionsetiket. v1, hvis den ikke er angivet. Forøg den, hver gang du ændrer nøglen |
QUIRE_MASTER_KEY_RETIRED |
Tidligere nøgler, som gemte hemmeligheder stadig kan være indpakket med, som v1=<base64>,v0=<base64>. Kun til læsning, aldrig skrivning |
Weblaget, worker og kommandoen bun run kek:rotate læser de samme tre
indstillinger. De skal alle have samme værdier, ellers kan en komponent ikke åbne det,
en anden har forseglet.
Uden QUIRE_MASTER_KEY bruger hvert delsystem den nøgle, det udleder af
QUIRE_SECRET_KEY. Det fungerer, siden Systemstatus viser tilstanden som forringet,
og data forbliver læsbare, efter du indstiller en hovednøgle. Sådan flytter den første rotation
alt væk fra den afledte nøgle. Alle, der kan læse procesmiljøet, kan dekryptere
alle gemte legitimationsoplysninger, så en produktionsinstallation bør have en hovednøgle,
der opbevares i et hemmelighedslager og ikke i samme backup som databasen.
Rotation
Nøglens alder vises i platformskonsollen under Sikkerhed, Hovednøgle og som metrikken
quire.secrets.master_key.age (dage). Den daglige tidsplan platform.key_age (03.41 UTC)
skriver en påmindelse i platformens auditkæde, når nøglen er 365
dage gammel, og igen hver 30. dag, indtil den roteres. Rotér, når du får påmindelsen, og når som helst en nøgle kan være blevet eksponeret.
- Generér den nye nøgle:
openssl rand -base64 32. - Sæt
QUIRE_MASTER_KEYtil den, og sætQUIRE_MASTER_KEY_VERSIONtil den næste etiket (v2). Flyt den gamle nøgle tilQUIRE_MASTER_KEY_RETIREDsomv1=<old base64>. Opbevar kopier af begge et andet sted end på denne vært. - Udrul weblaget og worker med de nye indstillinger. Nye hemmeligheder indpakkes nu
med
env:QUIRE_MASTER_KEY:v2; ældre hemmeligheder kan stadig åbnes med den udfasede nøgle. - Anmod om rotationen med den begrundelse, der skal stå i auditsporet:
- i konsollen: Sikkerhed, Hovednøgle, Rotér hovednøglen; eller
- i en shell med det samme miljø:
bun run kek:rotate request --reason "Annual rotation, ticket SEC-114".
- Worker indpakker en portion i minuttet (schedulerens tidsplan
platform.key_rotation) og fortsætter efter genstart. Hvis du vil gøre det hele i én omgang:bun run kek:rotate run. Følg status medbun run kek:rotate status. - Når posten viser, at rotationen er gennemført med nul uløste og nul fejl, skal du fjerne den udfasede nøgle fra
QUIRE_MASTER_KEY_RETIREDog udrulle igen. Behold den indtil da: En værdi, den ikke kunne flytte, er stadig indpakket med den gamle nøgle.
Hvad jobbet gennemgår
Alle lagre med en indpakket DEK: dem i SEALED_STORES
(apps/worker/src/key-rotation.ts). Lagre i kontroldatabasen gennemgås i kontroldatabasen; organisationslagre gennemgås én organisation ad gangen under
row-level security i den database, der indeholder organisationen, så en lejer, der er fastlåst til en dedikeret database, roteres dér. En test fejler, når
skemaet får en indpakket nøglekolonne, som listen ikke nævner, og en anden test fejler, når
gennemgangen af legitimationsoplysninger klassificerer en forseglet kolonne, som listen overser.
Optegnelsen
ops.key_rotation: én række pr. rotation med dens begrundelse, hvem der anmodede om den, dens status og totaler (indpakket igen, allerede aktuel, uløst, mislykket).ops.key_rotation_progress: én række pr. lager og omfang, når det er gennemgået, med de nøglereferencer, det ikke kunne læse, og antallet af værdier under hver. En genoptaget rotation springer disse over.- Platformens auditkæde:
platform/key_rotation_request(med begrundelsen), énplatform/key_rotation_storepr. lager med optællingerne ogplatform/key_rotation_completeellerplatform/key_rotation_fail;platform/key_age_reminderfor påmindelsen. - Metrikker:
quire.secrets.master_key.ageogquire.secrets.rewrap.outstanding(værdier, som den seneste rotation ikke kunne flytte).
Når værdier ikke kan løses
En værdi kan ikke løses, hvis den er indpakket med en nøglerreference, denne installation ikke
har, eller hvis den ikke har den form, kolonnen angiver. Statusposten angiver referencen
(for eksempel env:QUIRE_MASTER_KEY:v0 (unreadable)). Gendan den nøgle i
QUIRE_MASTER_KEY_RETIRED, og kør en ny rotation. Hvis nøglen er tabt for
altid, skal organisationens administrator indtaste legitimationsoplysningen igen:
så forsegles den med den aktuelle nøgle. Mislykkede rotationer viser fejlen på
posten; ret årsagen, og anmod igen.
Signeringsnøgler
Adskilt fra hovednøglen: Hver organisation signerer sine OpenID Connect-tokens
og LTI-meddelelser med sin egen RSA-nøgle, der offentliggøres på /.well-known/jwks.json.
Operatøren behøver ikke foretage sig noget. Den timebaserede tidsplan platform.signing_keys
offentliggør en efterfølger syv dage før den nuværende nøgle fylder halvfems dage. En uge senere begynder efterfølgeren at signere, og den gamle nøgle bliver udfaset. Halvfems
dage derefter slettes den gamle nøgle og fjernes fra nøglesamlingen. Hvert trin er en
platform/signing_key_advance-post i platformens auditkæde.
Hvis du vil udskifte en organisations nøgle før tid, for eksempel efter en eksponering:
- i konsollen: Sikkerhed, Hovednøgle, Udgiv en ny signeringsnøgle (kræver
platform/keys_manage); eller - i en shell med workers miljø:
bun run kek:rotate signing-keys rotate --tenant <slug or id> --reason "Key exposed, INC-3310".bun run kek:rotate signing-keys statusviser alle organisationers nøgler efter trin.
Den nye nøgle offentliggøres med det samme og begynder at signere efter syv dage, når den
nuværende nøgle udfases. Ventetiden er bevidst: Modtagere cacher nøglesamlingen,
og et kortere overlap får alle værktøjer til at fejle på samme tid. Den udfasede nøgle forbliver i nøglesamlingen i halvfems dage mere, så tokens, den allerede har signeret, fortsat kan valideres. Hvis en eksponering betyder, at den ikke længere må betros, kan rækken slettes med operatørens egen databaseadgang under en ændringspost (nødadgang giver kun læseadgang), hvorefter tokens signeret med den fejler validering. Den tvungne rotation registreres som platform/signing_key_rotate i auditkæden med begrundelsen. Worker skal bruge de samme QUIRE_MASTER_KEY-indstillinger som weblaget for at indpakke den nye nøgle; bun run kek:rotate til hovednøglen indpakker signeringsnøgler igen sammen med alt andet (oauth_signing_key findes i SEALED_STORES).
Nødadgang til produktion
Ingen har permanent adgang til produktion. Når noget ikke kan vente, udsteder en ejer en nødadgangstilladelse: Platformskonsol, Sikkerhed, Nødadgang.
- Tilladelsen gælder et omfang (én organisation eller platformregistret), har en begrundelse på mindst 20 tegn, der angiver hændelsen eller sagsnummeret, og et tidsrum på 5 til 240 minutter. Den udløber automatisk: Den kontrolleres mod uret ved hver sætning.
- Den kan udstedes til ejeren, der udsteder den, eller til en anden ejer (to-personers
godkendelse). Kun den person, tilladelsen er udstedt til, kan bruge den. Udstedelse kræver
platform/break_glass_issue, og brug kræverplatform/break_glass_use; begge er som standard kun for ejere. - Sætninger udføres gennem gatewayen, ikke med et database-login: skrivebeskyttet, én ad gangen, begrænset til organisationen eller kontrolregistret, med en timeout på fem sekunder og højst 500 rækker. Binære værdier vises med deres størrelse.
- Platformens auditkæde registrerer udstedelsen (med begrundelsen), tilbagekaldelsen,
hver sætning før den køres (
platform/break_glass_statement; afviste sætninger får resultatetdenied) og hvert resultat (platform/break_glass_result).ops.break_glass_statementindeholder id’erne for auditposterne, så udstedelsesposten kan sammenkobles med dens auditposter. - Skrivning tilbydes ikke. En ændring, der ikke kan vente på en udgivelse, foretages med operatørens egen databaseadgang under sin egen ændringspost uden for dette produkt, og posten bør henvise til det hændelsesnummer, der bruges her.
Hvorfor ikke udstede databaselegitimationsoplysninger? Et Postgres-login varer længere end den session, der bad om det, omgår den row-level security, applikationen er afhængig af, og kan ikke skrive til produktets auditkæde. Derfor ville sætninger kun blive auditeret, så langt som nogen havde sendt serverloggen. Gatewayen gør auditsporet til en egenskab ved adgangen i stedet for en praksis omkring den.
Hvis du skal besvare en revisionsanmodning: Find tilladelserne fra perioden under Nødadgang,
åbn en tilladelses historik for at se dens sætninger og auditpost-id’er, og læs disse
poster i platformens auditkæde (bun run audit:verify --platform beviser, at
kæden er intakt).