Come generare e mettere in sicurezza le chiavi SSH per l'accesso remoto

Padroneggia l'accesso remoto sicuro imparando a generare robuste coppie di chiavi SSH utilizzando `ssh-keygen`. Questa guida tratta le migliori pratiche per la selezione dei tipi di chiave (Ed25519), la messa in sicurezza della tua chiave privata con una passphrase, il dispiegamento efficiente della chiave pubblica tramite `ssh-copy-id` e l'utilizzo di `ssh-agent` per un'autenticazione senza interruzioni. Assicurati che la tua infrastruttura sia protetta dagli attacchi di forza bruta implementando il controllo degli accessi basato su chiavi.

Come Generare e Proteggere le Chiavi SSH per l'Accesso Remoto

Secure Shell (SSH) è il metodo standard per connettersi a server remoti. Se usi ancora le password per l'accesso quotidiano, le chiavi SSH offrono un'autenticazione più forte e eliminano il rischio di tentativi di indovinare la password per quell'account.

Questa guida mostra come generare chiavi SSH, proteggere la chiave privata con una passphrase, installare la chiave pubblica su un server e utilizzare ssh-agent per non dover digitare la passphrase a ogni connessione.

Comprendere le Coppie di Chiavi SSH

Una coppia di chiavi SSH è composta da due componenti distinti:

  1. La Chiave Privata: Questa chiave non deve mai essere condivisa. Rimane in modo sicuro sulla tua macchina locale e viene utilizzata per dimostrare la tua identità al server remoto.
  2. La Chiave Pubblica: Questa chiave è liberamente condivisa e caricata nel file ~/.ssh/authorized_keys sul/i server remoto/i a cui desideri accedere. Il server utilizza questa chiave per verificare la firma generata dalla tua chiave privata.

Scegliere l'Algoritmo Giusto

Quando generi le chiavi, scegli un algoritmo moderno. Ed25519 è un buon default per i client OpenSSH attuali perché è veloce, compatto e ampiamente supportato. RSA funziona ancora ed è utile quando devi connetterti a sistemi più vecchi che non supportano Ed25519.

Passo 1: Generare la Coppia di Chiavi SSH

L'utilità ssh-keygen è lo strumento standard per creare coppie di chiavi SSH su Linux, macOS e Windows (tramite Git Bash o WSL).

Generare una Chiave Ed25519 (Consigliato)

Per creare una chiave Ed25519 moderna, usa il seguente comando. Specifichiamo il tipo di chiave (-t ed25519) e forniamo un commento (-C) per aiutare a identificare lo scopo o il proprietario della chiave:

ssh-keygen -t ed25519 -C "[email protected]_o_nome_host"

Quando richiesto:

  1. Inserisci il file in cui salvare la chiave: Premi Invio per accettare la posizione predefinita (/home/utente/.ssh/id_ed25519).
  2. Inserisci passphrase (consigliata): Imposta una passphrase forte per le chiavi utilizzate al di fuori dei sistemi di laboratorio usa e getta. Questo crittografa la tua chiave privata, quindi un file di chiave rubato non è immediatamente utilizzabile.

Generare una Chiave RSA (Alternativa)

Se è richiesta la compatibilità con sistemi molto vecchi, puoi generare una chiave RSA, assicurandoti di specificare una lunghezza della chiave sufficiente (almeno 4096 bit):

ssh-keygen -t rsa -b 4096 -C "commento_tua_chiave_rsa"

File di Output della Chiave

Dopo la generazione, vengono creati due file nella tua directory ~/.ssh/ (assumendo i valori predefiniti):

  • id_ed25519 (o id_rsa): La Tua Chiave Privata
  • id_ed25519.pub (o id_rsa.pub): La Tua Chiave Pubblica

Buona pratica di sicurezza: Non condividere mai il file senza l'estensione .pub. Imposta permessi restrittivi sulla tua chiave privata con chmod 600 ~/.ssh/id_ed25519.

Passo 2: Copiare la Chiave Pubblica sul Server

Il server remoto deve avere la tua chiave pubblica nel suo file ~/.ssh/authorized_keys per concedere l'accesso.

Usare ssh-copy-id (Il Metodo Più Semplice)

L'utilità ssh-copy-id automatizza il processo, gestendo la creazione della directory e le impostazioni dei permessi sul server remoto. Dovrai autenticarti con una password un'ultima volta per questa configurazione iniziale.

ssh-copy-id utente@indirizzo_host_remoto

