Guida passo passo chiavi SSH con Ledger Nano S in GNU/Linux

agent 23 nov 2018

Articolo ispirato dalla guida https://thoughts.il chet37.net/a-step-by-step-guide-to-securing-your-ssh-keys-with-the-ledger-nano-s-92e58c64a005
Dall’autore: Fred de Villamil

Contrariamente a quanto si crede comunemente il Ledger Nano S non è progettato solo per proteggere le criptovalute. Può anche essere utilizzato per generare e memorizzare chiavi SSH private e lo rende il modo più sicuro per proteggerle.

Essendo sia un po’ paranoico ed un pesante utilizzatore di SSH, non volevo più fare affidamento sul computer per memorizzare le chiavi private. Ecco perché ho deciso di spostare tutto sul Ledger Nano S. La cosa più fastidiosa nel generare una serie di nuove coppie di chiavi è stato necessario cambiare ogni chiave pubblica utilizzata sui server e su Github. Volevo ricavare le mie nuove chiavi dall’elemento di sicurezza di Ledger memorizzato nella chiave privata invece di riutilizzare chiavi che potrebbero essere già state compromesse.

Installazione dell’applicazione SSH sul Ledger Nano S

Prima di poter utilizzare il Ledger Nano S per generare e memorizzare le chiavi SSH è necessario installare l’applicazione SSH.

Collegare e sbloccare il Ledger Nano S prima di lanciare Ledger Live. Come prima cosa attivate le applicazioni per gli sviluppatori. Cliccate l’ingranaggio in alto a destra, in fondo alla lista attivate l’interruttore della voce Developer mode:

Ledger Live Developer mode

Successivamente cliccate su Manager

Ledger Live Manager

e quando richiesto premere il tasto destro sul vostro Ledger per permettere l’accesso al software

Attivare l'accesso del Ledger Manager al Nano S

Nel Manager cercare l’applicazione ssh ed installare SSH/PGP Agent premendo sul tasto Install

Ledger Live SSH/GPG Agent
Installazione SSH/GPG Agent
Attendere l’installazione
Installazione SSH/GPG Agent completata
Fatto
SSH/GPG Agent sul Ledger Nano S

Installare gli strumenti della riga di comando di Python Agent Ledger

Aprite la vostra applicazione terminale preferita e assicuratevi di avere Python 3 e pip3 in esecuzione sul vostro computer.

$ which python3
/usr/local/bin/python3
$ which pip3
/usr/local/bin/pip3

Se non avete ancora Python3, non fatevi prendere dal panico e installatelo, ora utilizzare pip3 per installare il Ledger Agent:

$ pip3 install ledger_agent

Aggiungere il ledger-agent al PATH

$ nano ~/.bashrc

Aggiungere le seguenti righe in fondo, dove USERNAME è il vostro nome utente

export PATH=$PATH:/home/USERNAME/.local/bin

attivare con

$ source ~/.bashrc

Regole udev

Aggiungere quanto segue a /etc/udev/rules.d/20-hw1.rules

$ sudo nano /etc/udev/rules.d/20-hw1.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="1b7c", MODE="0660", TAG+="uaccess", TAG+="udev-acl" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="2b7c", MODE="0660", TAG+="uaccess", TAG+="udev-acl" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="3b7c", MODE="0660", TAG+="uaccess", TAG+="udev-acl" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="4b7c", MODE="0660", TAG+="uaccess", TAG+="udev-acl" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="1807", MODE="0660", TAG+="uaccess", TAG+="udev-acl" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="1808", MODE="0660", TAG+="uaccess", TAG+="udev-acl" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2c97", ATTRS{idProduct}=="0000", MODE="0660", TAG+="uaccess", TAG+="udev-acl" SUBSYSTEMS=="usb", ATTRS{idVendor}=="2c97", ATTRS{idProduct}=="0001", MODE="0660", TAG+="uaccess", TAG+="udev-acl" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0660", GROUP="plugdev", ATTRS{idVendor}=="2c97" KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0660", GROUP="plugdev", ATTRS{idVendor}=="2581"

ed attivare con

$ udevadm trigger
$ sudo udevadm control --reload-rules

Nel caso in cui il Ledger Nano S non dovesse essere riconosciuto dal sistema seguire la guida ufficiale per Linux qui:

https://support.ledgerwallet.com/hc/en-us/articles/115005165269-Fix-connection-issues

Terminata l’installazione è il momento di generare la prima chiave SSH.

Generare la prima chiave SSH sul Ledger Nano S

Collega e sblocca il Ledger Nano S se è scollegato da quando è stata installata l’applicazione SSH/GPG Agent, oppure per il timepout di sicurezza. Scorrere le applicazioni ed attivare SSH/GPG aAgnet premendo entrambi i bottoni del Ledger Nano S.

Attivare SSH/GPG Agent sul Ledger Nano S

Una volta lanciata l’applicazione, il Ledger Nano S visualizza SSH/PGP Agent.

SSH/GPG Agent attivo

Torna al terminale ed avvia:

$ ledger-agent user@host

Dove user è l’utente SSH abituale e host il pc/server al quale ci si desidera connettere. e.g. user=pi host=10.0.0.10

ledger-agent [email protected]
Agente in attesa

Vi verrà richiesto di confermare l’operazione sul Ledger Nano S. Premere il boottone destro

Confermare

Accettare e tornare al terminale, questa operazione visualizzerà la chiave pubblica SSH per l’utente e l’host precedentemente selezionato.

Ecco la chiave pubblica
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBB8quRZUW3mEvYICjTji8cUkHop6k88lerDUgOaNp4ssVdde2LlvgUN5IeKoe7LhPNz01EB/cr4h07qEW2h+UrU= <ssh://[email protected]|nist256p1>

