---
title: "Master-Schlëssel- a Signéierungsschlëssel-Rotatioun, an Notfallzougrëff"
description: "De Master-Schlëssel rotéieren, deen d'gespäicherten Zougangsdaten schützt, a mam Notfallzougrëff schaffen."
image: "https://docs.quirelms.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.quirelms.com/lb/llms.txt
> Use this file to discover all available pages before exploring further.

# Master-Schlëssel- a Signéierungsschlëssel-Rotatioun, an Notfallzougrëff

<span id="master-key-and-signing-key-rotation-and-break-glass-access"></span>

D'Kontrollen an 21-compliance.md Kapitel 14, no deenen en Auditéierer nom Numm freet. Dës Säit ass d'Prozedur; d'Akten, déi se produzéiert, sinn de Beweis.

## Déi Schlësselen <!--quire:the-keys-->

All gespäichert Zougangsdaten gëtt mat engem frësche Donnéeëverschlëselungsschlëssel (DEK) versigéiert. De DEK gëtt vum Master-Schlëssel (dem KEK) gewéckelt, an d'Referenz vum Master-Schlëssel gëtt nieft him gespäichert (`key_ref`, oder d'Referenz bannendrem engem gepackten Wäert). Wann een den Master-Schlëssel dréit, ginn d'DEKs nei gewéckelt. En entschlësselt ni eng Zougangsdaten a verschlësselt se ni nei.

| Astellung | Bedeitung |
| --- | --- |
| `QUIRE_MASTER_KEY` | Den aktuelle Master-Schlëssel: 32 Bytes, base64. All neit Geheimnis gëtt doënner gewéckelt |
| `QUIRE_MASTER_KEY_VERSION` | Seng Versiounsbezeechnung. `v1` wann net gesat. Héicht en, wann Dir den Schlëssel ännert |
| `QUIRE_MASTER_KEY_RETIRED` | Méi al Schlësselen, op deenen nach Geheimnisser stinn, kënne drop gëllen, wéi `v1=<base64>,v0=<base64>`. Nu gelies, ni geschriwwen |

De Web-Tier, de Worker an d'Kommando `bun run kek:rotate` liesen déi selwecht dräi Astellungen. Si musse all déi selwecht Wäerter hunn, soss kann een vun hinne net opmaachen, wat en aneren versigéiert huet.

Ouni `QUIRE_MASTER_KEY` hält all Ënnersystem deen Schlëssel, deen en aus `QUIRE_SECRET_KEY` ofleet. Dat funktionéiert, d'Säit fir d'Systemgesondheet weist en als degradéiert, an se bleiwen nach dem Setzen vum Master-Schlëssel liesbar, an esou bréngt déi éischt Rotatioun all Wäerter dovu weg. Jiddereen, deen d'Prozessëmwelt liese kann, kann all gespäichert Zougangsdaten entschlësselen, sou datt eng Produktiouns-Installatioun en Master-Schlëssel sollt hunn, geholl an engem Geheimnisspäicher an net an deemselwechter Backup wéi d'Datebank.

## Dréinen <!--quire:rotating-->

D'Alter vum Schlëssel gesäit een an der Plattformkonsol, Sécherheet, Master-Schlëssel, an als Metrik `quire.secrets.master_key.age` (Deeg). De dagleche Plang `platform.key_age` (03:41 UTC) schreift eng Erënnerungs-Entrée an d'Plattform-Auditkette, wann de Schlëssel 365 Deeg erreecht huet, an nach eng Kéier all 30 Deeg, bis en rotéiert gëtt. Rotéiert no der Erënnerung, an ëmmer, wann een Schlëssel kompromittéiert kéint sinn.

1. Generéiert den neien Schlëssel: `openssl rand -base64 32`.
2. Setzt `QUIRE_MASTER_KEY` dofir an `QUIRE_MASTER_KEY_VERSION` op déi nächst
   Bezeechnung (`v2`). Huwt den ale Schlëssel op `QUIRE_MASTER_KEY_RETIRED`
   als `v1=<old base64>`. Halt eng Kopie vun all zwee irgendwou anescht wéi
   op dësem Server.
3. Depotéiert de Web-Tier an den Worker mat deenen neien Astellungen. Nei
   Geheimnisser sinn elo ënner `env:QUIRE_MASTER_KEY:v2` gewéckelt; al
   kënne sech nach iwwer de pensionéierte Schlëssel opgemaach ginn.
4. Froen d'Rotatioun un, mat dem Grond, deen an der Auditkette wäert stoen:
   - an der Konsol: Sécherheet, Master-Schlëssel, Master-Schlëssel dréinen;
     oder
   - op enger Shell mat der selwechter Ëmwelt:
     `bun run kek:rotate request --reason "Annual rotation, ticket SEC-114"`.
