Come utilizzare la chiave privata SSH per accedere senza inserire la passphrase ogni volta su Mac OS X Lion?


23

Uso Mac OS X Lion e accedo agli host remoti tramite SSH ogni giorno. Nonostante io utilizzi la coppia di chiavi SSH per l'autenticazione remota e non ho bisogno di motorizzare la frase di accesso di ogni host, è ancora molto fastidioso che il terminale richieda la passphrase per accedere alla mia chiave privata SSH.

Per motivi di sicurezza, penso che sia necessaria una passphrase per l'accesso alla chiave privata SSH. Esiste un modo che consente al terminale di chiedere la frase esattamente una sola volta all'avvio, quindi di memorizzarla e di utilizzare automaticamente la mia chiave privata nelle sessioni SSH successive?

C'è uno script chiamato keychainche funziona bene su Gentoo Linux. Ma non l'ho mai capito su Mac OS X Lion. Cosa c'è di più, ci sono tanti termini intimidatorio, come ad esempio ssh-agent, ssh-add. Dopo aver letto vari materiali su quei toolkit SSH e aver fatto alcuni esperimenti frustrati, sono diventato più confuso.

Pertanto, sono venuto su StackExchange, alla ricerca di alcuni consigli sulle seguenti domande.

  1. Quali sono ssh-agent, ssh-add, keychain, Keychain Access.appe come interagiscono tra loro?
  2. Come posso inserire la passphrase per la mia chiave privata SSH una volta al login e usarla liberamente alla successiva creazione della sessione SSH?
  3. Errr ... Cosa c'è che non va Keychain Access.app? Non memorizza la frase SSH come prima.

Elenco quello che ho fatto qui. Spero che ci siano indizi sui passi che ho perso.

Passaggio 1. Creare una coppia di chiavi SSH sul mio Mac.

$ ssh-keygen -t rsa -C "me@email.com"
# Set a passphrase for accessing the private key.

Passaggio 2. Copia la mia chiave pubblica SSH sull'host remoto. Per fare un esempio, copio la chiave su localhost, Mac.

$ ssh-copy-id USER@localhost
# Enter the login password for USER at localhost, not my SSH passphrase

Passaggio 3. Quindi provare a connettersi all'host remoto (localhost qui), tramite l'autenticazione della coppia di chiavi SSH.

$ ssh USER@locahost
Enter passphrase for key '/Users/YOUR_ACCOUNT/.ssh/id_rsa': 
# Enter my SSH passphrase, not the login password.

Passaggio 4. Disconnettersi dall'host remoto e provare a connettersi nuovamente ad esso. Dannazione, il terminale chiede di nuovo la frase SSH.

Una domanda frequente è che "ssh-agent funziona bene sul tuo Mac?". Francamente, non ho idea di cosa stia succedendo. Qui mostra alcuni risultati in esecuzione.

$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(EMPTY)
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-Z54zXukQiP/agent.26769; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26770; export SSH_AGENT_PID;
echo Agent pid 26770;
$ ssh-add -l
Could not open a connection to your authentication agent.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(STILL EMPTY)
$ ssh-agent  # Oh no, anther ssh-agent with different PID
SSH_AUTH_SOCK=/tmp/ssh-cx0B4FUX8B/agent.26898; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26899; export SSH_AGENT_PID;
echo Agent pid 26899;
$ ps -e | grep -i ssh
26769 ??         0:00.03 ssh-agent
26899 ??         0:00.02 ssh-agent

Qualsiasi feedback è il benvenuto. Grazie!


Correlato . È probabile che tu possa adattare la risposta accettata al tuo caso d'uso.
Daniel Beck

Risposte:


12

ssh-agentè il pezzo su cui vuoi far funzionare, poiché fa esattamente quello che stai chiedendo. L'agente viene eseguito come demone e quando "aggiungi" una chiave privata ad esso, ricorda quella chiave e la fornisce automaticamente al telecomando sshddurante la connessione iniziale. ( ssh-addè semplicemente il comando che esegui per aggiungere manualmente una chiave privata ssh-agent).

In OS X, a partire da Leopard, non dovresti mai eseguire ssh-agento ssh-addmanualmente. Dovrebbe "accadere" quando si tenta di connettersi a un server. Una volta per chiave, ti verrà richiesta una finestra di dialogo della password dell'interfaccia utente, che (tra le altre cose) ti consentirà di aggiungere automaticamente la chiave a in ssh-agentmodo che non ti venga più richiesto.

