Gli aggiornamenti non presidiati sono una politica ragionevole per un server che raggiungi tramite la sua VPN, e allo stesso tempo sono un unico punto di guasto che ti procuri da solo. L’operazione del pacchetto riavvia il servizio, il tunnel cade e il percorso amministrativo che stavi usando scompare con lui. Esistono due modelli di ripristino, e la scelta tra loro dipende da una condizione: se hai una via d’ingresso che non passa attraverso ciò che viene aggiornato.

Due modelli di ripristino, una condizione decisiva

Il primo modello si fida dell’aggiornamento e presuppone che potrai riconnetterti dopo. Funziona quando la VPN è una delle diverse strade per raggiungere l’host e quando il guasto del tunnel non ti toglie la capacità di diagnosticarlo. Il secondo modello predispone in anticipo un percorso indipendente, di solito la console del provider di hosting, e tratta il tunnel come la cosa che la manutenzione ha più probabilità di rompere. Entrambi i modelli sono difendibili, e solo uno dei due richiede lavoro in anticipo.

La condizione decisiva è facile da enunciare e facile da saltare. Se ogni percorso amministrativo verso la macchina passa attraverso il servizio che viene aggiornato, non hai alcun modello di ripristino, solo un’aspettativa. Dillo ad alta voce nella revisione della modifica.

Verificare quella condizione richiede dieci minuti e deve avvenire prima del primo aggiornamento non presidiato, non durante l’incidente. Apri la console mentre tutto funziona, conferma che le credenziali siano valide e richiudila. Conferma che la console si apra sull’host che pensi. Poi conferma che l’accesso che useresti davvero alle 3 del mattino funzioni ancora.

Quest’ultima parte conta più di quanto sembri. Un account della console la cui password è stata ruotata sei mesi fa e mai verificata non è un percorso di ripristino; è un documento che ne descrive uno.

Ciò che un backup non ripristina

Un archivio di configurazione è un registro di file, e un aggiornamento cambia più che file. Lo stato dei pacchetti, i moduli del kernel, i collegamenti alle unit abilitate e le regole del firewall applicate tramite uno strumento separato vivono tutti fuori dalla directory di configurazione, e un ripristino che li ignora produce una macchina che sembra configurata e non inoltra.

What changedRestored by a configuration backupNeeds its own action
Service unit or startup orderingPartly, if the unit file was includedPackage state and enabled links
Kernel module or interface supportNoKernel or module rollback, or a boot-time decision
Peer or device authorizationOnly if the backup predates the revocationA deliberate decision about which peers return
Firewall rules applied outside the configOnly if they were capturedReplaying and verifying each rule

L’autorizzazione merita una riga propria. Un backup fatto prima che un dispositivo compromesso venisse rimosso ripristinerà volentieri l’accesso di quel dispositivo. Tornare a quel punto durante un’interruzione è il modo in cui un incidente diventa due, e la decisione di ripristinare dovrebbe essere presa sui peer con la stessa esplicitezza con cui si prende sui file.

Anche il meccanismo del rollback conta. Copiare un eseguibile più vecchio sopra uno gestito dal pacchetto non è l’annullamento supportato di una modifica al pacchetto, e lascia il database dei pacchetti a descrivere uno stato a cui il filesystem non corrisponde. Usa il percorso di downgrade del gestore di pacchetti stesso o l’istantanea offerta dal provider. Un downgrade che il database dei pacchetti registra è uno che puoi ripetere.

Niente di tutto ciò argomenta contro i backup. Argomenta a favore del sapere quale strato copre ogni artefatto, perché la modalità di guasto di un ripristino parziale è più confusa dell’interruzione originale. Scrivi lo strato accanto a ogni backup nel runbook.

Punto di controllo, aggiornamento, poi verifica dall’esterno

Registra lo stato prima della modifica in una forma che potrai confrontare dopo: le versioni installate, le unit di servizio coinvolte, i socket in ascolto e l’elenco attuale dei peer. Quattro comandi coprono gran parte di questo su un host Linux.

systemctl list-units --type=service | grep -E 'openvpn|wg-quick'
ss -lunp | grep -E ':51820|:1194'
journalctl -u wg-quick@wg0 --since '-10 min'

Il primo mostra quali unit esistono e se sono in esecuzione, il secondo conferma che l’ascoltatore è realmente associato e il terzo ti dà il resoconto del servizio stesso sugli ultimi minuti. Nessuno di essi dimostra che un client possa connettersi, per questo il passo successivo avviene fuori dall’host. Conserva quelle letture come base di confronto.

Verifica da una rete che non usa il tunnel: autentica un client autorizzato, risolvi un nome e raggiungi un’applicazione prevista. Una riga di stato locale che dice che l’interfaccia è attiva è un’affermazione sull’interfaccia, non sul routing, sulle chiavi o sulla politica che ammette un peer.

Poi prova deliberatamente il percorso di riconnessione. Riavvia il servizio una volta e conferma che il tunnel torni senza intervento manuale, perché un servizio che parte correttamente solo all’avvio è un servizio che ti sorprenderà nel momento peggiore.

Quando fallisce, usa il percorso che hai provato

La sequenza di ripristino non è glamour e funziona: raggiungi l’host tramite il percorso indipendente, leggi i log del servizio stesso e ripristina il punto di controllo specifico che corrisponde al guasto. Cambia una cosa per tentativo, così la lettura successiva dei log significa qualcosa.

Resisti all’impulso di fare diverse modifiche non registrate per riottenere la connettività. Una macchina riparata con cinque modifiche simultanee non può essere spiegata dopo, e il prossimo aggiornamento reintrodurrà quella che effettivamente reggeva il carico.

Poi decidi la politica permanente con le prove. Se l’aggiornamento ha rivelato una dipendenza che nessuno aveva documentato, la correzione è documentazione e un test, non disattivare gli aggiornamenti. Se ha rivelato un servizio che non può riavviarsi in modo pulito, la correzione è nell’unit, non nel calendario.

Il confronto si risolve in modo pulito appena la condizione ha un nome. Un percorso indipendente rende gli aggiornamenti non presidiati un rischio gestibile. La sua assenza rende la stessa politica un’interruzione programmata con un tempo di ripristino sconosciuto, e nessuna quantità di automazione cambia quell’aritmetica.

Articoli correlati