it-swarm-eu.dev

Qual è la strategia pragmatica comune per la gestione delle coppie di chiavi?

Ho un numero limitato di stazioni di lavoro diverse (oltre a dispositivi client come iPhone) che utilizzo per connettermi a numerosi server tramite SSH.

Inizialmente quando ho appreso della PKI, ho creato una singola coppia di chiavi sulla mia workstation, che ho subito iniziato a utilizzare da qualsiasi luogo (il che significa che l'ho copiato sul mio laptop, ecc.), E l'ho usato per connettermi a tutti i miei account del server.

Da allora, ho sviluppato l'opinione che questo è simile all'utilizzo di una singola password ovunque e potrebbe essere necessario revocare l'accesso in modo selettivo, ad es. se una delle mie workstation è compromessa.

Fondamentalmente sto cercando di sviluppare una strategia personale per gestire le coppie di chiavi:

Qual è il modo giusto di pensare in modo sicuro alle coppie di chiavi per uso generale, pur rimanendo pragmatico per l'usabilità? (vale a dire, non penso che abbia senso anche le coppie di chiavi monouso per ogni punto di connessione.)

È sbagliato che una coppia di chiavi rappresenti un'identità personale a livello globale da tutti i punti di accesso ("me-everywhere-id_rsa") come ho fatto in passato, o è il mio pensiero attuale che una combinazione client-utente unica dovrebbe essere sempre rappresentata da la propria chiave ("me-on-my-personal-laptop-id_rsa") più appropriata?

Riutilizzi la stessa chiave per collegarti a tutti i server o a quali condizioni consideri coniare una chiave separata?

48
Andrew Vit

Preferisco avere una chiave per ogni ambito di autenticazione. Pertanto, per ogni computer desktop o server al lavoro (tutti abbastanza fisicamente sicuri e sotto il controllo di un singolo gruppo di amministratori), ho una chiave privata. Uso la stessa chiave privata sul mio nuovo PC di casa del mio vecchio PC di casa. Uso diversi tasti su laptop e altri dispositivi mobili. Questo approccio consente una gestione dei rischi ben precisa: posso revocare le chiavi separatamente e limitare le possibilità per i miei account di essere coinvolti in un'infiltrazione escalation non autorizzando determinate chiavi su determinate macchine (non faccio così tanto, ma è un'opzione per il paranoico).

Finché non fai nulla di complicato, copiare le chiavi pubbliche non è così difficile. Puoi tenere un grande elenco di chiavi autorizzate e sincronizzarlo ovunque; registrare un dispositivo significa aggiungere un elemento a quell'elenco e spingere la modifica. Questo non è molto più lavoro che estrarre la chiave privata, se in primo luogo si dispone di un repository di dati centrale.

Tieni presente che mentre il vantaggio più ovvio di avere chiavi private separate è di poterne revocarne una separatamente, hanno anche un vantaggio di disponibilità: se un amministratore di sistema sulla macchina A decide di revocare la chiave della macchina C in cui ti trovi, potresti ancora essere in grado di trovare una macchina B che accetta ancora la chiave di C e la cui chiave è accettata da A. Questo sembra piuttosto esoterico, ma questo è successo una volta a me (dopo Debian ha realizzato che non stavano seminando il loro RNG , sono stato contento di non dover dipendere esclusivamente da una chiave nella lista nera) mentre non ho ancora dovuto revocare una chiave in caso di emergenza.

C'è anche un vantaggio teorico nel mantenere una coppia di chiavi separata per coppia di macchine, in quanto consente revocazioni separate. Ma il vantaggio è estremamente ridotto e la gestione è molto più difficile (non è più possibile trasmettere elenchi di autorizzazioni). La semplificazione della gestione delle chiavi è un vantaggio fondamentale della crittografia a chiave pubblica rispetto ai segreti condivisi.

