Procedura dettagliata: Creare e gestire chiavi SSH per l'autenticazione in una VM Linux di Azure

Si applica a: ✔️ Set di scalabilità flessibili di macchine virtuali ✔️ Linux

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 solo l'utente (o l'infrastruttura di sicurezza locale) deve avere accesso alla chiave privata.

Formati di chiave SSH supportati

Attualmente Azure supporta il protocollo SSH 2 (SSH-2) e le coppie di chiavi pubblica e privata basate su RSA con una lunghezza minima di 2.048 bit. Altri formati di chiave, ad esempio ED25519 ed ECDSA, non sono 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

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/myprivatekey \
    -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

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]-----+

I file delle chiavi salvati

Enter file in which to save the key (/home/azureuser/.ssh/id_rsa): ~/.ssh/id_rsa

Nome della coppia di chiavi per questo articolo. Per impostazione predefinita viene creata una coppia di chiavi denominata id_rsa; alcuni strumenti potrebbero aspettarsi un file della chiave privata con il nome id_rsa, quindi è utile averlo. 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.

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

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 . 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.

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:

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 in formato RFC4716 da una chiave pubblica SSH esistente:

ssh-keygen \
-f ~/.ssh/id_rsa.pub \
-e \
-m RFC4716 > ~/.ssh/id_ssh2.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

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.