security ssh security openssh rsa ssh-agent

Utilizzare le chiavi SSH per login più comodi

Il problema: usiamo spesso ssh per connetterci a host remoti. Diventa noioso scrivere la password utente ogni volta.

La soluzione da barboni

Probabilmente avrete imparato un trucchetto, che è quello di generare una chiave ssh senza password e aggiungere la chiave pubblica nelle authorized_keys dell'host remoto. Purtroppo questo metodo è molto insicuro in quanto chiunque sia in grado di leggere il vostro hard disk può avere pieno controllo dalla chiave privata. Vi chiederete: "ma quando qualcun altro avrà pieno controllo del mio hard disk?". Beh.. chiunque può staccarlo dal computer e leggere comodamente la chiave privata. Oppure può avviare un sistema live da chiavetta o da cd e accedere a qualsiasi file, avendo i permessi di amministratore. In ogni caso, quando la sicurezza del computer che ha le chiavi private viene compromessa, di conseguenza anche gli altru host a cui fanno riferimento tali chiavi sono potenzialmente sotto il controllo del malintenzionato.

La soluzione da pro

Noi vogliamo un sistema più sicuro, e l'unico sistema veramente sicuro e inattaccabile (sempre che siate resistenti alla tortura) è il cervello: memorizzare una password. Mi direte: "ma allora torniamo all'inizio, ci dobbiamo ricordare tutte le password dei sistemi a cui ci connettiamo". E qui ci viene incontro ssh: infatti ci basterà ricordare un'unica password, quella della chiave, e non tutte le password dei vari utenti (root compreso) nei vari host a cui ci connettiamo.

Creiamo la chiave (nel computer locale)

ssh-keygen -f ~/.ssh/id_rsa

L'opzione -f ~/.ssh/id_rsa indica il percorso in cui salvare la chiave. In questo caso è opzionale, perché è il percorso predefinito (per la versione di openssh che sto usando). Se hai già una chiave salvata in quel file e preferisci crearne un'altra, puoi specificare un file diverso.

Quando ci chiede di scegliere una password, scriviamo una password abbastanza sicura (due volte).

A questo punto abbiamo due chiavi: la privata in ~/.ssh/id_rsa e la pubblica in ~/.ssh/id_rsa.pub (nel computer locale).

Con il solito metodo, basta che inseriamo la chiave pubblica nel file ~/.ssh/authorized_keys dell'host remoto e potremmo collegarci a quell'host usando la chiave appena generata. Quando ci chiederà la password, dovremo inserire quella della nostra chiave.

Esempio (senza chiave)

Io sono l'utente pez nel computer locale e la mia password è pappagallo. Vedremo che la password del computer locale non è in alcun modo collegata alla password della chiave ssh.

Mi devo connettere all'host remoto myserver come utente root che ha come password coccinella.

Di norma mi connetto con il comando

ssh root@myserver 

e inserisco la password coccinella. Quindi non ha importanza né il nome utente locale né la password locale. Se nel computer remoto fosse esistito l'utente pez e avessi voluto autenticarmi con quel nome, avrei comunque dovuto usare la password che l'utente pez ha nel computer remoto.

Esempio (con chiave)

Ho creato una chiave ssh come spiegato sopra, usando come password lucertola.

Se voglio entrare come root in myserver, copio la chiave pubblica che ho generato e la incollo nel file /root/.ssh/authorized_keys (perché /root è la cartella casa dell'utente root). Ovviamente, per far ciò, devo prima entrare nell'host remoto con il metodo classico, cioè usando la password utente, quindi senza la chiave.

Ora mi collego con questo comando:

ssh root@myserver

Il parametro -i indica di usare la chiave (identity) specificata. Quindi, a meno che non abbiamo scritto la chiave in ~/.ssh/id_rsa, dobbiamo specificare quale usare:

ssh root@myserver -i ~/.ssh/id_rsa_alternativa

Ora ssh ci chiede la password, ma specifica che vuole quella del file ~/.ssh/id_rsa. Infatti, non è più necessaria la password dell'utente root dell'host remoto, ma dobbiamo "sbloccare" la nostra chiave. Quindi in questo caso la password è lucertola.

La soluzione da ninja

A questo punto mi direte "e vabbè, sarà anche una sola password da ricordare, ma devo scriverla ogni volta che mi collego!".

E qui ci dà una mano ssh-agent. Questo programmino si ricorda la nostra password e la scrive al posto nostro quando serve. In realtà non funziona proprio così, ma il risultato è questo. Per approfondimenti, guardate ssh-agent su Wikipedia. ssh-agent è un demone, quindi rimane in esecuzione in background. Quando spegniamo il computer, il demone viene terminato, quindi all'avvio successivo è necessario inserire nuovamente la password. È anche possibile forzare il demone a dimenticare la password dopo un tot di tempo.

Questo demone non fa tutto da solo, bisogna aiutarlo, soprattutto se vogliamo che funzioni in qualsiasi terminale aperto. A tale scopo ho preparato uno script in bash per semplificarci la vita. Lo potete trovare su GitHub, a questo indirizzo: https://github.com/alepez/easy-ssh-agent

Il modo più semplice per installarlo è metterlo in /usr/local/bin/easy-ssh-agent , dargli i permessi di esecuzione 755 e aggiungere questa riga al file ~/.bashrc (oppure ~/.zshrc se usi zsh).

eval $( easy-ssh-agent start --env )

Quando apriamo un terminale per la prima volta, ci viene chiesta la password. Tutte le volte successive non ci verrà più chiesta.

Da ora in poi, usando il comando

 ssh root@myserver

non ci verrà più chiesta la password. Attenzione! Se nei passaggi successivi avevi scelto di salvare la password in un percorso diverso da quello predefinito, devi usarla così:

ssh root@myserver -i ~/.ssh/id_rsa_alternativa

In questo caso, non ci rimane altro che dire a ssh di usare sempre questa chiave (o quantomeno provarci, perché può essere che l'host remoto non l'accetti). Per fare ciò, aggiungere questa riga al file ~/.ssh/config nel computer locale (creare il file se non esiste):

Host *
    IdentityFile /home/NOMEUTENTE/.ssh/id_rsa_alternativa

Da ora in poi, qualsiasi connessione ssh comincerà utilizzando la chiave. Nel caso il server ssh remoto non l'accettasse, chiederà la password remoto, come di solito. L'asterisco indica tutti gli host, ma si possono creare anche delle regole diverse per host diversi, ma questo è un'altra storia.

KDE

Se si utilizza KDE, è possibile fare in modo che all'avvio venga chiesta la password per sbloccare la chiave. Aggiungere questo file in ~/.kde4/Autostart/easy-ssh-agent e impostare i permessi di esecuzione con chmod +x ~/.kde4/Autostart/easy-ssh-agent

#!/bin/bash
/usr/local/bin/easy-ssh-agent

Per fare in modo che qualsiasi programma avviato da kde possa accedere all'agent (per esempio, se esegui uno script che necessita della chiave cliccando su un'icona, senza aprire un terminale), bisogna aggiungere questo file in ~/.kde4/env/sshagent.sh

eval $( easy-ssh-agent start --env )

Per vedere altre opzioni disponibili: easy-ssh-agent --help (in inglese).

Ti è piaciuto l'articolo? Condividilo! Commentalo!

comments powered by Disqus