Guida passo-passo all'autenticazione SSH sicura basata su chiave

Configura un'autenticazione SSH sicura basata su chiave con chiavi ED25519, authorized_keys, ssh-agent e impostazioni sshd più sicure.

Guida passo-passo all'autenticazione SSH sicura basata su chiave

L'autenticazione SSH basata su chiave protegge il tuo server da molti attacchi basati su password, ma solo se generi la chiave con attenzione, installi la chiave pubblica correttamente e testi l'accesso prima di modificare le impostazioni del server.

Questa guida ti accompagna attraverso la generazione di chiavi ED25519, l'installazione della chiave pubblica, il test di accesso e le impostazioni più sicure del demone SSH.

Comprendere l'autenticazione SSH basata su chiave

L'autenticazione SSH basata su chiave si basa su una coppia di chiavi crittograficamente collegate: una chiave privata e una chiave pubblica.

  • Chiave privata: Questa chiave deve rimanere segreta e protetta sulla tua macchina locale. È come una password estremamente complessa che solo tu possiedi.
  • Chiave pubblica: Questa chiave può essere condivisa liberamente e viene posizionata sul server remoto a cui desideri accedere. Viene utilizzata dal server per verificare la tua identità.

Quando tenti di connetterti, il server utilizza la tua chiave pubblica per sfidare la tua macchina locale. La tua macchina locale utilizza quindi la sua chiave privata per rispondere a questa sfida, dimostrando la tua identità senza mai inviare la chiave privata sulla rete. Questo metodo non solo è più sicuro, ma anche più comodo, poiché elimina la necessità di digitare una password per ogni connessione una volta configurato correttamente.

Passo 1: Generare la tua coppia di chiavi SSH

L'utilità ssh-keygen viene utilizzata per creare nuove coppie di chiavi SSH. Si consiglia di utilizzare algoritmi moderni e robusti come ED25519.

Scegli un tipo di chiave e una forza

Mentre le chiavi RSA sono ancora ampiamente utilizzate, ED25519 offre un'eccellente sicurezza con lunghezze di chiave più brevi e operazioni più veloci. Per le nuove configurazioni, ED25519 è generalmente preferito.

Genera la coppia di chiavi

Sulla tua macchina locale (client), apri il terminale ed esegui il seguente comando:

ssh-keygen -t ed25519 -C "[email protected]"
  • -t ed25519: Specifica il tipo di chiave come ED25519.
  • -C "[email protected]": Aggiunge un commento alla chiave pubblica, spesso utilizzato per l'identificazione. Sostituisci con la tua email effettiva o un'etichetta descrittiva.

Il comando ti chiederà una posizione in cui salvare la chiave e una passphrase opzionale.

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/tuoutente/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/tuoutente/.ssh/id_ed25519
Your public key has been saved in /home/tuoutente/.ssh/id_ed25519.pub
The key fingerprint is: SHA256:...
The key's randomart image is: ...

Imposta una passphrase forte (altamente raccomandato)

Quando richiesto, imposta sempre una passphrase forte per la tua chiave privata. Questa passphrase crittografa la tua chiave privata sulla tua macchina locale, fornendo un ulteriore livello di sicurezza. Se la tua chiave privata dovesse mai cadere in mani sbagliate, sarà inutile senza la passphrase. Puoi utilizzare ssh-agent per evitare di digitare la passphrase ripetutamente (vedi Passo 4).

Posizioni dei file delle chiavi

Per impostazione predefinita, ssh-keygen salva la tua chiave privata in ~/.ssh/id_ed25519 e la tua chiave pubblica in ~/.ssh/id_ed25519.pub.

Permessi per la tua chiave privata

È fondamentale che il file della tua chiave privata abbia permessi molto restrittivi. Solo il proprietario dovrebbe essere in grado di leggerlo. ssh-keygen di solito imposta questo correttamente, ma è bene verificare:

chmod 600 ~/.ssh/id_ed25519

Passo 2: Distribuire la tua chiave pubblica al server