Hai già visto il punto principale: se una delle tue macchine è compromessa, la chiave privata contenuta in questa macchina deve essere "revocata": devi configurare tutti i server su cui ti connetti per rifiutare ulteriori tentativi di autenticazione usando quella chiave (cioè rimuovi il chiave pubblica corrispondente dal .ssh/authorized_keys dei server). Esiste una tecnica di mitigazione, che consiste nel proteggere la chiave privata con una password (o passphrase). Questo ha un prezzo, vale a dire che devi digitare la password ( ssh-agent può essere abbastanza utile per quello); d'altra parte, ciò può dissuadere temporaneamente l'attaccante dall'ottenere la chiave privata (dipende dal tipo di compromesso, ma se si tratta di un furto di una macchina completa - uno scenario plausibile con dispositivi mobili - la password impedirà accesso immediato alla chiave privata e concedere del tempo per riconfigurare i server).


Si può notare che "PKI" significa "Chiave pubblica Infrastruttura" e SSH è rudimentale al riguardo. In una PKI completa, verrebbero utilizzati certificati , con delega e centralizzazione della revoca. Con certificati:

  • dovresti creare una coppia di chiavi CA, memorizzata in modo sicuro da qualche parte;
  • per ogni macchina client, otterresti una nuova coppia di chiavi, la chiave pubblica essendo firmata dalla CA;
  • i server verrebbero configurati per accettare automaticamente any chiave pubblica firmata dalla CA (conosceranno la chiave pubblica della CA, ma non le singole chiavi della macchina client);
  • la CA manterrebbe e pubblicherà regolarmente le informazioni di revoca, vale a dire l'elenco delle chiavi pubbliche che non devono più essere accettate anche se queste chiavi sono firmate dalla CA (le informazioni di revoca devono essere inviate ai server, o tirato su richiesta).

La cosa grandiosa dei certificati è che centralizzi le decisioni, il che, in termini pratici, significa che se ti connetti a 20 server dai tuoi computer client e quindi aggiungi un nuovo computer client, non devi spingere manualmente la nuova chiave pubblica in tutti i 20 server.