Se ha successo, il comando ti informerà che le chiavi sono state aggiunte. Ora puoi provare ad accedere.

Copia Manuale (Se ssh-copy-id Non è Disponibile)

Se non puoi usare ssh-copy-id, puoi aggiungere manualmente il contenuto della chiave pubblica. Per prima cosa, visualizza la chiave pubblica:

cat ~/.ssh/id_ed25519.pub

Quindi, accedi al server remoto usando la tua password e aggiungi l'output al file authorized_keys:

# Sul server remoto
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# Sostituisci <INCOLLA_QUI_LA_TUA_CHIAVE_PUBBLICA> con il contenuto effettivo della chiave
echo "<INCOLLA_QUI_LA_TUA_CHIAVE_PUBBLICA>" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Passo 3: Proteggere l'Accesso con ssh-agent

Digitare la passphrase ogni volta che ti connetti a un server diventa noioso. ssh-agent è un programma in background che conserva in modo sicuro le tue chiavi private decifrate in memoria, permettendoti di usarle senza inserire ripetutamente la passphrase.

Avviare e Usare ssh-agent

  1. Assicurati che l'agente sia in esecuzione: Sulla maggior parte dei sistemi Linux/macOS moderni, l'agente si avvia automaticamente quando accedi. Puoi controllare il suo stato cercando le variabili d'ambiente:

    echo $SSH_AUTH_SOCK
    
  2. Aggiungi la tua chiave all'agente: Usa il comando ssh-add per caricare la tua chiave privata. Ti verrà richiesta la passphrase una sola volta.

    ssh-add ~/.ssh/id_ed25519
    # Inserisci passphrase per /home/utente/.ssh/id_ed25519: **********
    # Identità aggiunta: /home/utente/.ssh/id_ed25519 (commento)
    
  3. Verifica le chiavi caricate:

    ssh-add -l
    

Ora, quando esegui ssh utente@indirizzo_host_remoto, la connessione si autenticherà utilizzando la chiave detenuta dall'agente senza chiedere nuovamente la passphrase (fino al termine della sessione dell'agente).

Note Importanti su ssh-agent

  • Dipende dalla Sessione: Le chiavi caricate nell'agente sono tipicamente disponibili solo per la sessione del terminale corrente o la sessione di login del desktop. Dovrai eseguire di nuovo ssh-add dopo esserti disconnesso e riconnesso.
  • Durata della Chiave: Puoi impostare una durata massima per le chiavi conservate nell'agente usando il flag -t (es. ssh-add -t 1h ~/.ssh/id_ed25519 mantiene la chiave caricata per un'ora).

Sicurezza Avanzata: Disabilitare l'Autenticazione tramite Password

Una volta confermato che l'autenticazione basata su chiave funziona perfettamente su tutti i server richiesti, la misura di sicurezza più forte è disabilitare completamente gli accessi basati su password. Questo previene gli attacchi di forza bruta contro le password.

  1. Connettiti al tuo server tramite SSH usando la tua chiave.

  2. Modifica il file di configurazione del demone SSH, solitamente situato in /etc/ssh/sshd_config:

    sudo nano /etc/ssh/sshd_config
    
  3. Trova e imposta le seguenti direttive:

    # Assicurati che questo sia impostato su yes (di solito predefinito)
    PubkeyAuthentication yes
    
    # Disabilita gli accessi tramite password
    PasswordAuthentication no
    
  4. Controlla la configurazione prima di riavviare:

    sudo sshd -t
    
  5. Riavvia il servizio SSH per applicare le modifiche. Il nome del servizio è comunemente sshd sui sistemi della famiglia RHEL e ssh su Debian/Ubuntu:

    sudo systemctl restart sshd
    # oppure
    sudo systemctl restart ssh
    

Attenzione: Prima di disabilitare l'autenticazione tramite password, mantieni aperta una sessione SSH funzionante e conferma che un secondo accesso funzioni con la nuova chiave. Se il riavvio fallisce o la chiave è sbagliata, avrai bisogno dell'accesso alla console o fuori banda.

Passi Successivi

Dopo che il tuo primo accesso basato su chiave funziona, tratta le chiavi SSH come credenziali di produzione:

  • Genera una coppia di chiavi unica per ogni sistema o servizio principale a cui accedi.
  • Controlla regolarmente il file authorized_keys sui server critici.
  • Rimuovi le chiavi vecchie quando le persone cambiano ruolo o le macchine vengono ritirate.
  • Usa ssh-add -t per sessioni dell'agente di breve durata su workstation condivise.