Una volta generata la coppia di chiavi, la tua chiave pubblica deve essere copiata sul server remoto a cui desideri accedere. Dovrebbe essere inserita in un file chiamato authorized_keys all'interno della directory ~/.ssh/ del tuo utente sul server remoto.

Metodo 1: Utilizzare ssh-copy-id (Raccomandato)

ssh-copy-id è il metodo più semplice e sicuro. Si connette al server remoto (usando la tua password), crea la directory ~/.ssh se non esiste, imposta i permessi corretti e aggiunge la tua chiave pubblica a ~/.ssh/authorized_keys.

ssh-copy-id utente@ip_del_tuo_server

Sostituisci utente con il tuo nome utente sul server remoto e ip_del_tuo_server con l'indirizzo IP o il nome host del server. Ti verrà chiesta la password sul server remoto.

Metodo 2: Copia manuale

Se ssh-copy-id non è disponibile, puoi copiare manualmente la chiave pubblica.

  1. Copia il contenuto della chiave pubblica dalla tua macchina locale:

    cat ~/.ssh/id_ed25519.pub
    

    Copia l'intero output negli appunti (inizia con ssh-ed25519 ...).

  2. Accedi al server remoto usando la tua password:

    ssh utente@ip_del_tuo_server
    
  3. Crea la directory ~/.ssh se non esiste e imposta i permessi:

    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    
  4. Aggiungi la tua chiave pubblica a authorized_keys:

    echo "INCOLLA_LA_TUA_CHIAVE_PUBBLICA_QUI" >> ~/.ssh/authorized_keys
    

    Assicurati di sostituire INCOLLA_LA_TUA_CHIAVE_PUBBLICA_QUI con il contenuto effettivo che hai copiato. Usare >> (aggiungi) è importante per evitare di sovrascrivere chiavi esistenti, se presenti.

  5. Imposta i permessi corretti per authorized_keys:

    chmod 600 ~/.ssh/authorized_keys
    
    • Attenzione: Permessi errati su ~/.ssh o ~/.ssh/authorized_keys impediranno il funzionamento dell'autenticazione basata su chiave.

Passo 3: Testare la tua autenticazione SSH basata su chiave

Prima di procedere a disabilitare l'autenticazione tramite password, è assolutamente fondamentale verificare che l'autenticazione basata su chiave funzioni correttamente. Esci dal server remoto se sei ancora connesso dai passaggi di copia manuale.

Dalla tua macchina locale, prova a connetterti al server senza specificare una password:

ssh utente@ip_del_tuo_server
  • Se hai impostato una passphrase per la tua chiave privata, ti verrà chiesto di inserirla.
  • Se la connessione ha successo senza una richiesta di password (dopo la passphrase, se applicabile), la tua autenticazione basata su chiave funziona. Dovresti vedere il prompt del server remoto.

NON procedere al Passo 4 se non riesci ad accedere usando la tua chiave SSH. Risolvi eventuali problemi prima di disabilitare l'autenticazione tramite password, altrimenti rischi di rimanere bloccato fuori dal server.

Passo 4: Migliorare la sicurezza - Disabilitare l'autenticazione tramite password