OpenSSH , dalla versione 5.4 (rilasciata l'8 marzo 2010), supporta alcuni certificati; vedere la sezione omonima nella pagina man per ssh-keygen . I certificati OpenSSH hanno un formato molto più semplice rispetto ai "soliti" certificati X.509 (usati con SSL). La semplificazione ha anche un prezzo: non esiste un supporto di revoca centralizzato. Invece, se una chiave privata è compromessa, devi comunque inserire nella blacklist la chiave pubblica corrispondente su tutti i server e la blacklist è, in OpenSSH, una whitelist (opzione AuthorizedPrincipalsFile in sshd_config) che è, normalmente, sotto il controllo di root. Quindi la revoca non funziona bene e devi comunque configurare manualmente le cose su ciascun server ogni volta che crei o perdi una chiave, l'esatto inconveniente che la PKI avrebbe dovuto abolire.

Tu could crei ancora chiavi a tempo limitato, perché i certificati OpenSSH possono incorporare chiavi a tempo limitato. In tal caso, daresti a ogni macchina client una chiave che è utile, diciamo, per una settimana. Con le chiavi che muoiono dopo una settimana e una chiave pubblica della CA nota dai server, hai la principale bontà della CA (non è necessario inviare nulla su tutti i server quando una nuova macchina viene aggiunta al pool di client) e se un privato la chiave è compromessa, il danno è "limitato", supponendo che tu abbia una password chiave che, presumibilmente, resisterebbe a una settimana di cracking (ma questo non funzionerà se il compromesso è un'acquisizione ostile con un registratore di chiavi). Le chiavi a tempo limitato possono diventare noiose nel tempo e presumono che tutti i server abbiano un orologio impostato correttamente, il che non è sempre scontato (sarebbe sfortunato essere bloccato fuori da un server perché l'orologio del server è selvaggiamente spento e reimpostato l'orologio richiede l'accesso SSH al server ...).

Un ulteriore problema con SSH è che è facile aggiungere chiavi pubbliche su ciascun server. Ciò significa che se un utente malintenzionato compromette una chiave privata e ottiene l'accesso a un server una volta, può aggiungere la propria chiave pubblica a .ssh/authorized_keys su quel server e nessuna quantità di revoca lo risolverà. La revoca è, per natura, un processo asincrono. Pertanto, non implementa un controllo dei danni sufficientemente rigido.


Date le carenze del supporto SSH per i certificati, non esiste uno schema ragionevole che eviti di dover eseguire una configurazione su tutti i server in alcune situazioni. Quindi hai sostanzialmente le seguenti scelte, quando aggiungi un nuovo computer client:

  1. Copi la chiave privata da un altro computer client (è quello che stai facendo in questo momento). Ciò non richiede alcuna configurazione aggiuntiva sui server.

  2. Si crea una nuova coppia di chiavi per quella macchina. Devi inviare la chiave pubblica a tutti i server.

In caso di compromissione della chiave, è necessario connettersi a tutti i server per rimuovere la chiave pubblica corrispondente da tutti i .ssh/authorized_keys. Questo è inevitabile (per evitarlo, dovresti usare i certificati e SSH non è bravo nei certificati, vedi sopra). Quindi if hai usato la scelta 1, quindi devi anche creare una nuova coppia di chiavi e inviarla a tutti i client = macchine che utilizzavano una copia della chiave privata compromessa.

Quindi, la scelta 1 comporta meno lavori di configurazione rispetto alla scelta 2 nel caso normale, ma le cose vengono invertite se si verifica un compromesso chiave. Poiché i compromessi sono normalmente eventi rari, ciò favorirebbe la scelta 1 (che è ciò che già fai). Quindi ti consiglio di proteggere la tua chiave privata con una password complessa e di copiarla su tutti i tuoi sistemi client.

Nota: in tutto quanto sopra, ho assunto che tu volessi connetterti a un elenco di server con SSH e tu volessi accedere a uno qualsiasi dei server da qualsiasi macchina client. Tu potresti vuoi limitare l'accesso, come accedere a un determinato server solo da una o due macchine client specifiche. Questo può essere fatto con più chiavi client, ma la complessità della configurazione aumenta in modo quadratico.

22
Tom Leek

Fondamentalmente sto cercando di sviluppare una strategia personale per gestire le coppie di chiavi

Se sei il principale responsabile dei server in questione, ti consiglio vivamente di prendere in considerazione la ricerca di strumenti di gestione della configurazione come burattino/cuoco. Entrambi hanno metodi per distribuire le chiavi SSH sui tuoi computer.

Le ragioni per cui ho iniziato a usare le marionette erano in particolare perché volevo un buon modo per revocare rapidamente una chiave sui miei ~ 60 server Linux quando il personale è cambiato.

Quando si dispone di uno strumento di gestione della configurazione per gestire le chiavi, diventa molto più semplice avere molte coppie di chiavi. Invece di dover revocare manualmente una chiave su ogni casella o aggiungere una nuova chiave su ogni casella, è sufficiente aggiungere la chiave pubblica sul master di configurazione e i client aggiorneranno gli elenchi di autorizzazioni entro qualsiasi intervallo di polling impostato per la gestione della configurazione attrezzo.

Ciò significa che stai affidando molta fiducia al tuo host di gestione della configurazione non compromesso. Poiché in genere esegue attività con privilegi di root su ogni macchina su cui lo si configura, è necessario assicurarsi che sia bloccato, con un sacco di controllo. Se un utente malintenzionato dovesse compromettere il master della configurazione, potrebbe fare qualcosa come aggiungere nuove chiavi, aggiungere nuovi account, ecc.

10
Zoredache

Sto usando una chiave per reame e per macchina. 4 telecomandi accessibili da 2 workstation => 8 chiavi private. Non copiare mai una chiave privata da un host a un altro. Se una workstation è compromessa, revocare tutte quelle chiavi.

Poiché creare chiavi e configurare SSH per usarle è piuttosto noioso, ho scritto uno strumento dedicato alla gestione delle mie chiavi SSH per l'accesso a Github: github-keygen .

0
dolmen