Comprensione dell'autenticazione tramite chiave SSH: Spiegate le chiavi pubbliche e private
SSH (Secure Shell) è la spina dorsale dell'accesso remoto sicuro ai server, consentendo ad amministratori e sviluppatori di gestire i sistemi da qualsiasi luogo. Sebbene l'autenticazione basata su password sia un metodo comune, spesso presenta vulnerabilità di sicurezza. L'alternativa preferita dal settore e significativamente più sicura è l'autenticazione tramite chiave SSH.
Questo articolo mira a demistificare l'autenticazione tramite chiave SSH, spiegando chiaramente i ruoli fondamentali delle chiavi pubbliche e private. Approfondiremo come queste controparti crittografiche lavorano insieme per proteggere le tue connessioni remote, fornendo una solida difesa contro l'accesso non autorizzato. Alla fine, capirai perché questo metodo non è solo più sicuro dei tradizionali accessi basati su password, ma anche più conveniente per l'uso quotidiano.
Il problema delle password
L'autenticazione tradizionale basata su password si basa su un segreto condiviso: la password. Sebbene le password complesse possano fornire un buon livello di sicurezza, sono suscettibili a diverse debolezze:
- Attacchi a forza bruta: Gli aggressori possono provare innumerevoli combinazioni di password finché non indovinano quella corretta.
- Attacchi a dizionario: Utilizzando parole o frasi comuni, gli aggressori possono compromettere rapidamente gli account.
- Keylogger: Software malevolo può catturare le sequenze di tasti, rivelando le password.
- Phishing: Tattiche di ingegneria sociale possono indurre gli utenti a divulgare le proprie credenziali.
- Errore umano: Gli utenti spesso scelgono password deboli, facili da indovinare o riutilizzate, e potrebbero esporle accidentalmente.
L'autenticazione tramite chiave SSH mitiga questi rischi eliminando la necessità di trasmettere un segreto sulla rete, rendendola una scelta superiore per la protezione della tua infrastruttura remota.
Autenticazione tramite chiave SSH: Una panoramica
L'autenticazione tramite chiave SSH sfrutta la crittografia asimmetrica, un sistema che utilizza una coppia di chiavi matematicamente collegate: una chiave pubblica e una chiave privata. A differenza della crittografia simmetrica, dove la stessa chiave è usata sia per la crittografia che per la decrittografia, la crittografia asimmetrica usa una chiave per la crittografia e una chiave diversa, ma correlata, per la decrittografia.
Quando tenti di connetterti a un server SSH utilizzando le chiavi, il server sfida il tuo client, e il tuo client prova la sua identità utilizzando la sua chiave privata senza mai inviare la chiave privata stessa sulla rete. Questo processo garantisce che solo i client in possesso della chiave privata corretta possano stabilire una connessione con i server configurati per fidarsi della chiave pubblica corrispondente.
Il duo crittografico: Chiavi pubbliche e private
Al centro dell'autenticazione tramite chiave SSH ci sono questi due componenti distinti, ma interconnessi.
La Chiave Privata
La chiave privata è la tua identità segreta. È una lunga e complessa stringa di caratteri che deve essere mantenuta assolutamente confidenziale e mai condivisa con nessuno. Pensala come la chiave unica della tua cassaforte digitale.
- Critica per la sicurezza: Se la tua chiave privata viene compromessa, un aggressore potrebbe impersonarti e ottenere accesso non autorizzato a qualsiasi server in cui è stata distribuita la chiave pubblica corrispondente.
- Posizione: Tipicamente archiviata sulla tua macchina locale (ad es.,
~/.ssh/id_rsa,~/.ssh/id_ed25519). - Protezione: È spesso protetta da una passphrase, aggiungendo un ulteriore livello di sicurezza. Anche se un aggressore ottiene l'accesso al file della tua chiave privata, non potrà usarla senza la passphrase.
La Chiave Pubblica
La chiave pubblica è la controparte della tua chiave privata. Deriva dalla tua chiave privata ma non può essere usata per ricreare la chiave privata. Come suggerisce il nome, la chiave pubblica è destinata a essere condivisa e posizionata su qualsiasi server a cui desideri accedere.
- Condivisibile: Puoi distribuire in sicurezza la tua chiave pubblica a chiunque o a qualsiasi server senza compromettere la tua sicurezza.
- Posizione: Sul server, le chiavi pubbliche sono tipicamente archiviate nel file
~/.ssh/authorized_keysper ogni account utente. Ogni riga in questo file rappresenta una chiave pubblica attendibile. - Ruolo: La chiave pubblica agisce come un'impronta digitale. Quando tenti di connetterti, il server usa la tua chiave pubblica per verificare che tu possieda la chiave privata corrispondente senza mai vedere la chiave privata stessa.
Come funziona l'autenticazione tramite chiave SSH: L'Handshake
Analizziamo il processo passo-passo di come l'autenticazione tramite chiave SSH stabilisce una connessione sicura:
- Generazione della Coppia di Chiavi: Per prima cosa, generi una coppia di chiavi pubblica e privata sulla tua macchina locale. La chiave privata rimane segreta e la chiave pubblica è quella che distribuirai.
- Distribuzione della Chiave Pubblica: Copi la tua chiave pubblica sul server remoto a cui desideri accedere. Questa chiave viene tipicamente aggiunta al file
~/.ssh/authorized_keysnella directory home del tuo utente sul server. - Tentativo di Connessione: Quando avvii una connessione SSH dalla tua macchina locale al server remoto, il tuo client SSH indica che desidera autenticarsi usando una chiave.
- Sfida del Server: Il server, avendo la tua chiave pubblica, genera una stringa casuale di dati (una "sfida") e la cripta usando la tua chiave pubblica.
- Risposta del Client: Il server invia questa sfida crittografata al tuo client SSH. Il tuo client usa quindi la tua chiave privata per decriptare la sfida.
- Verifica: Il tuo client quindi cripta la stringa casuale originale (o un suo derivato, insieme ai dati di sessione) usando la tua chiave privata e la invia di nuovo al server. Il server usa la tua chiave pubblica per decriptare questa risposta. Se il valore decriptato corrisponde alla sfida originale, il server è certo che tu possieda la chiave privata corretta.
- Autenticazione Concessa: Se la verifica ha successo, il server ti concede l'accesso e viene stabilita una sessione SSH sicura.
Fondamentale, la tua chiave privata non lascia mai la tua macchina locale durante l'intero processo. Vengono scambiati solo prove crittografiche derivate da essa.
Generazione di una coppia di chiavi SSH
Generare una coppia di chiavi SSH è un processo semplice che utilizza il comando ssh-keygen sulla tua macchina locale (Linux, macOS o WSL/Git Bash su Windows).
ssh-keygen -t ed25519 -C "[email protected]"
-t ed25519: Specifica il tipo di chiave da creare.ed25519è un algoritmo moderno, altamente sicuro ed efficiente. Anchersaè comune, maed25519è generalmente preferito ora.-C "[email protected]": Aggiunge un commento alla chiave pubblica, che ti aiuta a identificarne lo scopo o il proprietario.
Ti verrà chiesto un file per salvare la chiave (il valore predefinito è ~/.ssh/id_ed25519) e una passphrase. Usa sempre una passphrase robusta per proteggere la tua chiave privata.
Generazione della coppia di chiavi pubblica/privata ed25519.
Immettere il file in cui salvare la chiave (~/.ssh/id_ed25519):
Directory '/home/youruser/.ssh' creata.
Immettere la passphrase (vuota per nessuna passphrase):
Immettere di nuovo la stessa passphrase:
La tua identificazione è stata salvata in /home/youruser/.ssh/id_ed25519.
La tua chiave pubblica è stata salvata in /home/youruser/.ssh/id_ed25519.pub.
L'impronta della chiave è: SHA256:...
L'immagine randomart della chiave è:
+--[ED25519 256]----+
| .=+ |
| . o. . |
| . + o. |
| o = B o. |
| . S @ + + |
| = + B . |
| o * * E |
| . o o |
| . . |
+----[SHA256]-------+
Dopo la generazione, avrai due file nella tua directory ~/.ssh:
id_ed25519(la tua chiave privata)id_ed25519.pub(la tua chiave pubblica)
Avvertenza: Assicurati che il file della tua chiave privata (id_ed25519) abbia permessi stretti (ad es., chmod 600 ~/.ssh/id_ed25519) in modo che solo tu possa leggerlo/scriverlo.
Distribuzione della tua chiave pubblica
Per usare l'autenticazione tramite chiave, la tua chiave pubblica deve essere posizionata sul server remoto a cui desideri accedere.
Usare ssh-copy-id (Consigliato)
L'utility ssh-copy-id è il modo più semplice e sicuro per distribuire la tua chiave pubblica. Gestisce la creazione della directory ~/.ssh e del file authorized_keys con i permessi corretti, se non esistono.
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host
Sostituisci user con il tuo nome utente sul server remoto e remote_host con l'indirizzo IP o il nome host del server. Ti verrà chiesta la tua password per user@remote_host un'ultima volta per caricare la chiave.
Distribuzione Manuale
Se ssh-copy-id non è disponibile, puoi copiare la chiave pubblica manualmente:
-
Copia il contenuto della chiave pubblica: Visualizza la tua chiave pubblica usando
cat.
bash cat ~/.ssh/id_ed25519.pub
Copia l'intero output, che inizia conssh-ed25519 ...e finisce con il tuo commento. -
Accedi al server remoto tramite SSH utilizzando l'autenticazione con password:
bash ssh user@remote_host
Inserisci la tua password quando richiesto. -
Crea la directory
~/.sshe il fileauthorized_keysse non esistono:
bash mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys -
Aggiungi la tua chiave pubblica ad
authorized_keys: Incolla il contenuto della chiave pubblica che hai copiato in precedenza nel fileauthorized_keys.
bash echo "ssh-ed25519 AAAA..." >> ~/.ssh/authorized_keys
(Sostituiscissh-ed25519 AAAA...con il contenuto effettivo della tua chiave pubblica)
Connessione con chiavi SSH
Una volta che la tua chiave pubblica è sul server, puoi connetterti semplicemente specificando l'utente e l'host:
ssh user@remote_host
Se hai più coppie di chiavi o la tua chiave privata non si trova nella posizione predefinita (~/.ssh/id_rsa o ~/.ssh/id_ed25519), potresti doverla specificare usando l'opzione -i:
ssh -i ~/.ssh/my_custom_key user@remote_host
Se la tua chiave privata è protetta da una passphrase, ti verrà chiesto di inserirla. Per evitare di inserire la passphrase ripetutamente durante una sessione, puoi usare ssh-agent.
Vantaggi di sicurezza dell'autenticazione tramite chiave SSH
- Elimina l'indovinamento delle password: Poiché le password non vengono utilizzate per l'autenticazione, gli attacchi a forza bruta contro la tua password diventano impossibili.
- Credenziali più robuste: Le chiavi SSH sono tipicamente valori crittografici a 2048 bit (RSA) o 256 bit (Ed25519), il che le rende enormemente più complesse e difficili da decifrare rispetto anche alle password generate dall'uomo più robuste.
- Nessuna trasmissione del segreto: La tua chiave privata non lascia mai la tua macchina locale, riducendo significativamente il rischio che venga intercettata o rubata durante l'autenticazione.
- Adatto all'automazione: Le chiavi consentono accessi scriptabili e senza password, essenziali per gli strumenti di automazione e le pipeline CI/CD.
- Protezione tramite Passphrase: L'aggiunta di una passphrase alla tua chiave privata fornisce un ulteriore livello di sicurezza. Anche se il file della tua chiave privata viene rubato, rimane inutilizzabile senza la passphrase.
Gestione delle tue chiavi SSH
ssh-agent
ssh-agent è un programma che viene eseguito in background e mantiene le tue chiavi private decifrate in memoria. Quando tenti di connetterti a un server SSH, il tuo client SSH può interrogare ssh-agent per la chiave privata necessaria, eliminando la necessità di digitare la passphrase ripetutamente.
Per avviare ssh-agent e aggiungere la tua chiave:
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
Dovrai inserire la tua passphrase una volta sola quando aggiungi la chiave all'agente.
Naming e Organizzazione delle Chiavi
Per gestire più chiavi (ad es., per diverse organizzazioni, progetti o uso personale), considera l'uso di nomi significativi:
ssh-keygen -t ed25519 -f ~/.ssh/id_work_project -C "work_project_key"
ssh-keygen -t ed25519 -f ~/.ssh/id_personal_github -C "personal_github_key"
Puoi quindi specificare quale chiave usare con l'opzione -i, oppure configurare il tuo file ~/.ssh/config per selezionare automaticamente la chiave corretta in base all'host.
Esempio di ~/.ssh/config:
Host github.com
IdentityFile ~/.ssh/id_personal_github
User git
Host work-server
Hostname 192.168.1.100
IdentityFile ~/.ssh/id_work_project
User devuser
Migliori Pratiche e Consigli
- Non condividere mai la tua chiave privata: Questa è la regola d'oro. La tua chiave privata è la tua identità digitale.
- Usa una passphrase robusta: Proteggi la tua chiave privata con una passphrase robusta, simile a una password complessa. Questo rende la tua chiave inutile anche se dovesse cadere nelle mani sbagliate.
- Ruota regolarmente le chiavi: Genera periodicamente nuove chiavi e revoca quelle vecchie, soprattutto se sospetti che una chiave possa essere stata compromessa.
- Limita i permessi dei file: Assicurati che il file della tua chiave privata abbia permessi
600(rw-------) e che la tua directory~/.sshabbia700(rwx------). - Disabilita l'autenticazione tramite password sui server: Una volta impostata l'autenticazione tramite chiave, considera di disabilitare l'autenticazione tramite password per SSH sui tuoi server per migliorare drasticamente la sicurezza. Questo viene spesso fatto impostando
PasswordAuthentication noin/etc/ssh/sshd_config. - Usa
ssh-agent: Per comodità e sicurezza, usassh-agentper gestire le tue chiavi, specialmente quelle con passphrase.
Conclusione
L'autenticazione tramite chiave SSH offre un metodo robusto, sicuro e conveniente per accedere ai server remoti. Comprendendo i ruoli distinti delle chiavi pubbliche e private e come interagiscono nell'handshake crittografico, puoi migliorare significativamente la tua sicurezza operativa. Passare dagli accessi basati su password alle chiavi SSH è un passo fondamentale verso una migliore gestione dei server e una protezione contro i vettori di attacco comuni. Adotta questo potente meccanismo di sicurezza per salvaguardare la tua infrastruttura digitale.