Una volta confermato che l'autenticazione SSH basata su chiave funziona, puoi disabilitare gli accessi basati su password sul tuo server per migliorare significativamente la sicurezza. Questo impedisce attacchi di forza bruta contro la tua password e garantisce che solo coloro che possiedono chiavi SSH valide possano accedere al server.

  1. Accedi al tuo server remoto usando la tua chiave SSH.

    ssh utente@ip_del_tuo_server
    
  2. Modifica il file di configurazione del demone SSH. Questo file si trova tipicamente in /etc/ssh/sshd_config.

    sudo nano /etc/ssh/sshd_config
    

    (Puoi usare vi o il tuo editor di testo preferito invece di nano.)

  3. Trova e modifica le seguenti direttive:

    • Trova PasswordAuthentication e cambia il suo valore in no.

      #PasswordAuthentication yes
      PasswordAuthentication no
      

      (Rimuovi il commento dalla riga se è commentata con #)

    • Trova KbdInteractiveAuthentication e cambia il suo valore in no. Sulle versioni più vecchie di OpenSSH, la direttiva equivalente potrebbe essere ChallengeResponseAuthentication.

      KbdInteractiveAuthentication no
      
    • (Opzionale ma raccomandato) Considera di disabilitare l'accesso diretto di root tramite SSH se prevedi di usare sudo dopo aver effettuato l'accesso come utente normale.

      PermitRootLogin no
      
    • (Opzionale) Considera di cambiare la porta SSH predefinita da 22 a una porta alta non standard (ad esempio, 2222). Questo non aggiunge sicurezza contro attacchi mirati ma può ridurre il rumore da scanner di porte automatici.

      #Port 22
      Port 2222
      

      Se cambi la porta, ricordati di specificarla con il flag -p quando ti connetti (ad esempio, ssh -p 2222 utente@ip_del_tuo_server).

  4. Salva le modifiche ed esci dall'editor di testo.

  5. Riavvia il servizio SSH per applicare la nuova configurazione. Il comando varia leggermente a seconda del sistema operativo (ad esempio, Ubuntu/Debian vs. CentOS/RHEL).

    • Sistemi basati su Systemd (la maggior parte delle distribuzioni Linux moderne):

      sudo sshd -t
      sudo systemctl restart sshd
      
    • Sistemi basati su SysVinit più vecchi:

      sudo service ssh restart
      
  6. Fondamentalmente, apri una nuova finestra del terminale (non chiudere la tua sessione SSH attuale!) e prova ad accedere usando la tua chiave. Questo testa la nuova configurazione senza bloccarti se qualcosa è andato storto.

    ssh utente@ip_del_tuo_server
    

    Se hai cambiato la porta:

    ssh -p 2222 utente@ip_del_tuo_server
    

    Se la connessione ha successo, ora puoi chiudere in sicurezza la tua sessione SSH originale.

    Se il nuovo accesso fallisce, ripristina immediatamente le modifiche in sshd_config nella tua sessione SSH originale ancora attiva e riavvia di nuovo il servizio SSH, quindi rivaluta.

Migliori pratiche e suggerimenti

  • Usa sempre una passphrase forte per la tua chiave privata. Questa è la tua ultima linea di difesa se la tua chiave privata viene compromessa.
  • Proteggi la tua chiave privata. Non condividerla mai e assicurati che sia archiviata in modo sicuro con permessi di file rigorosi (chmod 600 ~/.ssh/id_ed25519). Considera moduli di sicurezza hardware (HSM) o YubiKeys per la massima protezione.
  • Usa ssh-agent per comodità. ssh-agent ti permette di caricare la tua chiave o le tue chiavi private in memoria e digitare la passphrase solo una volta per sessione, anche attraverso più connessioni SSH. Aggiungi la tua chiave all'agente con ssh-add ~/.ssh/id_ed25519.
  • Ruota regolarmente le tue chiavi SSH. Genera periodicamente nuove coppie di chiavi e rimuovi le vecchie chiavi pubbliche dai tuoi server, specialmente se un membro del team lascia o si sospetta che la sicurezza di una chiave sia compromessa.
  • Limita PermitRootLogin a no o prohibit-password. È generalmente meglio accedere come utente normale e usare sudo per le attività amministrative.
  • Configura un firewall. Assicurati che solo le porte necessarie (come la tua porta SSH) siano aperte a Internet. Strumenti come ufw o firewalld possono aiutare.

Conclusione finale

La tua chiave privata è ora la tua principale credenziale di accesso, quindi proteggila con una passphrase e permessi di file rigorosi. Tieni una sessione SSH testata aperta mentre modifichi sshd_config, convalida la configurazione con sshd -t e chiudi la vecchia sessione solo dopo che un nuovo accesso basato su chiave funziona.