---
title: "Περιστροφή κύριου και κλειδιού υπογραφής και πρόσβαση έκτακτης ανάγκης"
description: "Περιστρέψτε το κύριο κλειδί που προστατεύει αποθηκευμένα διαπιστευτήρια και χρησιμοποιήστε την πρόσβαση έκτακτης ανάγκης."
image: "https://docs.quirelms.com/og.png"
---

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

# Περιστροφή κύριου και κλειδιού υπογραφής και πρόσβαση έκτακτης ανάγκης

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

Οι έλεγχοι της ενότητας 14 του 21-compliance.md που ζητούν ονομαστικά οι ελεγκτές. Αυτή η σελίδα περιγράφει τη διαδικασία· τα αρχεία που παράγει αποτελούν τα αποδεικτικά στοιχεία.

## Τα κλειδιά <!--quire:the-keys-->

Κάθε αποθηκευμένο διαπιστευτήριο σφραγίζεται με νέο κλειδί κρυπτογράφησης δεδομένων (DEK). Το DEK περιτυλίγεται από το κύριο κλειδί (KEK), ενώ η αναφορά του κύριου κλειδιού αποθηκεύεται δίπλα του (`key_ref` ή ως αναφορά μέσα σε συσκευασμένη τιμή). Η περιστροφή του κύριου κλειδιού περιτυλίγει ξανά τα DEK. Δεν αποκρυπτογραφεί ούτε κρυπτογραφεί ξανά κάποιο διαπιστευτήριο.

| Ρύθμιση | Σημασία |
| --- | --- |
| `QUIRE_MASTER_KEY` | Το τρέχον κύριο κλειδί: 32 byte, base64. Κάθε νέο μυστικό περιτυλίγεται με αυτό |
| `QUIRE_MASTER_KEY_VERSION` | Η ετικέτα έκδοσής του. `v1` αν δεν έχει οριστεί. Αυξήστε την κάθε φορά που αλλάζετε κλειδί |
| `QUIRE_MASTER_KEY_RETIRED` | Παλαιότερα κλειδιά που μπορεί ακόμη να χρησιμοποιούνται για αποθηκευμένα μυστικά, όπως `v1=<base64>,v0=<base64>`. Χρησιμοποιούνται μόνο για ανάγνωση |

Ο web tier, ο worker και η εντολή `bun run kek:rotate` διαβάζουν τις ίδιες τρεις ρυθμίσεις. Πρέπει να έχουν όλες ίδιες τιμές, αλλιώς κάποια από τις υπηρεσίες δεν θα μπορεί να ανοίξει ό,τι σφράγισε κάποια άλλη.

Χωρίς `QUIRE_MASTER_KEY`, κάθε υποσύστημα διατηρεί το κλειδί που παράγει από το `QUIRE_SECRET_KEY`. Αυτό λειτουργεί, η σελίδα κατάστασης συστήματος το εμφανίζει ως υποβαθμισμένο και το κλειδί παραμένει αναγνώσιμο αφού ορίσετε κύριο κλειδί· έτσι η πρώτη περιστροφή μεταφέρει τα πάντα από αυτό. Όποιος μπορεί να διαβάσει το περιβάλλον διεργασίας μπορεί να αποκρυπτογραφήσει κάθε αποθηκευμένο διαπιστευτήριο. Γι' αυτό μια εγκατάσταση παραγωγής πρέπει να έχει κύριο κλειδί σε χώρο αποθήκευσης μυστικών και όχι στο ίδιο αντίγραφο ασφαλείας με τη βάση δεδομένων.

## Περιστροφή <!--quire:rotating-->

Η ηλικία του κλειδιού εμφανίζεται στην κονσόλα πλατφόρμας, στην ενότητα Security, Master key και ως μέτρηση `quire.secrets.master_key.age` (ημέρες). Το καθημερινό πρόγραμμα `platform.key_age` (03:41 UTC) γράφει υπενθύμιση στην αλυσίδα ελέγχου της πλατφόρμας όταν το κλειδί φτάσει τις 365 ημέρες και ξανά κάθε 30 ημέρες μέχρι να περιστραφεί. Κάντε την περιστροφή όταν λάβετε υπενθύμιση και κάθε φορά που ένα κλειδί μπορεί να έχει εκτεθεί.

