Usare dd-wrt come client ssh con autenticazione con chiave pubblica

In queste note cercherò di dare una piccola illustrazione su come riuscire ad utilizzare dropbear, il server/client ssh di dd-wrt, come client con autentificazione a chiave pubblica.

Innanzi tutto abbiamo bisogno di generare la chiave pubblica, questa può essere creata a partire dalla chiave privata già presente su dd-wrt oppure da una nuova che possiamo creare noi.

La creazione della chiave privata avviene tramite il comando dropbearkey:

dropbearkey -t rsa -f file_private_key.db

con -t possiamo specificare la chiave che può essere di tipo rsa o dss, mentre con -f indichiamo in quale file salvare la chiave privata. Potrebbe venire chiesto anche la passfrase da utilizzare per crittografare la chiave, che potrà anche non essere inserita se vogliamo che al momento del login del client ssh non venga richiesta nessuna password.

Una volta che abbiamo la chiave privata possiamo creare la chiave pubblica così

dropbearkey -y -f file_private_key.db

oppure così per partire dalla chiave privata già presente in dd-wrt

dropbearkey -y -f /tmp/root/.ssh/ssh_host_rsa_key

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgwCRmLfMW6fd
UTSxFdZyH8QTdrRn4QmuRPTF7vJOSCEoPfk7oo05OpMfKEZp
d7+pgQmCP4UjINHaX34dEoCah6aL4U6bH6QFLrCpk5H3DQap
OmFTVqW25/59ZHJEnRRei8o6DUJKh1g9776yP3X9+XtQ+Pucn
zuDpMK3FzWUK/qOEM57 david@nbdavid
Fingerprint: md5 ce:e8:a8:cf:d9:ed:11:63:ec:49:0e:b5:de:e3:cf:38

l’output risultante sarà composto dalla chiave pubblica più il fingerprint, quello che a noi interessa è la chiave pubblica che potrà essere inserita nel file authorized_keys del server ssh a cui vogliamo accedere.

Però c’è un problema, l’implementazione di dropbear presente su dd-wrt (o almeno dd-wrt per SysLink 54GL) non supporta l’opzione -y che è quella che ci permette di generare la chiave pubblica, infatti con il comando sopra indicato non verrò generato nessun output.

Come risolvere il problema ?
Abbiamo bisogno di un’implementazione di dropbear funzionante su un altro pc, copiarci la chiave privata e generare li sopra la chiave pubblica da distribuire sui server ssh interessati.

È opportuno fare ATTENZIONE che la chiave privata non vada in mani sbagliate per non cadere in gravi problemi di sicurezza.

da dd-wrt copio la chiave privata su Ubuntu:
dd-wrt# scp /tmp/root/.ssh/ssh_host_rsa_key user@ubuntu:ssh_host_rsa_key.dd-wrt

installo dropbear su ubuntu:
ubuntu# sudo apt-get install dropbear

genero la chiave pubblica a partire da quella privata e la metto in ssh_host_rsa_key.pub:
ubuntu# dropbearkey -y -f ssh_host_rsa_key.dd-wrt | grep -v Fingerprint > ssh_host_rsa_key.pub

ricopio la chiave pubblica appena generata su dd-wrt:
ubuntu# scp ssh_host_rsa_key.pub user@dd-wrt:.ssh/.

ora per motivi di sicurezza eliminiamo sia la chiave privata sia quella pubblica appena generata dal pc di transito.

A questo punto su dd-wrt avremo la chiave pubblica appena creata nel file /tmp/root/.ssh/ssh_host_rsa_key.pub da utilizzare per essere distribuita su i server a cui vorremo accedere. Ricordiamo che dd-wrt utilizza filesystem volatile, nel momento che lo riavvieremo il file sparirà quindi è opportuno conservarlo in una memoria non volatile, magari una partizione jffs sempre sullo stesso dd-wrt.

Una volta impostata la chiave pubblica sul server interessato potremo accederci da dd-wrt in questo modo:

ssh user@server -i /tmp/root/.ssh/ssh_host_rsa_key

con l’opzione -i dobbiamo indicare la chiave privata da utilizzare per la connessione.

Nel caso non avessimo utilizzato una passfrase non ci verrà richiesta nessuna password di accesso. Se vogliamo utilizzare ssh come client all’interno di uno script shell potrebbe essere opportuno indicare l’opzione -y con la quale non viene chiesta nessuna conferma sul fingerprint.