5. De Worker wéckelt all Minutt e Stéck nei (mam `platform.key_rotation`-Plang
   vum Scheduler) a féiert weider no engem Neistart. Fir et ouni ze stoen
   fäerig ze maachen: `bun run kek:rotate run`. Kuckt et mat
   `bun run kek:rotate status` un.
6. Wann an den Opzeechnunge steet, datt d'Rotatioun fäerig ass mat **null
   ongeléist an null feelgeschloen**, hëllt den pensionéierte Schlëssel aus
   `QUIRE_MASTER_KEY_RETIRED` eraus an depotéiert nei. Bis dohinner bleift
   en dran: e Wäert, deen nach ënner dem ale Schlëssel gewéckelt ass.

### Wat de Job duergeet <!--quire:what-the-job-walks-->

All Späicher, deen en gewéckelten DEK hält: déi an `SEALED_STORES` (`apps/worker/src/key-rotation.ts`). Späicher vun der Kontroll-Datebank ginn op der Kontroll-Datebank iwwerpréift; Späicher vun enger Organisatioun ginn een nom aneren, ënner Sécherheet op Zeilniveau, an där Datebank iwwerpréift, wou d'Organisatioun läit, sou datt e Tenant, deen op enger dedikéierter Datebank festgeluecht ass, an där Datebank rotéiert gëtt. En Test feelt, wann den Schema eng Sëll fir gewéckelt Schlësselen derbäikritt, déi d'Lëschte net nennt, an en aneren feelt, wann d'Kontroll vun de Zougangsdaten eng versigéiert Sëll verpasst.

### D'Opzeechnunge <!--quire:the-record-->

- `ops.key_rotation`: eng Zeil pro Rotatioun, mam Grond, wien se ugefrot
  huet, sengem Zoustand an senge Totalen (nei gewéckelt, schonn aktuell,
  ongeléist, feelgeschloen).
- `ops.key_rotation_progress`: eng Zeil pro Späicher a Beräich, nodeems en
  duergaangen ass, mat de Referenzen op d'Schlësselen, déi en net liese
  konnt, a mat wéi vill Wäerter ënner all eenzelne. Eng Rotatioun, déi
  weidergefouert gëtt, sprëngt dës iwwer.
- Plattform-Auditkette: `platform/key_rotation_request` (mat dem Grond),
  eng `platform/key_rotation_store` pro Späicher mat senge Zuelen, an
  `platform/key_rotation_complete` oder `platform/key_rotation_fail`;
  `platform/key_age_reminder` fir d'Erënnerung.
- Metriken: `quire.secrets.master_key.age` an
  `quire.secrets.rewrap.outstanding` (Wäerter, déi déi lescht Rotatioun net
  konnt iwwerbréngen).

### Wann Wäerter ongeléist sinn <!--quire:when-values-are-unresolved-->

En ongeléiste Wäert ass ënner enger Schlësselreferenz gewéckelt, déi dës Installatioun net huet, oder en ass net sou, wéi seng Sëll et versprécht. D'Opzeechnung fir de Fortschrëtt nennt d'Referenz (zum Beispill `env:QUIRE_MASTER_KEY:v0 (unreadable)`). Hëllt dësen Schlëssel zréck an `QUIRE_MASTER_KEY_RETIRED` a féiert eng aner Rotatioun aus, oder, wann de Schlëssel fir ëmmer verluer ass, loosst den Administrator vun der Organisatioun d'Zougangsdaten nach eng Kéier anzedroen: se gëtt dann ënner dem aktuellen Schlëssel versigéiert. Feelgeschloen Rotatiounen weisen hir Feeler an der Opzeechnung; fixt d'Ursaach a froe nach eng Kéier un.

## Signéierungsschlësselen <!--quire:signing-keys-->

Getrennt vum Master-Schlëssel: all Organisatioun signéiert hir OpenID-Connect-Token an hir LTI-Noriichten mat hirem eegenem RSA-Schlëssel, publizéiert ëm `/.well-known/jwks.json`. Héi brauch keen Betreiber eppes. De stündleche Plang `platform.signing_keys` publizéiert en Nofolger 7 Deeg ier déi 90 Deeg vum aktuellen Schlëssel aus sinn, eng Woch duerno fänkt den Nofolger un ze signéieren an de ale Schlëssel gëtt pensionéiert, an 90 Deeg duerno gëtt de ale Schlëssel geläscht a vum Schlësseleset geholl. All Schrëtt ass eng `platform/signing_key_advance`-Entrée op der Plattform-Auditkette.

Fir de Schlëssel vun enger Organisatioun méi fréi zeersetzen, z. B. wann e Schlëssel kompromittéiert war:

- an der Konsol: Sécherheet, Master-Schlëssel, Neie Signéierungsschlëssel
  publizéieren (braucht `platform/keys_manage`); oder