1. Δημιουργήστε νέο κλειδί: `openssl rand -base64 32`.
2. Ορίστε το `QUIRE_MASTER_KEY` στη νέα τιμή και το `QUIRE_MASTER_KEY_VERSION` στην επόμενη ετικέτα (`v2`). Μεταφέρετε το παλιό κλειδί στο `QUIRE_MASTER_KEY_RETIRED` ως `v1=<old base64>`. Κρατήστε αντίγραφο και των δύο σε διαφορετικό σημείο από αυτόν τον host.
3. Αναπτύξτε τον web tier και τον worker με τις νέες ρυθμίσεις. Τα νέα μυστικά περιτυλίγονται πλέον με `env:QUIRE_MASTER_KEY:v2`· τα παλιά εξακολουθούν να ανοίγουν μέσω του αποσυρμένου κλειδιού.
4. Ζητήστε την περιστροφή και καθορίστε τον λόγο που θα καταγραφεί στο αρχείο ελέγχου:
   - από την κονσόλα: Security, Master key, Rotate the master key· ή
   - από shell με το ίδιο περιβάλλον: `bun run kek:rotate request --reason "Annual rotation, ticket SEC-114"`.
5. Ο worker περιτυλίγει ξανά ένα τμήμα κάθε λεπτό (πρόγραμμα `platform.key_rotation` του scheduler) και συνεχίζει μετά από επανεκκίνηση. Για να ολοκληρωθεί με μία εκτέλεση: `bun run kek:rotate run`. Παρακολουθήστε το με `bun run kek:rotate status`.
6. Όταν η εγγραφή δείξει ότι η περιστροφή ολοκληρώθηκε με **μηδέν ανεπίλυτα και μηδέν αποτυχημένα**, αφαιρέστε το αποσυρμένο κλειδί από το `QUIRE_MASTER_KEY_RETIRED` και αναπτύξτε ξανά. Μέχρι τότε κρατήστε το: όποια τιμή δεν μετακινήθηκε παραμένει περιτυλιγμένη με το παλιό κλειδί.

### Τι διατρέχει η εργασία <!--quire:what-the-job-walks-->

Κάθε χώρο αποθήκευσης που περιέχει περιτυλιγμένο DEK: εκείνους που βρίσκονται στο `SEALED_STORES` (`apps/worker/src/key-rotation.ts`). Οι χώροι αποθήκευσης της βάσης ελέγχου εξετάζονται εκεί· οι χώροι αποθήκευσης οργανισμών εξετάζονται για έναν οργανισμό κάθε φορά, υπό row-level security, στη βάση που περιέχει τον οργανισμό. Επομένως, ένας μισθωτής με αποκλειστική βάση περιστρέφεται στη δική του βάση. Μια δοκιμή αποτυγχάνει όταν το σχήμα αποκτήσει στήλη περιτυλιγμένου κλειδιού που δεν κατονομάζεται στη λίστα· μια άλλη όταν η ανασκόπηση διαπιστευτηρίων ταξινομεί σφραγισμένη στήλη που λείπει από τη λίστα.

### Η εγγραφή <!--quire:the-record-->

- `ops.key_rotation`: μία γραμμή ανά περιστροφή με τον λόγο, το άτομο που την ζήτησε, την κατάστασή της και τα σύνολα (περιτυλίχθηκαν ξανά, ήταν ήδη ενημερωμένα, ανεπίλυτα, απέτυχαν).
- `ops.key_rotation_progress`: μία γραμμή ανά χώρο αποθήκευσης και πεδίο μετά την εξέτασή του, με τις αναφορές κλειδιών που δεν μπορούσε να διαβάσει και τον αριθμό τιμών που βρίσκονταν κάτω από καθεμία. Μια περιστροφή που συνεχίζεται τις παραλείπει.
- Αλυσίδα ελέγχου πλατφόρμας: `platform/key_rotation_request` (με τον λόγο), μία εγγραφή `platform/key_rotation_store` ανά χώρο αποθήκευσης με τα σύνολά της και `platform/key_rotation_complete` ή `platform/key_rotation_fail`· για την υπενθύμιση καταγράφεται `platform/key_age_reminder`.
- Μετρήσεις: `quire.secrets.master_key.age` και `quire.secrets.rewrap.outstanding` (τιμές που δεν μπόρεσε να μετακινήσει η τελευταία περιστροφή).

