Due modi per farlo
Ogni dispositivo che si collega con una chiave ha bisogno di una chiave privata. Puoi dare a ogni dispositivo la sua, oppure copiare la stessa su tutti.
| Una chiave per dispositivo | Una chiave copiata | |
|---|---|---|
| Configurazione | Aggiungi ogni nuova chiave pubblica a ogni server | Copi un file su ogni dispositivo |
| Dispositivo perso o venduto | Togli una riga su ogni server | Nuova chiave su ogni dispositivo e ogni server |
| Log del server | Mostrano quale dispositivo è entrato | Tutti gli accessi sembrano uguali |
| Chiavi hardware e telefoni | Funzionano, perché la chiave non deve mai spostarsi | Impossibile quando la chiave non si può esportare |
Una chiave per dispositivo è la scelta più sicura di base, ed è quella che usa la maggior parte dei team. Copiare ha senso con pochi dispositivi che controlli del tutto, quando aggiungere chiavi a molti server è il lavoro più pesante.
Crea una chiave sul nuovo dispositivo
Sul nuovo computer crea una chiave e dalle un commento con il nome del dispositivo:
ssh-keygen -t ed25519 -C "me@desktop"
Accetta il file proposto, ~/.ssh/id_ed25519, e imposta una passphrase. Il commento compare accanto alla chiave in authorized_keys e negli elenchi dei fingerprint, ed è quello che ti permette di togliere la riga giusta più avanti. La guida su come generare una chiave SSH Ed25519 spiega le opzioni.
Aggiungila ai tuoi server
Se il server accetta ancora la password, esegui questo dal nuovo dispositivo:
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@server
Se l'accesso con password è spento, che è la configurazione migliore, usa un dispositivo che entra già. Portagli il nuovo file .pub (è pubblico, quindi va bene un'email o un messaggio in chat), poi aggiungilo:
ssh deploy@server "cat >> ~/.ssh/authorized_keys" < desktop.pub
Controlla che ci siano entrambe le chiavi, ognuna con il suo commento:
ssh deploy@server "ssh-keygen -lf ~/.ssh/authorized_keys"
256 SHA256:l1AS4F9VRH90JA6uJuQw7/3uRDzrtMafpkeiO7zel84 me@laptop (ED25519)
256 SHA256:LGklWc72FhPwm7in/sLr3pGRujcSZ6a6z4E97qJGkRE me@desktop (ED25519)
Ripeti per ogni server, e aggiungi la chiave a GitHub o GitLab tra le chiavi SSH dell'account se fai push di codice da questo dispositivo. Con molti server, un breve ciclo sull'elenco degli host fa risparmiare tempo. Il formato del file è spiegato in il file authorized_keys spiegato.
Se invece copi la chiave
Copia entrambi i file, id_ed25519 e id_ed25519.pub, su un canale cifrato da un capo all'altro: una chiavetta USB cifrata, AirDrop, o scp tra due macchine tue. Evita email, chat e cartelle condivise, che conservano copie. Poi, sul nuovo dispositivo:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
Senza questi permessi ssh rifiuta la chiave. Se la chiave non ha una passphrase, aggiungila adesso, visto che ora vive in più posti:
ssh-keygen -p -f ~/.ssh/id_ed25519
Per controllare che chiave privata e chiave pubblica vadano insieme, ricava la parte pubblica da quella privata e confronta:
ssh-keygen -y -f ~/.ssh/id_ed25519
cat ~/.ssh/id_ed25519.pub
Le due righe devono iniziare con la stessa chiave. Approfondisci in ricavare la chiave pubblica da quella privata.
Quando perdi o sostituisci un dispositivo
Con una chiave per dispositivo, togli la riga di quel dispositivo su ogni server. Fai una copia del file, cancella in base al commento ed elenca quello che resta:
sed -i.bak '/ me@desktop$/d' ~/.ssh/authorized_keys
ssh-keygen -lf ~/.ssh/authorized_keys
Un commento può essere modificato da chiunque avesse accesso, quindi per un dispositivo rubato cerca per fingerprint, come spiegato in revocare una chiave SSH. Togli la chiave anche da GitHub e servizi simili.
Con una chiave copiata, il dispositivo perso ha la stessa chiave di tutti gli altri. Crea una chiave nuova, installala ovunque, togli la vecchia chiave pubblica da ogni server e servizio, e copia la nuova chiave privata sui dispositivi che hai ancora. Finché non hai finito, a proteggere la vecchia c'è solo la passphrase.
Tieni la configurazione uguale ovunque
Le chiavi private cambiano da un dispositivo all'altro, ma ~/.ssh/config può essere identico, purché ogni dispositivo chiami la sua chiave allo stesso modo:
Host *
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Host prod
HostName 203.0.113.10
User deploy
La configurazione non contiene segreti, quindi può stare in un repository di dotfile o in una cartella sincronizzata. Tieni fuori i file id_* senza .pub. Vedi esempi di file ssh config per i pattern degli host, e un gestore di chiavi SSH con vault cifrato se preferisci tenere chiavi e server insieme.
Domande
Posso copiare la mia chiave privata SSH su un altro computer?
Funziona, e a OpenSSH non importa dove è stata creata una chiave. Il prezzo si paga alla fine: se una copia trapela o perdi un dispositivo, devi sostituire la chiave su ogni server e su ogni dispositivo che la contiene.
Posso mettere la cartella .ssh in Dropbox, iCloud o in un repository di dotfile?
Lì puoi tenere la configurazione e le chiavi pubbliche, mai le chiavi private. Una cartella sincronizzata o la cronologia di Git conservano copie che non riesci a cancellare del tutto.
Quante chiavi può contenere authorized_keys?
Non c'è un limite pratico. Ogni riga è una chiave, e un commento finale come me@laptop le distingue.
Fonti
- ssh-keygen(1), manuale OpenBSD
- sshd(8), AUTHORIZED_KEYS FILE FORMAT
- ssh-copy-id(1), Debian 13
- Adding a new SSH key to your GitHub account, GitHub Docs