¿Cómo usar la clave privada SSH para iniciar sesión sin ingresar una frase de contraseña cada vez en Mac OS X Lion?

23

Uso Mac OS X Lion e inicio de sesión en hosts remotos a través de SSH todos los días. A pesar de que uso el par de claves SSH para la autenticación remota y no necesito motorizar la frase de inicio de sesión de cada host, sigue siendo muy molesto que el terminal solicite la frase de contraseña para acceder a mi clave privada SSH.

Por razones de seguridad, creo que es necesaria una frase de contraseña para acceder a la clave privada SSH. ¿Hay alguna forma de hacer que el terminal solicite la frase exactamente solo una vez al inicio, luego la memorice y use automáticamente mi clave privada en sesiones SSH posteriores?

Hay un script llamado keychainque funciona bien en Gentoo Linux. Pero nunca lo descubro en Mac OS X Lion. Lo que es más, hay tantos términos de intimidación, como ssh-agent, ssh-add. Después de leer varios materiales sobre esos kits de herramientas SSH y hacer algunos experimentos frustrados, me confundí más.

Por lo tanto, vine a StackExchange, en busca de algunos consejos sobre las siguientes preguntas.

  1. ¿Cuáles son ssh-agent, ssh-add, keychain, Keychain Access.appy cómo interactúan entre sí?
  2. ¿Cómo puedo ingresar la frase de contraseña para mi clave privada SSH una vez al iniciar sesión y usarla libremente en la creación posterior de la sesión SSH?
  3. Errr ... ¿Qué tiene de malo Keychain Access.app? No almacena la frase SSH como lo hizo antes.

Enumero lo que he hecho aquí. Esperemos que haya pistas sobre los pasos que me perdí.

Paso 1. Crear un par de claves SSH en mi Mac.

$ ssh-keygen -t rsa -C "[email protected]"
# Set a passphrase for accessing the private key.

Paso 2. Copie mi clave pública SSH al host remoto. Para tomar un ejemplo, copio la clave a localhost, Mac.

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

Paso 3. Luego intenta conectarte al host remoto (localhost aquí), a través de la autenticación de par de claves SSH.

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

Paso 4. Cierre sesión en el host remoto e intente conectarse nuevamente. Maldita sea, la terminal vuelve a pedir la frase SSH.

Una pregunta frecuente es que "¿ssh-agent funciona bien en tu Mac?". Hablando francamente, no tengo idea de lo que está pasando con estas cosas. Aquí se muestran algunos resultados corrientes.

$ 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

Cualquier comentario es bienvenido. ¡Gracias!

Jianwen W.
fuente
Relacionados . Lo más probable es que pueda adaptar la respuesta aceptada para su caso de uso.
Daniel Beck

Respuestas:

12

ssh-agentes la pieza que desea que funcione, ya que hace exactamente lo que está preguntando. El agente se ejecuta como un demonio y, cuando "le agrega" una clave privada, recuerda esa clave y se la proporciona automáticamente al control remoto sshddurante la conexión inicial. ( ssh-addes simplemente el comando que ejecuta para agregar manualmente una clave privada ssh-agent).

En OS X, a partir de Leopard, nunca deberías tener que ejecutarlo ssh-agentni ssh-addmanualmente. Debería "suceder" cuando intentas conectarte a un servidor. Una vez por cada clave, le solicitará un cuadro de diálogo de contraseña de UI, que (entre otras cosas) le permitirá agregar automáticamente la clave para ssh-agentque nunca más se le solicite.

Esto se maneja teniendo una launchdconfiguración que escuche las conexiones en el $SSH_AUTH_SOCKzócalo y se inicie automáticamente ssh-agentcuando sea necesario; después de eso, le ssh-agentsolicita credenciales solo cuando necesita abrir una nueva clave.

Si eso no funciona, asegúrese de tener launchdpresente el archivo de configuración correcto :

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

Si todavía no funciona para usted por alguna razón, esta es la forma "antigua" de hacer que las cosas funcionen a mano:

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

También existe esta aplicación, que he dejado de usar desde que salió Leopard, pero básicamente hice lo mismo en versiones anteriores de Mac OS X:

http://www.sshkeychain.org/

KutuluMike
fuente
44
Gracias Michael Edenfield. Descubrí lo que está sucediendo y ahora ssh-login-without-passphrase funciona perfectamente en Mac OS X Lion. Hice algunas cosas estúpidas: hice un enlace simbólico que ~/tmpseñalaba /tmp/y ejecuté un trabajo cron para limpiar ~/tmpcada 2 horas, lo que también eliminó el socket ssh-agent. Oh hombre, me odio a mí mismo.
Jianwen W.
13

Durante el proceso de resolver el "problema", he buscado en Google algunos temas relacionados y escribo algunas notas acerca de cómo ssh-agent, ssh-add, keychain, KeyChain Access.apptrabajo. Finalmente resulta que este problema no es un problema en absoluto, sino que se trata de mí, y el llamado ssh-login-without-ask-passphrase-every-time funciona perfectamente en Mac fuera de la caja.

Sin embargo, este proceso me da algunas experiencias. Escribo mis notas aquí con la esperanza de que ayuden a alguien a confundirse con esos términos.

Dos términos de contraseña:

  • passphrase se refiere a la frase requerida al acceder a su clave privada SSH.
  • password se refiere a la frase requerida para iniciar sesión en su Mac.

Ahora me puedo imaginar lo que estas herramientas hacen, es decir, ssh-agent, ssh-add, keychain, Keychain Access.appen Mac.

  • ssh-agentes el servicio crítico para habilitar el uso de la clave privada SSH sin escribir la frase de contraseña SSH. ssh-agentFunciona de esta manera. Primero almacena, o almacena en caché , su clave privada SSH en la memoria principal. Luego, más adelante en esta sesión, cuando se necesite su clave SSH privada SSH para la autenticación remota, ssh-agentencontrará su clave privada en la memoria principal y la entregará al proceso remoto. La única posibilidad de que te pidan que escribas tu frase de contraseña SSH es cuando ssh-agentinicialmente se agrega tu clave privada .
  • ssh-addes parte de la ssh-agentcolección, que ayuda a administrar sus claves SSH ssh-agent. Usamos el ssh-addcomando para enumerar, agregar, eliminar claves privadas en el llavero de ssh-agent. Luego se ssh-addcomunica con el ssh-agentservicio para cumplir con las tareas.
  • keychaines un script para encontrar el ssh-agentservicio (si no existe, inicie uno nuevo) y llame ssh-addpara agregar claves privadas SSH. keychaintiene una idea simple y directa, funciona bien en Linux, donde ssh-agent generalmente no se inicia automáticamente.
  • Keychain Access.appParece ser el componente más complicado. Es el servicio universal de almacenamiento de tokens de Mac OS X. Almacena varios tokens, como contraseñas, certificados, etc., y sirve como agente de token para aquellas aplicaciones que solicitan los tokens. En nuestro caso de clave privada SSH, primero capta la solicitud de acceso a la clave privada SSH y abre una ventana para pedirle que almacene la frase de contraseña SSH, que es una especie de token, en Keychain Access.appel llavero. Luego, la próxima vez que vaya a utilizar claves privadas para la autenticación, Keychain Access.appvolverá a aparecer una ventana y le preguntará si otorga el privilegio. Después de obtener un gran sí, keychain Access.appagrega su clave privada al ssh-agentalmacenamiento.

Dos cosas merecen su atención:

  1. Mac OS X Lion inicia automáticamente un ssh-agentservicio al inicio, escuchando en un zócalo debajo /tmp.
  2. Keychain Access.appalmacena su frase de contraseña SSH, para que pueda agregar su clave privada ssh-agentsin interrumpirlo. Sí, no es necesario que escriba su frase SSH, pero debe escribir la contraseña de inicio de sesión de su cuenta Mac para otorgar privilegios al crear esta entrada por primera vez.

Entonces, en resumen, SSH-login-without-ask-passphrase debería funcionar en Mac OS X fuera de la caja.

Jianwen W.
fuente
1