### Όταν υπάρχουν ανεπίλυτες τιμές <!--quire:when-values-are-unresolved-->

Μια ανεπίλυτη τιμή είναι περιτυλιγμένη με αναφορά κλειδιού που δεν διαθέτει αυτή η εγκατάσταση ή δεν έχει τη μορφή που υπόσχεται η στήλη της. Η εγγραφή προόδου κατονομάζει την αναφορά (για παράδειγμα `env:QUIRE_MASTER_KEY:v0 (unreadable)`). Επαναφέρετε αυτό το κλειδί στο `QUIRE_MASTER_KEY_RETIRED` και εκτελέστε άλλη περιστροφή. Ή, αν το κλειδί έχει χαθεί οριστικά, ζητήστε από τον διαχειριστή του οργανισμού να εισαγάγει ξανά το διαπιστευτήριο· τότε θα σφραγιστεί με το τρέχον κλειδί. Οι αποτυχημένες περιστροφές εμφανίζουν το σφάλμα στην εγγραφή· διορθώστε την αιτία και υποβάλετε ξανά το αίτημα.

## Κλειδιά υπογραφής <!--quire:signing-keys-->

Ανεξάρτητα από το κύριο κλειδί, κάθε οργανισμός υπογράφει τα OpenID Connect token και μηνύματα LTI με δικό του κλειδί RSA, δημοσιευμένο στο `/.well-known/jwks.json`. Δεν χρειάζεται ενέργεια από τον χειριστή. Το ωριαίο πρόγραμμα `platform.signing_keys` δημοσιεύει διάδοχο επτά ημέρες πριν συμπληρωθούν οι ενενήντα ημέρες του τρέχοντος κλειδιού. Μία εβδομάδα αργότερα ο διάδοχος αρχίζει να υπογράφει και το παλιό κλειδί αποσύρεται. Ενενήντα ημέρες μετά διαγράφεται και αφαιρείται από το σύνολο κλειδιών. Κάθε βήμα καταγράφεται ως `platform/signing_key_advance` στην αλυσίδα ελέγχου της πλατφόρμας.

Για να αντικαταστήσετε νωρίτερα το κλειδί ενός οργανισμού, για παράδειγμα μετά από έκθεση:

- από την κονσόλα: Security, Master key, Publish a new signing key (απαιτεί `platform/keys_manage`)· ή
- από shell με το περιβάλλον του worker: `bun run kek:rotate signing-keys rotate
  --tenant <slug or id> --reason "Key exposed, INC-3310"`. Η εντολή `bun run kek:rotate
  signing-keys status` παραθέτει τα κλειδιά κάθε οργανισμού ανά στάδιο.

Το νέο κλειδί δημοσιεύεται αμέσως και αρχίζει να υπογράφει μετά από επτά ημέρες, όταν αποσυρθεί το τρέχον κλειδί. Η εβδομάδα είναι σκόπιμη: τα συστήματα που εμπιστεύονται τα κλειδιά αποθηκεύουν προσωρινά το σύνολό τους και μια συντομότερη επικάλυψη θα διακόψει όλα τα εργαλεία ταυτόχρονα. Το κλειδί που αποσύρεται παραμένει στο σύνολο για άλλες ενενήντα ημέρες, ώστε να συνεχίσουν να επαληθεύονται τα token που έχει ήδη υπογράψει. Αν η έκθεση απαιτεί να πάψει νωρίτερα η εμπιστοσύνη σε αυτό, η διαγραφή της γραμμής του αποτελεί αλλαγή που εκτελεί ο χειριστής με δική του πρόσβαση στη βάση και βάσει καταγραφής αλλαγής (η πρόσβαση έκτακτης ανάγκης είναι μόνο για ανάγνωση)· τότε αποτυγχάνει η επαλήθευση token που υπέγραψε το κλειδί. Η υποχρεωτική περιστροφή καταγράφεται στην αλυσίδα ελέγχου ως `platform/signing_key_rotate`, μαζί με τον λόγο. Ο worker χρειάζεται τις ίδιες ρυθμίσεις `QUIRE_MASTER_KEY` με τον web tier για να περιτυλίξει το νέο κλειδί· η εντολή `bun run kek:rotate` για το κύριο κλειδί περιτυλίγει ξανά τα κλειδιά υπογραφής μαζί με όλα τα υπόλοιπα (`oauth_signing_key` ανήκει στο `SEALED_STORES`).

