Quali sono le migliori pratiche per la gestione delle chiavi SSH in un team?


42

Lavoro con piccoli team (<10) di sviluppatori e amministratori con le seguenti caratteristiche:

  • La maggior parte dei membri del team ha> 1 personal computer, molti dei quali portatili
  • I membri del team hanno accesso a 10-50 server, di solito con sudo

Penso che questo sia abbastanza tipico per la maggior parte delle startup e dei gruppi IT aziendali di piccole e medie dimensioni.

Quali sono le migliori pratiche per la gestione delle chiavi SSH in un team come questo?

Dovresti condividere una sola chiave per l'intero team?

Ogni persona dovrebbe avere la propria chiave su un account condiviso ("ubuntu" su ogni server)?

Conti separati?

Ogni membro del team deve conservare una chiave separata per ciascuno dei propri laptop o desktop?

Risposte:


33

Nella mia azienda utilizziamo LDAP per avere un set coerente di account su tutte le macchine e quindi utilizzare uno strumento di gestione della configurazione (nel nostro caso attualmente cfengine) per distribuire i authorized_keysfile per ciascun utente su tutti i server. I file delle chiavi stessi sono conservati (insieme ad altre informazioni sulla configurazione del sistema) in un repository git in modo da poter vedere quando le chiavi vanno e vengono. cfengine distribuisce anche un sudoersfile che controlla chi ha accesso per eseguire cosa come root su ciascun host, usando utenti e gruppi dalla directory LDAP.

L'autenticazione della password è completamente disabilitata sui nostri server di produzione, pertanto l'autenticazione della chiave SSH è obbligatoria. La politica incoraggia l'uso di una chiave separata per ciascun laptop / desktop / qualunque cosa e l'utilizzo di una passphrase su tutti i tasti per ridurre l'impatto di un laptop smarrito / rubato.

Abbiamo anche un host bastion che viene utilizzato per accedere agli host sulla rete di produzione, permettendoci di avere regole firewall molto restrittive su quella rete. La maggior parte degli ingegneri ha alcune speciali configurazioni SSH per rendere questo trasparente:

Host prod-*.example.com
     User jsmith
     ForwardAgent yes
     ProxyCommand ssh -q bastion.example.com "nc %h %p"

L'aggiunta di una nuova chiave o la rimozione di una vecchia richiede un po 'di cerimonia in questa configurazione. Direi che per l'aggiunta di una nuova chiave è auspicabile che sia un'operazione che lasci una traccia di controllo ed è visibile a tutti. Tuttavia, a causa delle spese generali, penso che le persone a volte trascurano di rimuovere una vecchia chiave quando non è più necessaria e non abbiamo alcun modo reale di rintracciarla se non per ripulire quando un dipendente lascia l'azienda. Inoltre, crea un ulteriore attrito quando si trova a bordo di un nuovo ingegnere, poiché devono generare una nuova chiave e inviarla a tutti gli host prima che possano essere completamente produttivi.

Tuttavia, il vantaggio più grande è avere un nome utente separato per ciascun utente, che semplifica il controllo degli accessi più granulare quando ne abbiamo bisogno e fornisce a ciascun utente un'identità che appare nei registri di controllo, che può essere davvero utile quando si cerca di tracciare un problema di produzione torna a un'azione di amministratore di sistema.

In questa configurazione è fastidioso avere sistemi automatizzati che agiscono contro host di produzione, poiché le loro chiavi SSH "ben note" possono servire come percorso di accesso alternativo. Finora abbiamo appena creato che gli account utente per questi sistemi automatizzati abbiano solo il minimo accesso di cui hanno bisogno per fare il loro lavoro e abbiamo accettato che un utente malintenzionato (che deve già essere un ingegnere con accesso alla produzione) possa anche fare quelle stesse azioni semi- usando anonimamente la chiave dell'applicazione.


Questa è davvero una buona risposta! Domanda di follow-up: usi cfengine per distribuire .authorized_keys. Hai esaminato uno dei modi per memorizzare direttamente le chiavi pubbliche SSH nel tuo server LDAP? Richiedono principalmente patch sshd, che sembra fragile.
Evan Prodromou,

Ho fatto qualcosa di simile con Chef.
gWaldo,

1
@EvanProdromou Ho impostato le chiavi pubbliche SSH in LDAP, ma era molto più seccante di quanto valesse, dato che dovevo mantenere da solo i pacchetti SSH aggiornati, ed era all'incirca nel tempo di alcune vulnerabilità SSH
Daniel Lawson,

1
Anche le regole del Sudo e le chiavi SSH possono essere inserite in LDAP, SSSD può essere usato per impostare questo. Link: sudo.ws/sudoers.ldap.man.html e access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/…
fuero