- op enger Shell mat der Ëmwelt vum Worker:
  `bun run kek:rotate signing-keys rotate --tenant <slug or id> --reason "Key exposed, INC-3310"`.
  `bun run kek:rotate signing-keys status` list d'Schlësselen vun all
  Organisatioun no Stuf.

De neie Schlëssel gëtt op eemol publizéiert an fänkt no 7 Deeg un ze signéieren, wann de aktuelle Schlëssel pensionéiert gëtt. D'Woch ass bewosst: d'Parteien, déi vertrauen, halen de Schlësseleset am Cache, an eng méi kuerz Iwwerschneidung bréicht all Tool op eemol. De pensionéierte Schlëssel bleift nach 90 Deeg am Schlësseleset, sou datt Token, déi en scho signéiert huet, weiderhin verifizéiert kënne ginn; wann dat heescht, datt en net méi vertraut därf ginn, ass seng Zeil ze läschen eng Ännerung, déi mam eegenen Datebankzougrëff vum Betreiber ënner engem Ännerungsdossier gemaach gëtt (Notfallzougrëff ass nëmmen liesbar), an Token, déi mat him signéiert sinn, feelen dann bei der Verifizéierung. D'gezwongen Rotatioun ass `platform/signing_key_rotate` an der Auditkette, mat dem Grond. De Worker braucht déiselwecht `QUIRE_MASTER_KEY`-Astellungen wéi de Web-Tier, fir den neien Schlëssel ze wéckelen; `bun run kek:rotate` fir de Master-Schlëssel wéckelt Signéierungsschlësselen mat allem aneren nei (`oauth_signing_key` ass an `SEALED_STORES`).

## Notfallzougrëff op d'Produktioun <!--quire:break-glass-production-access-->

Keen huet permanenten Zougrëff op d'Produktioun. Wann eppes net ka waarten, gëtt e Verantwortlecher eng Notfall-Genehmegung: Plattformkonsol, Sécherheet, Notfallzougrëff.

- Eng Genehmegung huet en Beräich (eng Organisatioun, oder d'Registratur
  vun der Plattform), eng Ursaach vun mindestens 20 Zeichen, déi den
  Incident oder den Ticket nennt, an e Fënster vun 5 bis 240 Minutten. En
  verfält selwer: en gëtt bei all Usproch géint d'Auer kontrolléiert.
- Se kann dem Verantwortlechen ginn, deen en ausgëtt, oder engem anere
  Verantwortlechen (déi Aart mat zwee Leit). Nëmmen d'Persoun, déi se
  kritt huet, kann se benotzen. Ausstellen braucht
  `platform/break_glass_issue` an Benotzen braucht
  `platform/break_glass_use`; béid sinn standardméisseg nëmmen fir
  Verantwortlecher.
- D'Usprochen laufen iwwer de Gateway, net op enger Datebank-Umeldung:
  nëmmen Liesen, een nom aneren, ageschränkt op d'Organisatioun oder op
  d'Kontrollregistratur, mat engem Timeout vu fënnef Sekonnen an héichstens
  500 Zeilen. Binärwäerter ginn no Gréisst geweist.
- D'Plattform-Auditkette zeechnt dat Ausstellen (mat dem Grond), d'Zeréckhuelung,
  all Usproch iert se leeft (`platform/break_glass_statement`, refuséiert mat
  Resultat `denied`) an all Resultat (`platform/break_glass_result`).
  `ops.break_glass_statement` hält d'Audit-Entrée-IDen, sou datt d'Opzeechnung
  vum Ausstellen mat senge Audit-Entréeën verknëppelt gëtt.
- Schreiwen ginn net ugebueden. Eng Ännerung, déi net op eng Release waarte
  kann, benotzt den eegenen Datebankzougrëff vum Betreiber ënner sengem
  eegenem Ännerungsdossier, ausserhalb vun dësem Produit, an d'Opzeechnung
  sollt d'Referenz zitéieren, déi hei benotzt gëtt.

Firwat keng Zougangsdaten fir d'Datebank ausginn: eng Postgres-Umeldung iwwerlieft d'Sessioun, déi se gefrot huet, ëmgitt d'Sécherheet op Zeilniveau, op déi d'Applikatioun vertraut, an kann net an d'Auditkette vun dësem Produit schreiwen, sou datt seng Usprochen nëmmen sou wäit auditéiert gi wéi de Serverlog et erfaasst. De Gateway mécht d'Auditkette zu enger Eigenchaft vum Zougrëff an net ëm eng Praxis ronderëm en.

Wann een no engem Audit freet: weist d'Genehmegungen an der Period un (Notfallzougrëff), opet d'Geschicht vun enger Genehmegung fir seng Usprochen an d'Audit-Entrée-IDen, a liest déi Entréeën op der Plattform-Auditkette (`bun run audit:verify --platform` beweist, datt d'Kette intakt ass).

Source: https://docs.quirelms.com/lb/ops/key-rotation/index.mdx