## Πρόσβαση έκτακτης ανάγκης στην παραγωγή <!--quire:break-glass-production-access-->

Κανείς δεν έχει μόνιμη πρόσβαση στην παραγωγή. Όταν κάτι δεν μπορεί να περιμένει, ένας κάτοχος εκδίδει δικαίωμα έκτακτης ανάγκης: κονσόλα πλατφόρμας, Security, Break-glass access.

- Το δικαίωμα ορίζει πεδίο εφαρμογής (έναν οργανισμό ή το μητρώο της πλατφόρμας), αιτιολογία τουλάχιστον 20 χαρακτήρων που κατονομάζει συμβάν ή αίτημα υποστήριξης και χρονικό παράθυρο 5 έως 240 λεπτών. Λήγει αυτόματα: ελέγχεται με βάση το ρολόι σε κάθε εντολή.
- Μπορεί να εκδοθεί στον κάτοχο που την εκδίδει ή σε άλλον κάτοχο (διαδικασία δύο ατόμων). Μόνο το άτομο στο οποίο εκδόθηκε μπορεί να τη χρησιμοποιήσει. Η έκδοση απαιτεί `platform/break_glass_issue` και η χρήση `platform/break_glass_use`· από προεπιλογή, και τα δύο δικαιώματα περιορίζονται στους κατόχους.
- Οι εντολές εκτελούνται μέσω πύλης και όχι με σύνδεση βάσης δεδομένων: μόνο για ανάγνωση, μία κάθε φορά, περιορισμένες στον οργανισμό ή στο μητρώο ελέγχου, με χρονικό όριο πέντε δευτερολέπτων και έως 500 γραμμές. Οι δυαδικές τιμές εμφανίζονται με βάση το μέγεθός τους.
- Η αλυσίδα ελέγχου της πλατφόρμας καταγράφει την έκδοση (μαζί με την αιτιολογία), την ανάκληση, κάθε εντολή πριν εκτελεστεί (`platform/break_glass_statement`, με αποτέλεσμα `denied` για όσες απορρίπτονται) και κάθε αποτέλεσμα (`platform/break_glass_result`). Το `ops.break_glass_statement` περιέχει τα αναγνωριστικά εγγραφών ελέγχου, ώστε η εγγραφή έκδοσης να συνδέεται με αυτές.
- Δεν παρέχεται εγγραφή. Μια αλλαγή που δεν μπορεί να περιμένει έκδοση εκτελείται με την προσωπική πρόσβαση του χειριστή στη βάση δεδομένων και δική της καταγραφή αλλαγής, εκτός αυτού του προϊόντος. Η καταγραφή πρέπει να παραπέμπει στο αναγνωριστικό συμβάντος που χρησιμοποιήθηκε εδώ.

Γιατί να μην εκδοθούν διαπιστευτήρια βάσης δεδομένων: μια σύνδεση Postgres διαρκεί περισσότερο από τη συνεδρία που τη ζήτησε, παρακάμπτει την row-level security στην οποία βασίζεται η εφαρμογή και δεν μπορεί να γράψει στην αλυσίδα ελέγχου αυτού του προϊόντος. Επομένως οι εντολές της θα καταγράφονταν μόνο στον βαθμό που αποστέλλονται αρχεία καταγραφής διακομιστή. Η πύλη καθιστά το αρχείο ελέγχου ιδιότητα της πρόσβασης και όχι διαδικασία που βασίζεται σε πρακτική γύρω από αυτήν.

Για να απαντήσετε σε αίτημα ελέγχου: παραθέστε τα δικαιώματα της περιόδου (Break-glass access), ανοίξτε το ιστορικό ενός δικαιώματος για να δείτε τις εντολές και τα αναγνωριστικά εγγραφών ελέγχου του και διαβάστε αυτές τις εγγραφές στην αλυσίδα ελέγχου πλατφόρμας (`bun run audit:verify --platform` αποδεικνύει ότι η αλυσίδα είναι ακέραιη).

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