SSH: problema di autenticazione su Bitbucket

Spread the love
ssh
ssh

Ho un nuovo repository su Bitbucket. Ho generato una chiave con ssh-keygen e ho caricato la chiave pubblica su Bitbucket.

Tuttavia il comando seguente mi va in errore:

$ git pull remote master
sign_and_send_pubkey: signing failed for RSA "/home/marcob/.ssh/id_rsa" from agent: agent refused operation
git@bitbucket.org: Permission denied (publickey).
fatal: Impossibile leggere dal repository remoto.

Assicurati di disporre dei privilegi d'accesso corretti
e che il repository esista.

Il problema è che, dopo aver generato la chiave, mi sono dimenticato di aggiungerla al keyring utlizzato dall’agent ssh. Quindi è necessario lanciare questo comando:

$ ssh-add
Enter passphrase for /home/marcob/.ssh/id_rsa: 
Identity added: /home/marcob/.ssh/id_rsa (marcob@jsbach)

Alla fine si può verificare che la chiave è stata aggiunta

$ ssh-add -l
4096 SHA256:dCoHG9JO4UicfP5ct55GGTIN6U0bDzNrnUj70zbdkSc marcob@jsbach (RSA)

Due parole sulla autenticazione a chiave pubblica SSH

Posso effettuare un’autenticazione su un server remoto con questi ingredienti:

  1. Un repository locale in cui risiede una coppia di chiavi RSA (generate con l’utility ssh-keygen)
  2. Un agente locale (ssh-agent) che gestisce le coppie RSA generate in locale
  3. Un server in cui gira un demone OpenSSH
  4. Un agente remoto che colloquia con l’agente locale

Inoltre, il protocollo SSH implementa l’inoltro dell’agente, un meccanismo per cui un client SSH consente a un server SSH di utilizzare l’agente ssh locale sul server a cui l’utente accede, come se fosse locale.

Quando l’utente contatta il client SSH sul server, il client tenterà di contattare l’agente implementato dal server e il server inoltra la richiesta al client che ha originariamente contattato il server, che la inoltra ulteriormente all’agente locale. In questo modo, ssh-agent e agent forwarding implementano il single sign-on che può progredire in modo transitivo.

Comunque: se oggi funziona e dopo un po’ non funziona più, è perché dev’essere riavviato l’ssh-agent.

SSH agent

ssh-agent è in sostanza un portachiavi. Un programma per contenere chiavi private usate per l’autenticazione a chiave pubblica.

Attraverso l’uso di variabili d’ambiente, l’agente può essere individuato da ssh e utilizzato automaticamente per l’autenticazione durante la registrazione in altre macchine.

L’avvio del portachiavi con inizializzazione delle variabili di ambiente viene fatta con il comando

$ eval `ssh-agent -s`

Per esempio le variabili possono assumere valori come questi:

SSH_AUTH_SOCK=/tmp/ssh-9OGf5JBFxGy6/agent.20980; export SSH_AUTH_SOCK;
SSH_AGENT_PID=20981; export SSH_AGENT_PID;
echo Agent pid 20981;

Qui le variabili inizializzate sono due: SSH_AUTH_SOCK e SSH_AGENT_PID.

SSH può accedere al portachiavi utilizzando queste due informazioni.

Se l’agente vi chiede nuovamente la passphrase

Vuol dire che non avete aggiunto la chiave al keyring; anzi, probabilmente non è colpa vostra: lo avete fatto ma l’accesso al portachiavi è come sempre a tempo: dopo un po’ di tempo dovete riaprirlo a mano. Potete però decidere per quanto tenerlo aperto con questo comando:

$ ssh-add -t 1h30m

per esempio così rimane aperto per un’ora e mezza. Ricordatevi comunque che è bene che il portachiavi si chiuda dopo un po’.

Comunque è sufficiente ridigitare:

$ ssh-add

Per verificare che sono state aggiunte le chiavi

$ ssh-add -l
4096 SHA256:dCoHG9JO4UicfP5ct55GGTIN6U0bDzNrnUj70zbdkSc marcob@jsbach (RSA)

Ricapitolando

Prima dell’apertura del portachiavi questa è la risposta del server Git da cui voglio scaricare gli aggiornamenti:

$ git pull origin master 
sign_and_send_pubkey: signing failed for RSA "/home/marcob/.ssh/id_rsa" from agent: agent refused operation
git@bitbucket.org: Permission denied (publickey).
fatal: Impossibile leggere dal repository remoto.

Assicurati di disporre dei privilegi d'accesso corretti
e che il repository esista.

Quindi riapro il portachiavi:

$ eval `ssh-agent -s`
Agent pid 170012

Ora se provo a ridare il comando non avrò più l’errore ma mi verrà chesta la passphrase della mia chiave privata:

$ git pull origin master 
Enter passphrase for key '/home/marcob/.ssh/id_rsa': 

Se voglio anche non dover ridigitare la password, aggiungo la mia chiave privata al portachiavi (devo però digitare la passphrase almeno questa volta)

$ ssh-add
Enter passphrase for /home/marcob/.ssh/id_rsa: 
Identity added: /home/marcob/.ssh/id_rsa (marcob@jsbach)

Per le successive invocazioni con il Git server remoto non mi verrà più chiesta la password (fino allo scadere del timeout del portachiavi):

$ git pull origin master
Da bitbucket.org:mxaos/logisticmapper
 * branch            master     -> FETCH_HEAD
Già aggiornato.

Riferimenti SSH

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.