Accedere in ssh a un host tramite chiave pubblica/privata
Updated at: 07/06/2023
In ambiente Unix è comodo poter eseguire dei comandi in ssh su un host remoto o anche copiare i file con scp. Però entrambe le cose richiedono di inserire la password il che rende difficile scriptizzare il tutto per essere eseguito in automatico.
Per ovviare il problema del login, si può utilizzare come autenticazione una coppia di chiavi pubblica/privata
Identifichiamo con
host_1 la macchina su cui girerà lo script e con
remote_1 la macchina a cui vogliamo connetterci.
Immaginiamo di essere connessi al nostro host_1 con l'utente
user_1
Su
remote_1, invece, sarà presente un utente
user_2 con già "attivo l'ssh" (nel caso lo si può creare ed eseguire il primo comando di questa guida)
Per prima cosa loggiamoci su host_1 con il nostro utente e generiamo la coppia di chiavi
(verrà chiesto di immettere una password per proteggere la chiave privata: ovviamente facendolo si aumenta la sicurezza, ma poi potremmo incappare in problemi nel momento in cui volessimo automatizzare il tutto, dato che ci verrebbe chiesta questa password quantomeno la prima volta che lanciamo l'ssh-agent, quindi volendo si può lasciare vuota)
ssh-keygen -t rsa -m pem -b 4096 [-C username@pcname]
Aggiungiamole ore alla nostro profilo, così che l'utente "sappia" cosa usare
[[ -z $SSH_AGENT_PID && -z $DISPLAY ]] && exec -l ssh-agent $SHELL -c "bash --login"
Ora dobbiamo copiare la nostra chiave pubblica sul server remoto, in modo da potergli dire che il proprietario della corrispondente chiave privata è autorizzato al login
scp ~/.ssh/id_dsa.pub user_2@remote_1:.ssh/id_dsa.pub.user_1
dove "
user_2" è l'utente con cui vorremo fare il login sulla macchina remota
Ora facciamo login sul server remoto
remote_1 con lo stesso utente (
user_2) usato per copiare il file sulla macchina
e aggiungiamo la chiave pubblica a quelle autorizzate
cat ~/.ssh/id_dsa.pub.user_1 >> ~/.ssh/authorized_keys
rm ~/.ssh/id_dsa.pub.user_1
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
A questo punto possiamo connetterci, eseguire comandi e anche copiare file in scp da
host_1 collegandoci direttamente a
remote_1
Loggati in
host_1 ad esempio possiamo eseguire:
ssh user_2@remote_1
ssh user_2@remote_1 'cp -r /tmp/some_dir /tmp/other_dir' # per eseguire un comando direttamente sulla macchina remota
scp user_2@remote_1:/tmp/some_dir/* /local/dir # per copiare i file da remote_1 a host_1
Il tutto senza dover mai scrivere la password (se abbiamo configurato tutto bene ed è andato tutto a buon fine).
Se abbiamo deciso di impostare una password a protezione della nostra chiave privata e non c'è già un ssh-agent configurato, dobbiamo lanciare i seguenti comandi
ssh-agent
ssh-add
Guida di riferimento (e per altre opzioni):
http://www.phcomp.co.uk/Tutorials/Unix-And-Linux/ssh-passwordless-login.html