Questo viene gestito da una launchdconfigurazione che ascolta le connessioni sul $SSH_AUTH_SOCKsocket e si avvia automaticamente ssh-agentquando necessario; successivamente, ssh-agentrichiede le credenziali solo quando è necessario aprire una nuova chiave.

Se non funziona, assicurati di avere il launchdfile di configurazione corretto presente:

/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist

Se per qualche motivo non funziona ancora per te, ecco il "vecchio" modo di far funzionare le cose a mano:

http://timesinker.blogspot.com/2007/08/getting-ssh-agent-going-on-mac-osx.html

C'è anche questa applicazione, che ho smesso di usare da quando è uscito Leopard, ma fondamentalmente ha fatto la stessa cosa nelle versioni precedenti di Mac OS X:

http://www.sshkeychain.org/


4
Grazie Michael Edenfield. Ho capito cosa non va e ora ssh-login-without-passphrase funziona perfettamente su Mac OS X Lion. Ho fatto alcune cose stupide: ho creato un collegamento simbolico che ~/tmppunta a /tmp/ed eseguo un lavoro cron da pulire ~/tmpogni 2 ore, che ha rimosso anche il socket ssh-agent. Oh amico, mi odio.
Jianwen W.,

13

Durante il processo di risolvere il "problema", Googled alcuni argomenti correlati e scrivere alcune note su come ssh-agent, ssh-add, keychain, KeyChain Access.applavoro. Alla fine si scopre che questo problema non è affatto un problema, invece il problema è tutto su di me, e il cosiddetto ssh-login-senza-chiedere-passphrase-ogni volta funziona perfettamente su Mac immediatamente.

Tuttavia, questo processo mi fa guadagnare alcune esperienze. Scrivo qui i miei appunti nella speranza che aiutino qualcuno a confondere su quei termini.

Due termini per la password:

  • passphrase si riferisce alla frase richiesta quando si accede alla chiave privata SSH.
  • password si riferisce alla frase richiesta per accedere al tuo Mac.

Ora posso capire che cosa questi toolkit fanno, cioè ssh-agent, ssh-add, keychain, Keychain Access.appsu Mac.

  • ssh-agentè il servizio fondamentale per abilitare l'uso della chiave privata SSH senza digitare la passphrase SSH. ssh-agentfunziona in questo modo. Prima memorizza o memorizza nella cache la chiave privata SSH nella memoria principale. Quindi in un secondo momento in questa sessione, quando la chiave SSH privata SSH è necessaria per l'autenticazione remota, ssh-agenttroverà la chiave privata nella memoria principale e la passerà al processo remoto. L'unica possibilità che ti venga chiesto di digitare la passphrase SSH è quando la chiave privata viene aggiunta ssh-agentinizialmente.
  • ssh-addfa parte della ssh-agentraccolta, che aiuta a gestire le chiavi SSH ssh-agent. Usiamo il ssh-addcomando per elencare, aggiungere, rimuovere le chiavi private nel portachiavi di ssh-agent. Quindi ssh-addcomunica con il ssh-agentservizio per eseguire le attività.
  • keychainè uno script per trovare il ssh-agentservizio (se non esiste, avviarne uno nuovo) e chiamare ssh-addper aggiungere chiavi private SSH. keychainha un'idea semplice e diretta, funziona bene su Linux in cui ssh-agent di solito non si avvia automaticamente.
  • Keychain Access.appsembra essere il componente più complicato. È il servizio di archiviazione token universale di Mac OS X. Memorizza vari token, come password, certificati, ecc. E funge da agente token per le app che richiedono i token. Nel nostro caso di chiave privata SSH, per prima cosa afferra la richiesta di accesso alla chiave privata SSH e apre una finestra per chiederti di memorizzare la passphrase SSH, che è una specie di token, nel Keychain Access.appportachiavi. Quindi la prossima volta quando si devono usare le chiavi private per l'autenticazione, si Keychain Access.appapre di nuovo una finestra, chiedendo se concedere il privilegio. Dopo aver ottenuto un grande sì, keychain Access.appaggiunge la tua chiave privata nella ssh-agentmemoria.

Due cose meritano la tua attenzione:

  1. Mac OS X Lion avvia automaticamente un ssh-agentservizio all'avvio, ascoltando su un socket sotto /tmp.
  2. Keychain Access.appmemorizza la passphrase SSH, in modo che possa aggiungere la chiave privata ssh-agentsenza interromperti. Sì, non è necessario digitare la frase SSH, ma è necessario digitare la password di accesso dell'account Mac per garantire il privilegio quando si crea questa voce per la prima volta.