8 pensieri su “Usare dd-wrt come client ssh con autenticazione con chiave pubblica

  1. ho provato la procedura da te descritta ma non funziona….sono ancora in tempo per qualche dritta?

  2. Certo che sei ancora in tempo.
    Il metodo sopra descritto è stato utilizzato per automatizzare la creazione di un tunnel ssh da uno sript bash che è attualmente funzionante.
    Rileggendo il post mi sono accorto di un piccolo errore:

    ricopio la chiave privata appena generata su dd-wrt:
    ubuntu# scp ssh_host_rsa_key.pub user@dd-wrt:.ssh/.

    invece la frase giusta è la seguente (è stata corretta)

    ricopio la chiave pubblica appena generata su dd-wrt:
    ubuntu# scp ssh_host_rsa_key.pub user@dd-wrt:.ssh/.

    non vorrei che ti abbia tratto in inganno l’errore sopra descritto.

    Comunque se hai ancora problemi dimmi come posso esserti d’aiuto.

    Ciao.

  3. Intanto grazie della risposta e dell’interessamento.

    Premetto che mi collego perfettamente tramite chiavi, da vari pc della mia rete al router.
    Il problema è ovviamente il caso contrario, perchè non riesco a farlo con le chiavi ma mi chiede sempre la password.

    Avevo notato l’errore che hai riportato per cui il problema non è quello.

    Una prima differenza è che quando genero la chiave privata nel router con il comando

    dropbearkey -t rsa -f file_private_key.db

    non mi viene chiesta la passphrase.

    Se poi seguo i comandi che hai descritto quando arrivo a

    ubuntu# dropbear -y ssh_host_rsa_key.dd-wrt | grep -v Fingerprint > ssh_host_rsa_key.pub

    mi ritorna errore di “Unknown argument -y”. Il comando che accetta l’opzione -y è dropbearkey ma da quanto ho capito dropbearkey serve solo per generare la chiave privata.
    Ho provato a eseguirlo così

    dropbearkey -y -f ssh_host_rsa_key.dd-wrt | grep -v Fingerprint > ssh_host_rsa_key.pub

    e nel file creato trovo una chiave (che penso sia quella priva dato che termina con utente@ubuntu).

    Altra dubbio è…..nel router non esiste un file di configurazione per dropbear, disciamo l’analogo di sshd_config (se non ricordo male) per ssh??

    Grazie per l’interesse….ciao

  4. @john
    mi hai ancora una volta colto in errore, effettivamente il comando giusto per creare la chiave pubblica è quello che hai descritto tu, ovvero
    dropbearkey -y -f ssh_host_rsa_key.dd-wrt | grep -v Fingerprint > ssh_host_rsa_key.pub

    ho riprovato a creare la chiave privata con dropbearkey -t rsa -f file_private_key.db ed effettivamente non viene richiesta la passphrase, ma questo non dovrebbe influire.

    Quando dal router cerchi di accedere all’host che fa da server ssh specifichi con che chiave private eseguire l’accesso come descritto a fine post ?
    ssh user@server -i /tmp/root/.ssh/ssh_host_rsa_key

    Il server ssh del host a cui provi a collegarti potrebbe essere configurato per non accettare chiavi di tipo rsa ma solo dsa ?

    Io ho creato la chiave pubblica a partire da quella privata già presente sul router.

    Che router e che versione di dd-wrt hai ? Io ho un linksys wrt54gl con dd-wrt v24.

  5. qualcosa non mi torna…..

    quando vengono generate le chiavi in ssh la passphrase viene richiesta per ovvi motivi di sicurezza…..poi si può omettere però mi torna strano che dropbear non la chieda….

    per il resto…router e dd-wrt sono come i tuoi….quando mi collego specifico la chiave privata e quindi fin qui mi pare di non sbagliare niente….

    altra cosa che non mi torna…da man dropbearkey dice che serve per generare le chiavi private ma non parla di chiavi pubbliche….

    poi generando comunque la chiave pubblica (ammesso che lo sia) con dropbearkey partendo dalla chiave privata, la chiave generata termina con utente@macchina_ubuntu mentre per essere la chiave pubblica del router dovrebbe terminare con root@dd-wrt (o l’hostname del router)…..e in una normale implementazione di ssh la chiave pubblica va salvata nel file authorized_keys.

    quindi ti chiedo….la tua chiave pubblica termina con utente@ubuntu o root@dd-wrt (o nomi equivalenti)?

    e poi…hai aggiunto la chiave in authorized_keys del server?

  6. Ho risolto.

    funziona sia con rsa che con dss. Per farlo funzionare, in entrambi i casi oltre alle istruzioni da te descritte, ho dovuto:

    1 – modificare la chiave pubblica creata nel server sostituendo utente@ubuntu_server con root@dd-wrt

    2 – copiare la chiave pubblica nel file authorized_keys del server

    Ora ho in serbo un’altra domanda per te….non c’è un modo (modificando qualche opzione per dropbear) per collegarsi direttamente con

    ssh utente@server

    senza dover specificare ogni volta la chiave con l’opzione -i?

    Grazie per l’aiuto…ciao ciao

  7. @john
    Certo, la chiave pubblica deve essere copiata nel file authorized_keys del server, anche io ho fatto così.
    Il nome_utene@host presente nella chiave io l’ho lasciato così come era e tutto funziona correttamente. E’ anche vero però che io mi collego con il nome utente presente nella chiave.
    Per verifica ho provato a cambiarlo con un altro nome, ma tutto continua a funzionare lo stesso.

    Per quanto riguarda la possibilità di non specificare l’opzione -i non sono a conoscenza di una soluzione. Purtroppo la documentazione di dropbear è al quanto scarsa (o sono io che non so dove cercare ?).
    Il link ufficiale dovrebbe essere questo http://matt.ucc.asn.au/dropbear/dropbear.html
    Comunque ho dato un’occhiata alla manpage presente su ubuntu riguardo a dropbear e dbclient (su dd-wrt il comando ssh è un link a quest’ultimo) da cui però non sono riuscito a trovare alcuna informazione.

    Sono comunque contento che hai risolto il problema e se trovi altri tips sono ben graditi.

    Ciao.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *