Procedura dettagliata: Creare e gestire chiavi SSH per l'autenticazione in una VM Linux di Azure
Si applica a: ✔️ macchine virtuali di Linux ✔️ set di scalabilità flessibili
Con una coppia di chiavi SSH (Secure Shell), è possibile creare una macchina virtuale Linux che usa chiavi SSH per l'autenticazione. Questo articolo illustra come creare e usare una coppia di file di chiavi SSH RSA pubblica-privata per le connessioni client SSH.
Se si vogliono comandi rapidi anziché una spiegazione più approfondita delle chiavi SSH, vedere Come creare una coppia di chiavi SSH pubblica-privata per le macchine virtuali Linux in Azure.
Per creare chiavi SSH e usarle per connettersi a una macchina virtuale Linux da un computer Windows , vedere Come usare le chiavi SSH con Windows in Azure. È anche possibile usare il portale di Azure per creare e gestire chiavi SSH per la creazione di macchine virtuali nel portale.
Panoramica di SSH e delle chiavi
SSH è un protocollo di connessione crittografato che fornisce accessi sicuri su connessioni non protette. Sebbene SSH fornisca una connessione crittografata, l'uso di password con connessioni SSH lascia la macchina virtuale vulnerabile agli attacchi di forza bruta. È consigliabile connettersi a una macchina virtuale tramite SSH usando una coppia di chiavi pubblica-privata, nota anche come chiavi SSH.
La chiave pubblica viene inserita nella macchina virtuale.
La chiave privata rimane nel sistema locale. Sulla chiave privata è necessario mantenere la massima riservatezza, evitando di condividerla.
Quando si usa un client SSH per connettersi alla macchina virtuale (con la chiave pubblica), la macchina virtuale remota testa il client per assicurarsi che abbia la chiave privata corretta. In caso positivo, al client viene concesso il diritto di accesso alla macchina virtuale.
A seconda dei criteri di sicurezza dell'organizzazione, è possibile riutilizzare una singola coppia di chiavi pubblica e privata per accedere a più VM e servizi di Azure. Non è necessaria una coppia di chiavi separata per ogni VM o servizio a cui si desidera accedere.
La chiave pubblica può essere condivisa con chiunque, ma la chiave privata appartiene solo all'utente o all'infrastruttura di sicurezza locale.
Formati di chiave SSH supportati
Azure supporta attualmente i tipi di chiave seguenti:
- PROTOCOLLO SSH 2 (SSH-2) RSA (Rivest, Shamir, Adleman) con una lunghezza minima di 2048 bit
- ED25519 chiavi con una lunghezza fissa di 256 bit
Altri formati chiave, ad esempio Elliptic-curve Diffie–Hellman (ECDH) e Elliptic Curve Digital Signature Algorithm (ECDSA) non sono attualmente supportati.
Uso e vantaggi delle chiavi SSH
Quando si crea una VM di Azure specificando la chiave pubblica, Azure copia la chiave pubblica (nel formato .pub
) nella cartella ~/.ssh/authorized_keys
nella VM. Le chiavi ~/.ssh/authorized_keys
SSH assicurano che i client di connessione presentino la chiave privata corrispondente durante una connessione SSH. In una macchina virtuale Linux di Azure che usa chiavi SSH per l'autenticazione, Azure disabilita il sistema di autenticazione password del server SSH e consente solo l'autenticazione della chiave SSH. Creando una macchina virtuale Linux di Azure con chiavi SSH, è possibile proteggere la distribuzione della macchina virtuale e salvare autonomamente il tipico passaggio di configurazione post-distribuzione della disabilitazione delle password nel sshd_config
file.
Se non si vogliono usare chiavi SSH, è possibile configurare la VM Linux in modo che usi l'autenticazione mediante password. Se la VM non è connessa a Internet, l'utilizzo di password può essere sufficiente. Tuttavia, è comunque necessario gestire le password per ogni macchina virtuale Linux e mantenere criteri e procedure password integre, ad esempio la lunghezza minima delle password e gli aggiornamenti regolari del sistema.
Generare chiavi con ssh-keygen
Per creare le chiavi, un comando preferito è ssh-keygen
, disponibile con le utilità OpenSSH in Azure Cloud Shell, un host macOS o Linux e Windows (10 & 11). ssh-keygen
presenta una serie di domande e quindi scrive una chiave privata e una chiave pubblica corrispondente.
Per impostazione predefinita, le chiavi SSH vengono conservate nella directory ~/.ssh
. Se non si dispone di una directory ~/.ssh
, questa viene creata automaticamente dal comando ssh-keygen
con le autorizzazioni corrette. Una chiave SSH viene creata come risorsa e archiviata in Azure per un uso successivo.
Nota
È anche possibile creare chiavi con l'interfaccia della riga di comando di Azure con il comando az sshkey create , come descritto in Generare e archiviare chiavi SSH.
Esempio di base
Il comando seguente ssh-keygen
genera i file di chiave PUBBLICA e privata SSH RSA a 4096 bit per impostazione predefinita nella ~/.ssh
directory. Se viene trovata una coppia di chiavi SSH esistente nel percorso corrente, tali file vengono sovrascritti.
ssh-keygen -m PEM -t rsa -b 4096
Il comando seguente ssh-keygen
genera ED25519 file di chiave pubblica e privata a 256 bit per impostazione predefinita nella ~/.ssh
directory. Se viene trovata una coppia di chiavi SSH esistente nel percorso corrente, tali file vengono sovrascritti.
ssh-keygen -m PEM -t ed25519
Esempio dettagliato
L'esempio seguente mostra opzioni di comando aggiuntive per creare una coppia di chiavi SSH RSA. Se nel percorso corrente è presente una coppia di chiavi SSH, questi file vengono sovrascritti.
ssh-keygen \
-m PEM \
-t rsa \
-b 4096 \
-C "azureuser@myserver" \
-f ~/.ssh/mykeys/myrsaprivatekey \
-N mypassphrase
L'esempio seguente mostra opzioni di comando aggiuntive per creare una coppia di chiavi SSH ED25519. Se nel percorso corrente è presente una coppia di chiavi SSH, questi file vengono sovrascritti.
ssh-keygen \
-m PEM \
-t ed25519 \
-C "azureuser@myserver" \
-f ~/.ssh/mykeys/myedprivatekey \
-N mypassphrase
Descrizione del comando
ssh-keygen
: programma usato per creare le chiavi.
-m PEM
= formattare la chiave come PEM
-t rsa
= tipo di chiave da creare, in questo caso nel formato RSA
-b 4096
= numero di bit nella chiave, in questo caso 4096
-C "azureuser@myserver"
: commento aggiunto alla fine del file della chiave pubblica per identificarla facilmente. Come commento viene usato in genere un indirizzo di posta elettronica, ma è possibile usare qualsiasi elemento, in base alle esigenze dell'infrastruttura.
-f ~/.ssh/mykeys/myprivatekey
= il nome del file della chiave privata, se si sceglie di non usare il nome predefinito. Un file di chiave pubblica corrispondente con finale .pub
viene generato nella stessa directory. La directory deve esistere.
-N mypassphrase
= una passphrase aggiuntiva necessaria per accedere al file della chiave privata.
Esempio di ssh-keygen (RSA)
ssh-keygen -t rsa -m PEM -b 4096 -C "azureuser@myserver"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/azureuser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/azureuser/.ssh/id_rsa.
Your public key has been saved in /home/azureuser/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:vFfHHrpSGQBd/oNdvNiX0sG9Vh+wROlZBktNZw9AUjA azureuser@myserver
The key's randomart image is:
+---[RSA 4096]----+
| .oE=*B*+ |
| o+o.*++|
| .oo++*|
| . .B+.O|
| S o=BO.|
| . .o++o |
| . ... . |
| .. . |
| .. |
+----[SHA256]-----+
Esempio di ssh-keygen (ED25519)
ssh-keygen -t ed25519 -m PEM -C "azureuser@myserver"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/azureuser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/azureuser/.ssh/id_ed25519.
Your public key has been saved in /home/azureuser/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:vFfHHrpSGQBd/oNdvNiX0sG9Vh+wROlZBktNZw9AUjA azureuser@myserver
The key's randomart image is:
+---[ED25519 256]----+
| |
|.. . |
|o+.o . |
|*=o o o + + |
|*+o+ oSB + o |
|**++o.+oo = . |
|=+*..*.o E |
|.. o o.. |
| .o. |
+----[SHA256]-----+
I file delle chiavi salvati
Enter file in which to save the key (/home/azureuser/.ssh/id_rsa): ~/.ssh/id_rsa
or
Enter file in which to save the key (/home/azureuser/.ssh/id_ed25519): ~/.ssh/id_ed25519
I nomi predefiniti delle coppie di chiavi per RSA e ED25519 sono id_rsa
e id_ed25519
rispettivamente; alcuni strumenti potrebbero aspettarsi il id_rsa
nome del file di chiave privata o id_ed25519
, quindi è consigliabile crearne uno. La directory ~/.ssh/
è la posizione predefinita per le coppie di chiavi SSH e il file config SSH. Se non viene specificato con un percorso completo, ssh-keygen
crea le chiavi nella directory di lavoro corrente, non nel percorso ~/.ssh
predefinito.
Elenco della directory ~/.ssh
Per visualizzare i file esistenti nella ~/.ssh
directory, eseguire il comando seguente. Se non vengono trovati file nella directory o nella directory stessa manca, assicurarsi che tutti i comandi precedenti siano stati eseguiti correttamente. Potrebbe essere necessario l'accesso radice per modificare i file in questa directory in determinate distribuzioni Linux.
Coppia di chiavi RSA:
ls -al ~/.ssh
-rw------- 1 azureuser staff 1675 Aug 25 18:04 id_rsa
-rw-r--r-- 1 azureuser staff 410 Aug 25 18:04 id_rsa.pub
ED25519 coppia di chiavi:
ls -al ~/.ssh
-rw------- 1 azureuser staff 1675 Aug 25 18:04 id_ed25519
-rw-r--r-- 1 azureuser staff 410 Aug 25 18:04 id_ed25519.pub
Passphrase della chiave
Enter passphrase (empty for no passphrase):
È vivamente consigliabile aggiungere una passphrase alla chiave privata. Senza una passphrase che protegga il file della chiave, chiunque abbia il file può usarlo per accedere a qualsiasi server che abbia la chiave pubblica corrispondente. L'aggiunta di una passphrase offre protezione nel caso in cui qualcuno riesca ad accedere al file della chiave privata, lasciando all'utente il tempo necessario per cambiare le chiavi.
Generare chiavi automaticamente durante la distribuzione
Se si usa l'interfaccia della riga di comando di Azure per creare la macchina virtuale, è possibile generare file di chiave SSH pubblici e privati eseguendo il comando az vm create con l'opzione --generate-ssh-keys
. Per impostazione predefinita, questo comando corrisponde al tipo di chiave RSA, per generare chiavi ED25519 è possibile passare un comando di flag --ssh-key-type
aggiuntivo. Le chiavi vengono archiviate nella directory ~/.ssh. Si noti che questa opzione di comando non sovrascrive le chiavi se esistono già in tale posizione, ad esempio con alcune immagini della raccolta di calcolo preconfigurato.
Esempio di base
Creare una semplice macchina virtuale Ubuntu Linux insieme alla coppia di chiavi SSH Ed25519.
az vm create -n MyVm -g MyResourceGroup --image Ubuntu2204 --generate-ssh-keys --ssh-key-type ed25519
Fornire la chiave SSH pubblica quando si distribuisce una VM
Per creare una VM Linux che usa le chiavi SSH per l'autenticazione, fornire la chiave SSH pubblica quando si crea la VM tramite il portale di Azure, l'interfaccia della riga di comando, i modelli di Resource Manager o altri metodi. Quando si usa il portale, immettere la chiave pubblica stessa. Se si usa l'interfaccia della riga di comando di Azure per creare la macchina virtuale con una chiave pubblica esistente, specificare il valore o il percorso della chiave pubblica eseguendo il comando creare az vm con l'opzione --ssh-key-value
.
Se non si ha familiarità con il formato della chiave SSH pubblica, è possibile visualizzare la chiave pubblica eseguendo cat
come segue, sostituendo ~/.ssh/id_rsa.pub
con il proprio percorso del file della chiave pubblica:
Coppia di chiavi RSA
cat ~/.ssh/id_rsa.pub
L'output è simile al seguente (esempio redatto di seguito):
ssh-rsa XXXXXXXXXXc2EAAAADAXABAAABAXC5Am7+fGZ+5zXBGgXS6GUvmsXCLGc7tX7/rViXk3+eShZzaXnt75gUmT1I2f75zFn2hlAIDGKWf4g12KWcZxy81TniUOTjUsVlwPymXUXxESL/UfJKfbdstBhTOdy5EG9rYWA0K43SJmwPhH28BpoLfXXXXXG+/ilsXXXXXKgRLiJ2W19MzXHp8z3Lxw7r9wx3HaVlP4XiFv9U4hGcp8RMI1MP1nNesFlOBpG4pV2bJRBTXNXeY4l6F8WZ3C4kuf8XxOo08mXaTpvZ3T1841altmNTZCcPkXuMrBjYSJbA8npoXAXNwiivyoe3X2KMXXXXXdXXXXXXXXXXCXXXXX/ azureuser@myserver
Se si copiano e si incollano i contenuti del file della chiave pubblica nel portale di Azure o in un modello di Resource Manager, verificare di non introdurre spazi o interruzioni di riga aggiuntive. Se ad esempio si usa macOS, è possibile inviare tramite pipe il file della chiave pubblica, che per impostazione predefinita è ~/.ssh/id_rsa.pub
, a pbcopy per copiare i contenuti. Anche altri programmi Linux eseguono questa operazione, ad esempio xclip
.
Se si preferisce usare una chiave pubblica in formato multilinea, è possibile generare una chiave RFC4716 formattata in un contenitore "pem" dalla chiave pubblica creata in precedenza.
Per creare una chiave RFC4716 formattata da una chiave pubblica SSH esistente:
ssh-keygen \
-f ~/.ssh/id_rsa.pub \
-e \
-m RFC4716 > ~/.ssh/id_ssh2.pem
coppia di chiavi ED25519
cat ~/.ssh/id_ed25519.pub
L'output è simile al seguente (esempio redatto di seguito):
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP6I5JuhGq3RidMNpxrplIQwEfc4Rh7UyV8JYYH2U2xA azureuser@myserver
Se si copiano e si incollano i contenuti del file della chiave pubblica nel portale di Azure o in un modello di Resource Manager, verificare di non introdurre spazi o interruzioni di riga aggiuntive. Se ad esempio si usa macOS, è possibile inviare tramite pipe il file della chiave pubblica, che per impostazione predefinita è ~/.ssh/id_ed25519.pub
, a pbcopy per copiare i contenuti. Anche altri programmi Linux eseguono questa operazione, ad esempio xclip
.
Se si preferisce usare una chiave pubblica in formato multilinea, è possibile generare una chiave RFC4716 formattata in un contenitore "pem" dalla chiave pubblica creata in precedenza.
Per creare una chiave in formato PEM da una chiave pubblica SSH esistente:
ssh-keygen \
-f ~/.ssh/id_ed25519.pub \
-e \
-m RFC4716 > ~/.ssh/id_edssh.pem
Connessione SSH alla VM con un client SSH
Con la chiave pubblica distribuita nella VM di Azure e la chiave privata nel sistema locale, stabilire una connessione SSH alla VM usando l'indirizzo IP o il nome DNS della VM. Sostituire azureuser e myvm.westus.cloudapp.azure.com nel comando seguente con il nome utente dell'amministratore e il nome di dominio completo (o indirizzo IP):
ssh azureuser@myvm.westus.cloudapp.azure.com
Se durante la creazione della coppia di chiavi è stata specificata una passphrase, immetterla quando viene richiesta durante la procedura di accesso. Il server viene aggiunto alla cartella ~/.ssh/known_hosts
e non verrà chiesto di connettersi di nuovo finché la chiave pubblica nella VM di Azure non viene modificata o il nome server viene rimosso da ~/.ssh/known_hosts
.
Se la macchina virtuale usa i criteri di accesso JIT, è necessario richiedere l'accesso per connettersi alla macchina virtuale. Per altre informazioni sui criteri JIT, vedere Gestire l'accesso alle macchine virtuali con la funzionalità JIT (Just-in-Time).
Usare ssh-agent per archiviare la passphrase della chiave privata
Per evitare di digitare la passphrase del file di chiave privata con ogni accesso SSH, è possibile usare ssh-agent
per memorizzare nella cache la passphrase del file di chiave privata nel sistema locale. Se si usa un Mac, il portachiavi macOS archivia in modo sicuro le passphrase delle chiavi private quando si chiama ssh-agent
.
Verificare e usare ssh-agent
e ssh-add
per fornire informazioni al sistema SSH sui file delle chiavi, in maniera che non sia necessario usare la passphrase in modo interattivo.
eval "$(ssh-agent -s)"
Ora aggiungere la chiave privata a ssh-agent
usando il comando ssh-add
.
ssh-add ~/.ssh/id_rsa
or
ssh-add ~/.ssh/id_ed25519
La passphrase della chiave privata è ora archiviata in ssh-agent
.
Uso di ssh-copy-id per copiare la chiave in una VM esistente
Se è già stata creata una macchina virtuale, è possibile aggiungere una nuova chiave pubblica SSH alla macchina virtuale Linux usando ssh-copy-id
.
ssh-copy-id -i ~/.ssh/id_rsa.pub azureuser@myserver
Creare e configurare un file config SSH
Si può creare e configurare un file di configurazione SSH (~/.ssh/config
) per velocizzare gli accessi e ottimizzare il comportamento del client SSH.
L'esempio seguente mostra una semplice configurazione che è possibile usare per accedere rapidamente come utente a una macchina virtuale specifica usando la chiave privata SSH predefinita.
Creare il file .
touch ~/.ssh/config
Modificare il file per aggiungere la nuova configurazione SSH
vim ~/.ssh/config
Aggiungere le impostazioni di configurazione appropriate per la VM host. In questo esempio, il nome della macchina virtuale (Host) è myvm, il nome dell'account (Utente) è azureuser e l'indirizzo IP o il nome di dominio completo (nome host) è 192.168.0.255.
# Azure Keys
Host myvm
Hostname 192.168.0.255
User azureuser
# ./Azure Keys
È possibile aggiungere configurazioni per host aggiuntivi per consentire a ciascuno di usare la propria coppia di chiavi dedicata. Per altre opzioni di configurazione avanzate, vedere File di configurazione SSH.
Ora che si dispone di una coppia di chiavi SSH e di un file di configurazione SSH configurato, è possibile accedere in remoto alla macchina virtuale Linux in modo rapido e sicuro. Quando si esegue il comando seguente, SSH individua e carica tutte le impostazioni dal blocco Host myvm
nel file di configurazione SSH.
ssh myvm
La prima volta che si accede a un server usando una chiave SSH, il comando richiede la passphrase per il file della chiave.
Passaggi successivi
Il prossimo passaggio consiste nel creare VM Linux di Azure usando la nuova chiave pubblica SSH. Le macchine virtuali di Azure create con una chiave pubblica SSH per l'accesso sono più protette rispetto alle macchine virtuali create con il metodo di accesso predefinito basato su password.