Mi piace la tua parte ProxyCommand ssh -qlì! Non l'ho mai visto. Sono riluttante a installare un server bastione, ma se può essere trasparente per gli utenti finali, allora potrei essere tutto per questo. Grazie Martin!
altro

6

Personalmente mi piace l'idea che ogni membro dello staff abbia una chiave su una macchina per bastion SSH dedicata su cui ha un account utente di base. Quell'account utente ha 1 chiave SSH che consente l'accesso a tutti i server che devono usare. (anche questi altri server dovrebbero essere protetti da firewall, quindi è abilitato solo l'accesso ssh dal bastione)

Quindi sulle loro macchine di lavoro di tutti i giorni, laptop, tablet ecc. Possono scegliere da soli di avere una chiave tra loro o più chiavi.

Come amministratore di sistema su quella rete hai un numero minimo di chiavi di cui occuparti (una per sviluppatore), puoi monitorare facilmente l'accesso ssh attraverso la rete (poiché tutto instrada attraverso la macchina del bastione) e se gli sviluppatori vogliono più chiavi o solo uno che condividono tra le loro macchine non è un vero problema in quanto hai solo una macchina da aggiornare. (a meno che le chiavi ssh dei bastioni non siano compromesse, ma è molto più improbabile di una delle chiavi degli utenti)


5

Ho avuto la situazione in cui avevo bisogno di fornire l'accesso alla chiave SSH per un team di 40 sviluppatori a circa 120 server remoti dei clienti.

Ho controllato l'accesso costringendo gli sviluppatori a connettersi attraverso un unico "jump host". Da quell'host ho generato chiavi private / pubbliche e le ho inviate ai server dei clienti. Se gli sviluppatori necessitavano dell'accesso da un laptop, potevano usare la stessa coppia di chiavi sul loro sistema locale.


2

Personalmente andrei con ogni utente per avere immediatamente la responsabilità e impostare le restrizioni molto più facilmente - non so cosa pensano gli altri?


2

Un approccio di cui ho sentito parlare, ma che non ho usato da solo, è che ogni utente abbia un pacchetto (ad es. , .profile, .vimrc ecc.). Questo è firmato e archiviato in un repository aziendale. Questo pacchetto potrebbe anche essere responsabile della creazione dell'account utente, oppure potrebbe integrare qualcos'altro creando l'account (cfengine / puppet ecc.) O un sistema di autenticazione centrale come LDAP.

Questi pacchetti vengono quindi installati sugli host tramite qualunque meccanismo tu preferisca (cfengine / puppet etc, cron job). Un approccio consiste nell'avere un metapacchetto che ha una dipendenza dai pacchetti per utente.

Se si desidera rimuovere una chiave pubblica, ma non l'utente, il pacchetto per utente viene aggiornato. Se si desidera rimuovere un utente, si rimuove il pacchetto.

Se hai sistemi eterogenei e devi conservare sia i file .rpm che .deb, allora vedo che questo è un po 'fastidioso, anche se strumenti come alien potrebbero renderlo un po' più semplice.

Come ho detto, non l'ho fatto da solo. Il vantaggio di questo approccio per me è che integra un sistema LDAP centrale e la gestione centrale degli account utente, in quanto consente a un utente di aggiornare facilmente il suo pacchetto per includere il suo file .vimrc, ad esempio, senza dover gestire quel file con strumenti come le marionette, a cui un utente potrebbe non avere accesso.


1

Dovresti prendere il percorso più sicuro e forzare ogni utente ad avere chiavi separate, e probabilmente per ogni dispositivo.

Se hai le chiavi condivise tra utenti --- anche se sei una piccola squadra --- revocare una chiave è un inconveniente per tutti gli altri.

Se si consente al personale di disporre di una chiave per tutti i propri dispositivi, è possibile selezionare i server a cui connettersi con quel dispositivo. Ad esempio, un laptop portatile potrebbe essere limitato a uno o due server, ma il desktop dell'ufficio può avere accesso a tutti i server.


1

Alcuni anni fa Envy Labs ha scritto uno strumento chiamato Keymaster (in collaborazione con il gatekeeper client) per gestire qualcosa del genere per i team di sviluppo.

Il progetto non ha avuto molto amore negli ultimi due anni, ma è probabilmente qualcosa con cui potresti armeggiare e forse riportare in vita?

Il repository è disponibile in github: https://github.com/envylabs/keymaster


-4

Un approccio potrebbe essere l'impostazione del server NIS con / home share su NFS. Questo combinato con sudo nei server e consentendo solo agli utenti che si desidera a ciascun server tramite la configurazione SSH.

In questo modo ogni membro del team utilizza un solo utente e la sua chiave per accedere a tutti i server. Sudo e una password per le attività di amministrazione.

Saluti,

Rafael


1
1) Abilitare NIS è una falla di sicurezza. 2) Avere una password e un account è contrario alla tracciabilità e alla responsabilità.
Deer Hunter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.