¿Cómo usar Mac OS X Keychain con claves SSH?

141

Entiendo que desde Mac OS X Leopard, el llavero ha admitido el almacenamiento de claves SSH. ¿Podría alguien explicar cómo se supone que funciona esta función?

Tengo algunas claves RSA que he generado almacenadas en mi directorio ~ / .ssh para acceder a varios servidores. No tengo frases de contraseña establecidas en esas teclas. Actualmente para iniciar sesión en esos servidores, uso los siguientes comandos en la Terminal:

eval `ssh-agent`
ssh-add ~ / .ssh / some_key_rsa
ssh usuario @ servidor

(He escrito algunas funciones de Bash para facilitar esto).

¿Hay una mejor manera de hacer esto usando el llavero?

John Topley
fuente

Respuestas:

16

Para que funcione, $SSH_AUTH_SOCKdebe señalarse la variable de entorno /tmp/launch-xxxxxx/Listeners. Se supone que esto debe hacerse automáticamente cuando inicie sesión. El oyente en ese socket habla el protocolo ssh-agent.

Sus scripts bash están iniciando su propio agente ssh (escrito ssh-agent, no ssh_agent) y anulando el existente ssh-agentque está configurado para usted al iniciar sesión.

Además, todo el objetivo del llavero es almacenar las contraseñas en sus claves ssh, pero usted dice que no tiene frases de contraseña establecidas en esas claves, por lo que no estoy seguro de lo que espera de la integración del llavero.

Finalmente, cuando inicie sesión por primera vez, probablemente no verá un proceso de agente ssh. Ese proceso se iniciará automáticamente mediante los servicios de inicio la primera vez que algo intente leer ese socket /tmp.

Perro rudo
fuente
1
Gracias. ¿Entonces todavía tendré que ejecutar ssh-addpara agregar mis identidades RSA al agente ssh predeterminado que se inició al iniciar sesión?
John Topley
No tiene que ejecutar ssh-add; ssh-agent le pedirá la frase de contraseña de la clave la primera vez que ejecute ssh.
Rudedog
3
Me solicita la contraseña cada vez que ejecuto ssh. El punto es que no quiero tener que ingresar ninguna contraseña.
John Topley
1
¿Qué te pide la contraseña? Estoy empezando a sospechar que es el servidor remoto el que te está indicando, lo que pone tu declaración de que tus claves no tienen frases de contraseña en una mejor perspectiva. Si desea omitir la contraseña en el servidor remoto, debe agregar su clave pública $HOME/.ssh/authorized_keysen ese servidor. El ssh-agent + keychain de Mac OS solo se usa para almacenar la frase de contraseña para sus claves ssh locales; no está destinado a enviar contraseñas remotas a través de conexiones ssh existentes.
Rudedog
1
use ssh -vpara diagnosticar lo que ssh está haciendo. también se usa sshd -p 8900 -ven el lado del servidor y ssh -v remote:8900para diagnosticar qué está haciendo sshd.
Rudedog
252

A partir del lanzamiento de Leopard de OS X, ssh-agent está más estrechamente integrado con Keychain. Es posible almacenar las frases de contraseña de todas sus claves SSH de forma segura en Keychain, desde el cual ssh-agent las leerá en el inicio. La conclusión es que es simple asegurar sus claves con frases de contraseña, ¡pero nunca tiene que escribir la frase de contraseña para usarlas! Aquí es cómo:

Agregue la frase de paso a cada clave ssh al llavero: (la opción -k solo carga claves privadas simples, omite certificados)

ssh-add -K [path/to/private SSH key]

(nota que es una K mayúscula)

Cada vez que reinicie su Mac, todas las claves SSH en su llavero se cargarán automáticamente. Debería poder ver las claves en la aplicación Keychain Access, así como desde la línea de comandos a través de:

ssh-add -l
jeffmcc
fuente
ssh-add -lno enumera ninguna tecla cuando se conecta de forma remota (donde $ DISPLAY no está configurado). Aquí se deben emplear trucos especiales para usar el llavero (por ejemplo, en superuser.com/questions/141044/… )
Ether
2
developer.apple.com/library/mac/documentation/Darwin/Reference/… También necesita la opción -K para almacenar frases de contraseña en el llavero.
Neeme Praks
55
Si instaló otra versión de SSH a través de un sistema de paquetes como Homebrew, entonces es necesario usar una ruta absoluta como /usr/bin/ssh-add.
Ludovic Kuty
1
Curiosamente, en mi macOS Sierra no solicita la contraseña después de un reinicio, pero ssh-add -ldevuelve "El agente no tiene identidades". ( ps auxincluye /usr/bin/ssh-agent -l)
Halil Özgür el
44
Para macOS Sierra, las cosas han cambiado. Ver github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
schieferstapel
80

A partir de macOS Sierra , ssh-agent ya no carga automáticamente las claves ssh cargadas previamente cuando inicia sesión en su cuenta. Esto es intencional por parte de Apple, querían realinearse con la implementación principal de OpenSSH . [1]


Como se explica aquí , este es el método recomendado desde macOS 10.12.2 :

  1. Agregue las siguientes líneas a su ~/.ssh/configarchivo:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. Cualquier clave que agregue al agente ssh utilizando el ssh-add /path/to/your/private/key/id_rsacomando se agregará automáticamente al llavero, y debe cargarse automáticamente al reiniciar.


Lo siguiente está en desuso (guardado como referencia).

Para volver al comportamiento anterior, debe ejecutar el ssh-add -Acomando (que carga automáticamente todas las claves ssh que tienen frases de contraseña en su llavero) cuando inicia sesión. Para ello, siga estos pasos:

  1. Primero, agregue todas las claves que desea cargar automáticamente al agente ssh usando el ssh-add -K /absolute/path/to/your/private/key/id_rsacomando. El -Kargumento asegura que la frase clave se agregue al llavero de macOS . Asegúrese de utilizar la ruta absoluta a la clave. El uso de una ruta relativa hará que la secuencia de comandos iniciada automáticamente no encuentre su clave.

  2. Asegúrese de que todas sus claves se muestren como agregadas cuando escriba ssh-add -A.

  3. Crear un archivo llamado com.yourusername.ssh-add.plisten ~/Library/LaunchAgents/el contenido de abajo. Los archivos Plist como este son utilizados por launchdejecutar scripts cuando inicia sesión. [2] [3]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
      <string>com.user.loginscript</string>
    <key>ProgramArguments</key>
      <array>
        <string>ssh-add</string>
        <string>-A</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
    
  4. Dile launchda cargar el archivo plist que acaba de crear mediante la ejecución: launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist.

Y deberías estar listo.

Ricardo Sánchez-Sáez
fuente
33

Hay una manera más simple que la respuesta de Ricardo para mantener su contraseña entre sesiones / reinicios de su Mac con 10.12 Sierra.

  1. ssh-add -K ~/.ssh/id_rsa
    Nota: cambie la ruta a donde se encuentra su clave id_rsa.
  2. ssh-add -A
  3. Cree (o edite si existe) el siguiente ~/.ssh/configarchivo:

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    

    ¡Ahora la contraseña se recuerda entre reinicios!

Apple cambió a propósito el comportamiento de ssh-agent en macOS 10.12 Sierra para que ya no cargue automáticamente las claves SSH anteriores, como se señaló en este OpenRadar , discusión en Twitter y nota técnica de Apple . La solución anterior imitará el comportamiento anterior de El Capitán y recordará su contraseña.

ChrisJF
fuente
10

Nota: para macOS Sierra, consulte la respuesta más reciente de ChrisJF .

La [respuesta de Jeff McCarrell] [2] es correcta, excepto que el comando para agregar la frase de paso contiene un guión en lugar de un guión, es decir, en –Klugar de -Kprovocar un mensaje como efecto –K: No such file or directory. Debería leer:

ssh-add -K [path/to/private SSH key]
simonair
fuente
2
Esto debería ser un comentario a la respuesta a la que se refiere en lugar de una nueva respuesta. Estamos hablando de seguridad aquí. Uno podría sugerir que debe escribirlo cuidadosamente en lugar de copiarlo y pegarlo a ciegasssh-add -K
Phil_1984_
1
Usando un guión con K, obtengo illegal option -- K. Minúscula k aparece como una opción.
Sam Dutton
Gracias por la respuesta. Acabo de comprobar en macOS Sierra: -Kes decir, dash-capital-K, todavía es válido
simonair
6

Sospecho que no estás usando el sshcomando predeterminado . ¿Te has sshinstalado a través de puertos? Intenta which sshver qué sshcomando estás usando.

Por lo general, debe mostrar un cuadro de diálogo pidiéndole su contraseña, si aún no está almacenada en su llavero.

Olly
fuente
No estoy usando puertos.
John Topley
Gracias por la información :) Tuve problemas porque estaba usando OpenSSH de Homebrew.
ggustafsson
6

Tuve un problema similar al intentar iniciar sesión con un certificado ssh del cliente. En este caso específico fue para acceder a un repositorio git. Esta fue la situación:

  • La clave se guardó en ~/.ssh/
  • La clave privada tiene una frase de contraseña.
  • La frase de contraseña se almacena en el llavero de inicio de sesión de OS X. ~/Library/Keychains/login.keychain
  • La conexión fue la siguiente: mi servidor ->remoto mac ->git / ssh de mac
  • Mac OS X 10.8.5

Cuando me conecté a una Mac remota usando un escritorio remoto, no tuve ningún problema. Sin embargo, cuando me conecté con SSH al Mac remoto, siempre me pidieron la frase de contraseña ssh. Los siguientes pasos lo resolvieron por mí.

  1. security unlock-keychainLa frase de contraseña se almacena en el llavero de inicio de sesión. Esto lo desbloquea y permite que ssh-agent acceda a él.
  2. eval `ssh-agent -s`Inicia ssh-agent para uso de shell. Obtendrá la frase de contraseña del llavero y la usará para desbloquear la clave ssh privada.
  3. Establecer la conexión ssh / git y hacer mi trabajo.
  4. eval `ssh-agent -k` Mata al agente ssh en ejecución.
  5. security lock-keychain Bloquee el llavero nuevamente.
orkoden
fuente
1
Para que # 2 funcione para mí dentro de un alias, tuve que usar eval \$(ssh-agent)por Re: inicio de sesión remoto y llavero . Cuando no está dentro de un alias eval $(ssh-agent)funciona ( sin la barra invertida $ ).
Travis
4

Ver también:

security import priv_key.p12 -k ~/Library/Keychains/login.keychain
security import pub_key.pem -k ~/Library/Keychains/login.keychain

... agregando esta nota a medida que se solicitaban más detalles: el comando "seguridad" es capaz de importar claves (y otras cosas) directamente en Keychains. Lo bueno es que, a diferencia de ssh-add, puede especificar el llavero. Esto permite importar directamente en el sistema Llavero ("seguridad de hombre" para aprender cómo)

xaphod
fuente
1
¿Podría dar un poco más de detalle a esta respuesta, por favor? Gracias.
Matthew Williams
1

La solución destinada mejor y Apple (ya macOS 10.12.2) se describe aquí

Así que solo haz lo siguiente:

echo "UseKeychain yes" >> ~ / .ssh / config

Ben
fuente
1
El uso >>está en riesgo si ingresa el comando varias veces. Mejor hacer una edición manual del archivo, como se describe por ChrisJF respuesta .
Cœur
Sí, ahí mismo
Ben