Copiare l’intera stringa nel file ~/.ssh/authorized_keys del server. Ora è possibile per usare SSH con la uova chiave generata.

$ ledger-agent -c user@host

Quindi nel nostro esempio

$ ledger-agent -c [email protected]

Prima di connettersi è necessario accettare l’uso della chiave sul Ledger Nano S.

Accedere alla chiave pubblica
Autenticarsi al server

Usare il ledger agent nella shell

L’utilizzo del Ledger agent per il collegamento all’SSH non è la cosa più pratica di sempre. Per fortuna, è possibile utilizzarlo come agente SSH tradizionale in modo da poterlo utilizzare con il client SSH, git e molti altri.

Dopo la prima generazione di chiavi, il Ledger agent ha stampato una classica chiave pubblica SSH ECDSA con una stringa tra <>.

<ssh://[email protected]|nist256p1>

Questa stringa è l’identità di un agente Ledger. Aggiungerla ad un file, ad esempio ~/.ssh/ledger.conf, quindi eseguire nuovamente l’agente Ledger:

$ echo "<ssh://user@host|nist256p1>" >> ~/.ssh/ledger.conf
$ ledger-agent ~/.ssh/ledger.conf -s -v
2018-11-22 19:19:38,241 INFO         identity #0: <ssh://user@host|nist256p1>                                                 [__init__.py:208]
2018-11-22 19:19:38,259 INFO         running '/bin/zsh' with {'SSH_AUTH_SOCK': '/var/folders/4r/1nrw0lls4rqdq52xkvdcj7vm0000gn/T/trezor-ssh-agent-ib39yy', 'SSH_AGENT_PID': '29715'} [server.py:119]

Nel nostro esempio

$ echo "<ssh://[email protected]|nist256p1>" >> ~/.ssh/ledger.conf
$ ledger-agent ~/.ssh/ledger.conf -s -v
2018-11-22 19:19:38,241 INFO         identity #0: <ssh://[email protected]|nist256p1>                                                 [__init__.py:208]
2018-11-22 19:19:38,259 INFO         running '/bin/zsh' with {'SSH_AUTH_SOCK': '/var/folders/4r/1nrw0lls4rqdq52xkvdcj7vm0000gn/T/trezor-ssh-agent-ib39yy', 'SSH_AGENT_PID': '29715'} [server.py:119]

Questo genera una nuova shell con un agente SSH che utilizza tutte le identità memorizzate nel file ledger.conf. In questo modo, si può semplicemente eseguire.

$ ssh user@host

In questo modo si utilizza la chiave SSH memorizzata nel Ledger Nano S senza la necessità di utilizzare il Ledger agent. Funziona anche con git, e tutto ciò che utilizza SSH come mosh.

In alternativa è possibile creare degli alias in .bashrc

$ nano ~/.bashrc
alias ssh-pi="ledger-agent -c [email protected]"

Ricaricare il profilo con

$ source ~/.bashrc

Automazione, perché siamo pigri

Non sarei innnamorato dell’informatica se non fossi pigro. Ecco perché adoro lo script dell’autore originale che esegue tutto il lavoro per me (disponibile su Github sotto la licenza MIT).

Questo script:

  • Genera una nuova chiave per il tuo user@host
  • Aggiunge la nuova identità al file ~/.ssh/ledger.conf
  • Aggiunge il nuovo host al file ~/.ssh/config
  • Ricarica il Ledger agent con tutte le  identità (solo nella shell corrente)
#!/bin/bash
LEDGER_BIN=$(which ledger-agent)
LEDGER_HOST="${1}"
LEDGER_CONF="${HOME}/.ssh/ledger.conf"
EXIT_SUCCESS=0
EXIT_ERROR=1

if [ -z "${LEDGER_HOST}" ]; then
  echo "Usage: ${0} user@host"
  echo exiting
  exit ${EXIT_ERROR}
fi

if [ -z "${LEDGER_BIN}" ]; then
  echo "The Ledger Agent binary is missing or not in the path, exiting"
  exit ${EXIT_ERROR}
fi

echo "Generating the private key, please confirm on the Nano S..."
key=$(ledger-agent ${LEDGER_HOST})
echo "${key}" | cut -f 3 -d ' ' >> ${LEDGER_CONF}

echo "Adding ${LEDGER_HOST} to your ssh config"
ssh_host=$(echo ${LEDGER_HOST} | cut -f 2 -d '@')
ssh_user=$(echo ${LEDGER_HOST} | cut -f 1 -d '@')

echo "Host ${ssh_host}
    HostName ${ssh_host}
    Port 22
    User ${ssh_user}
    PreferredAuthentications publickey
" >> ${HOME}/.ssh/config

echo "Your new public key is now into your clipboard!"
echo "${key}" | cut -f 1,2 -d ' ' | pbcopy

echo "Now reloading the Ledger agent"
${LEDGER_BIN} ${LEDGER_CONF} -v -s

exit ${EXIT_SUCCESS}

Da oggi è possibile dare il vostro supporto su Patreon https://www.patreon.com/antonionardella

Per ulteriori informazioni in italiano o tedesco trovate i miei contatti a questa pagina.
Se avete trovato utile la mia libera traduzione/guida, accetto volentieri delle donazioni 😉

IOTA:
QOQJDKYIZYKWASNNILZHDCTWDM9RZXZV9DUJFDRFWKRYPRMTYPEXDIVMHVRCNXRSBIJCJYMJ9EZ9USHHWKEVEOSOZB
BTC:
1BFgqtMC2nfRxPRge5Db3gkYK7kDwWRF79

Non garantisco nulla e mi libero da ogni responsabilità.

Tag