En caso de que otras soluciones aquí no funcionen para las personas, las siguientes funcionaron para mí.

Para todas y cada una de las claves privadas en su directorio ~ / .ssh, asegúrese de que la clave pública correspondiente también esté presente. Asegúrese de que la clave pública tenga el mismo nombre que la clave privada pero que esté .pubal final. Si ya tenía una clave pública adecuada, intente regenerarla.

Si necesita volver a crear las claves públicas, puede hacerlo fácilmente:

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

Reemplazar my_keycon como se llame su clave.

Después de eso, MacOS recuerda la frase clave en el llavero como debería.

Nota: ingresar la frase de contraseña y guardarla en el llavero ahora es una acción única (no una vez por sesión de inicio de sesión como lo desea OP), pero suponiendo que el inicio de sesión en el Mac en cuestión esté protegido con contraseña, su contraseña está protegida por esa contraseña de inicio de sesión. Además, esta solución no tiene sentido para mí ... una clave pública no debería ser requerida además de la clave privada, pero por alguna razón MacOSX lo requiere.

(originalmente de la respuesta a una pregunta similar en Apple Stack Exchange)

Rowatt
fuente
1

Lo único que rara vez encuentro mencionado con respecto a la configuración de la ~/.sshcarpeta es restringir los permisos del directorio.

Para habilitar ssh para evitar pedir la contraseña, siempre tuve que configurar los permisos del directorio de inicio del usuario 700y también los ~/.sshpermisos de la carpeta 700.

De lo contrario, sigue pidiéndome una contraseña incluso cuando tengo todas las claves generadas y copiadas correctamente. Se genera un mensaje de error en los registros de autenticación, pero esto es invisible para el usuario final en su mayor parte.

Don Wood
fuente
0

Otra cosa que podrías haber intentado hubiera sido reemplazarlo ssh-copy-idcon algo así k="$(cat ~/.ssh/id_rsa.pub)"; ssh [email protected] "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2".

Lri
fuente
0

Esta respuesta no es la solución a esta pregunta; sin embargo, está muy cerca (terminé con esta pregunta mientras buscaba una solución a mi problema).

También hago mucho SSH en servidores remotos en mi Mac, como se describe en esta pregunta, sin embargo, la Keychain Access.appaplicación almacenó la frase clave y no necesito escribirla cada vez que necesito la clave para autenticarme en un servidor SSH.

Sin embargo, habilité el servidor SSH en mi Mac, para poder conectarme a él de forma remota. Cuando inicié sesión de forma remota en mi Mac, la frase clave siempre se preguntaba cuando quería SSH otro host más.

Encontré una solución que permite almacenar la frase clave para la sesión actual. Pensé que esto podría ser útil para alguien, de ahí esta publicación / respuesta.

Benoit Duffez
fuente
Anoté mi solución similar aquí superuser.com/a/659668/154113
orkoden
0

He estado desconcertando sobre este problema. ssh funciona en todas las máquinas de nuestro departamento, EXCEPTO para las manzanas (no importa MacBooks o iMacs). Finalmente me cansé de escribir las contraseñas y decidí depurar esto.

Fui a mi iMac y deshabilité sshd en el panel de preferencias de uso compartido. Luego sujete a root, y escribí "/ usr / sbin / sshd -d" para activar sshd en modo de depuración. Luego intenté enviar ssh a esa máquina e inmediatamente traté de usar el protocolo 2, que todo parece usar muy bien, pero sshd rápidamente informó que no pudo encontrar "claves_autorizadas". Tenía un archivo autorizado_keys2 que todas mis cajas de Linux, Solaris y You-name-it aceptan muy bien. Simplemente copié autorizado_keys2 a Authorizedkeys y BOOM. Funciona perfectamente ahora.

Por qué * keys en lugar de * keys2 es desconocido. Particularmente cuando os x está bastante contento con known_hosts2.

En cualquier caso, ahora todas nuestras cajas de Apple se pueden iniciar sesión o ejecutar comandos remotos sin esa contraseña: aviso ...

Bob Hyatt
fuente