Premessa
OpenSSH permette di autenticare un utente su un server SSH con uno scambio di chiavi, evitando l’utilizzo di password.
Il principio su cui si basa l’autenticazione prevede l’inserimento di una chiave pubblica, di cui solo noi conosciamo la corrispondente chiave privata1, nella configurazione SSH del server al quale vogliamo collegarci.
La chiave pubblica può essere condivisa, può essere usata per criptare messaggi che solo la chiave privata associata può decifrare.
La chiave pubblica dovrà essere caricata sul server SSH, aggiungendola al file ~/.ssh/authorized_keys dell’account utente con il quale intendiamo connetterci.
OpenSSH è integrato in un’ampia varietà di sistemi operativi, a partire dall’originario OpenBSD fino alle versioni più recenti di Microsoft Windows2.
Per esemplificare la procedura di creazione delle chiavi SSH, utilizzeremo due macchine Linux, un client Ubuntu ed un server Debian.
Creazione della coppia di chiavi SSH
Sul computer locale utilizziamo il comando ssh-keygen per generare la nostra coppia di chiavi SSH:
ssh-keygen
Il comando propone una serie di domande per le quali possiamo confermare le opzioni predefinite3.
All’interno della cartella .ssh nella home dell’utente locale, avremo la chiave privata id_rsa e la corrispondente chiave pubblica id_rsa.pub
Copia della chiave pubblica nel server SSH
Ci sono diversi modi per copiare la nostra chiave pubblica nel server SSH remoto.
– Copia con il comando ssh-copy-id
Il metodo più semplice per copiare la chiave pubblica è quello fornito dall’utilità ssh-copy-id. Il comando è incluso in OpenSSH in molte distribuzioni e per poterlo utilizzare è necessario avere le credenziali di accesso in SSH con password al server. La chiave pubblica sarà copiata nella home dell’account di cui abbiamo le credenziali di accesso in SSH.
ssh-copy-id username@remote_server
In questo modo, una volta collegati al server con le credenziali fornite, il contenuto della chiave pubblica id_rsa.pub verrà inserito nel file authorized_key all’interno della cartella ~/.ssh nella home dell’account remoto.
– Copia con SSH
Se non possiamo utilizzare ssh-copy-id, ma abbiamo le credenziali di accesso di un account al server, possiamo copiare la nostra chiave pubblica semplicemente con ssh:
cat ~/.ssh/id_rsa.pub | ssh username@remote_server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
– Copia manuale
Se non abbiamo accesso SSH basato su password al server, dovremo copiare manualmente in altro modo il contenuto della chiave pubblica nel file ~/.ssh/authorized_keys sul server remoto.
Per mostrare il contenuto della chiave id_rsa.pub:
cat ~/.ssh/id_rsa.pub
Accediamo al server remoto nel modo che ci è possibile (ad esempio il pannello di controllo fornito dall’hosting provider e disponibile via web).
Il seguente comando, se necessario, crea la cartella ~/.ssh nella home dell’utente sul server remoto:
mkdir -p ~/.ssh
Qui possiamo creare o modificare il file authorized_keys, aggiungendo alla fine del file il contenuto del nostro id_rsa.pub:
echo public_key_string >> ~/.ssh/authorized_keys
Al posto di public_key_string bisognerà inserire l’output del comando cat ~/.ssh/id_rsa.pub (nell’esempio di cui sopra, sarà “ssh-rsa AAAAB3[…]utente@ubupc”).
Collegamento al server con le chiavi SSH
Possiamo quindi collegarci al server senza necessità di password:
ssh username@remote_server
Se non abbiamo configurato una passphrase per la nostra chiave privata, ci collegheremo al server immediatamente. Nel caso avessimo definito una passphrase al momento della creazione della chiave, questa ci verrà richiesta prima di poterci collegare al server.
Disabilitare l’accesso SSH basato su password
Prima di procedere, assicuriamoci di avere accesso SSH al server con autenticazione basata su chiave4.
Apriamo il file di configurazione di SSH:
sudo nano /etc/ssh/sshd_config
Ricerchiamo la direttiva PasswordAuthentication, rimuoviamo il carattere # se presente all’inizio della riga, e impostiamo il valore su no:
Salviamo il file e, per rendere effettivo il cambiamento, facciamo ripartire il servizio:
sudo systemctl restart ssh