Quindi, in sintesi, SSH-login-senza-ask-passphrase dovrebbe funzionare su Mac OS X immediatamente.


1

Nel caso in cui altre soluzioni qui non funzionino per le persone, il seguente ha funzionato per me.

Per ogni chiave privata nella directory ~ / .ssh, assicurarsi che sia presente anche la chiave pubblica corrispondente. Assicurarsi che la chiave pubblica sia denominata esattamente come la chiave privata ma con .puballa fine. Se disponevi già di una chiave pubblica appropriata, prova a rigenerarla.

Se devi ricreare le chiavi pubbliche, puoi farlo facilmente: -

ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub

sostituendo my_keycon qualunque sia la tua chiave chiamata.

Successivamente, MacOS ricorda la frase chiave nel portachiavi come dovrebbe.

Nota: inserendo la passphrase e salvandola, il portachiavi ora è un'azione unica (non una volta per sessione di accesso come desiderato dall'OP), ma supponendo che l'accesso al mac in questione sia protetto da password, la passphrase è protetta da quella password di accesso. Inoltre, questa soluzione non ha senso per me ... una chiave pubblica non dovrebbe essere richiesta oltre alla chiave privata, ma per qualche motivo MacOSX lo richiede.

(originariamente dalla risposta a una domanda simile su Apple Stack Exchange)


1

L'unica cosa che raramente trovo menzionata per quanto riguarda la configurazione della ~/.sshcartella è limitare le autorizzazioni della directory.

Per abilitare ssh per evitare di chiedere la password, ho sempre dovuto impostare le autorizzazioni della home directory dell'utente 700e anche quelle della ~/.sshcartella 700.

Altrimenti continua a chiedermi una password anche quando ho tutte le chiavi generate e copiate correttamente. Un messaggio di errore viene generato nei log di autenticazione, ma questo è in gran parte invisibile all'utente finale.


0

Un'altra cosa che avresti potuto provare sarebbe stata quella di sostituire ssh-copy-idcon qualcosa del genere k="$(cat ~/.ssh/id_rsa.pub)"; ssh username@somehost.com "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2".


0

Questa risposta non è leggermente la soluzione a questa domanda; tuttavia è molto vicino (ho finito con questa domanda mentre cercavo una soluzione al mio problema).

Faccio anche molto SSH su server remoti sul mio Mac, come descritto in questa domanda, tuttavia l' Keychain Access.appapp memorizzava la frase chiave e non ho bisogno di digitarla ogni volta che ho bisogno della chiave per autenticarmi su un server SSH.

Tuttavia, ho abilitato il server SSH sul mio Mac, in modo da poterlo connettere in remoto. Quando ho effettuato l'accesso in remoto sul mio Mac, alla frase chiave veniva sempre chiesto quando volevo SSH per un altro host.

Ho trovato una soluzione che consente di memorizzare la frase chiave per la sessione corrente. Ho pensato che questo potesse essere utile a qualcuno, quindi questo post / risposta.


Ho scritto la mia soluzione simile qui superuser.com/a/659668/154113
orkoden

0

Sono stato perplesso su questo problema. ssh funziona su tutte le macchine del nostro dipartimento TRANNE le mele (i MacBook o iMac non contano). Alla fine mi sono stancato di digitare le password e ho deciso di eseguire il debug di questo.

Sono andato su iMac e ho disabilitato sshd nel pannello delle preferenze di condivisione. Ho quindi fatto causa a root e ho digitato "/ usr / sbin / sshd -d" per avviare sshd in modalità debug. Ho quindi provato a ssh su quella macchina e ha prontamente provato a utilizzare il protocollo 2, che tutto sembra usare bene, ma sshd ha prontamente segnalato che non è stato possibile trovare "authorized_keys". Avevo un file autorizzato_keys2 che tutte le mie caselle unix Linux, Solaris e You-Name-It accettano bene. Ho semplicemente copiato authorized_keys2 in authorized_keys e BOOM. Funziona perfettamente ora.

Perché * keys anziché * keys2 è sconosciuto. Soprattutto quando os x è abbastanza soddisfatto di known_hosts2.

In ogni caso, ora tutti i nostri apple box possono essere registrati o avere comandi remoti eseguiti su di essi senza quella password distrutta: prompt ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.