¿Cómo agregar permanentemente una clave privada con ssh-add en Ubuntu? [cerrado]

474

Tengo una clave privada protegida con una contraseña para acceder a un servidor a través de SSH.

Tengo 2 máquinas linux (ubuntu 10.04) y el comportamiento del comando ssh-add es diferente en ambas.

En una máquina, una vez que uso "ssh-add .ssh / identity" e ingreso mi contraseña, la clave se agrega de forma permanente, es decir, cada vez que apago la computadora e inicio sesión nuevamente, la clave ya está agregada.

En el otro, tengo que agregar la clave cada vez que inicio sesión.

Por lo que recuerdo, hice lo mismo en ambos. La única diferencia es que la clave se creó en la que se agrega permanentemente.

¿Alguien sabe cómo agregarlo permanentemente a la otra máquina también?

duduklein
fuente
1
el agente debe ser solo temporal; pero es posible que tenga el comando ssh-add en algún lugar de ~ / .bashrc más o menos en una de las dos máquinas
mirek el

Respuestas:

632

Una solución sería forzar a los archivos clave a mantenerse permanentemente, agregándolos en su ~/.ssh/configarchivo:

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer

Si no tiene un archivo 'config' en el directorio ~ / .ssh, debe crear uno. No necesita derechos de root, así que simplemente:

nano ~/.ssh/config

... e ingrese las líneas de arriba según sus requisitos.

Para que esto funcione, el archivo debe tener chmod 600. Puede usar el comando chmod 600 ~/.ssh/config.

Si desea que todos los usuarios de la computadora usen la clave, coloque estas líneas /etc/ssh/ssh_configy la clave en una carpeta accesible para todos.

Además, si desea establecer la clave específica para un host, puede hacer lo siguiente en su ~ / .ssh / config:

Host github.com
    User git
    IdentityFile ~/.ssh/githubKey

Esto tiene la ventaja cuando tiene muchas identidades que un servidor no le rechaza porque primero probó las identidades incorrectas. Solo se intentará la identidad específica.

daminetreg
fuente
82
Permisos en el archivo de configuración debería ser 600.chmod 600 config
generalopinion
66
Tengo que ingresar mi contraseña para cada inserción, búsqueda o clonación con esto, ¿cómo puedo evitar eso?
Asaf
99
Use en su lugar ssh-add ~/.ssh/gitHubKey, recordará su contraseña clave. La solución que propuse fue establecerlo permanentemente en todos los reinicios.
daminetreg
28
Esta respuesta es tan buena que ssh-add no debería existir. ¿Quién quiere tener un comando que "temporalmente" soluciona un problema y se rompe inesperadamente cuando puede editar un archivo de configuración de forma permanente.
RussellStewart
2
El problema es con este tipo de configuración, si no lo hace en .ssh / config para un Host específico, se probará todas las claves contra todos los servidores cada vez.
daminetreg
118

Esto no respondió el mismo problema para mí en Mac OS X Lion. Terminé agregando:

ssh-add ~/.ssh/id_rsa &>/dev/null

Para mi .zshrc (pero .profile también estaría bien), que parece haberlo solucionado.

(Como se sugiere aquí: http://geek.michaelgrace.org/2011/09/permanently-add-ssh-key-ssh-add/ )

Aaron
fuente
66
Creo que es mejor que la solución que propuse, porque ssh-add utiliza un agente de autenticación que puede recordar la frase de contraseña de una clave privada protegida, por lo que no necesita escribirla cada vez que intenta autenticarse. Otra ventaja de la solución que propone es que si tiene muchas claves, el cliente ssh no propondrá claves irrelevantes para el servidor al que intenta conectarse, de hecho, solo proporcionará las claves que son para este servidor, y ganó ' No hace que el servidor rechace la conexión debido a que se llegó a MaxAuthTries, al intentar todas las claves enumeradas en ssh / config.
daminetreg
1
Gracias @daminetreg. Mi problema particular era la necesidad de acceder a la gitosis en una máquina de desarrollo sin transferirle mi clave privada. Esta solución (junto con agregar ForwardAgent yesa mi .ssh/config) resolvió ese problema fantásticamente. Como resultado, podría ser ssh-add &>/dev/nullque el comportamiento predeterminado de ssh-addparece ser agregar las claves que encuentra en su .sshcarpeta.
Aaron
1
Tengo entendido que hay un interruptor -K en Mac OS: stackoverflow.com/questions/1909651/…
Nicu Tofan
3
@TNick -Kagrega claves al llavero de OS X, que las GUI de OS X usan para autenticarse en servidores extranjeros. El póster en esa Q se conecta a través de un túnel SSH, pero todavía se conecta a un servidor remoto. A - [Túnel SSH] -> B El caso en el que estoy es que estoy en un servidor remoto pero quiero que la autenticación esté en contra de las credenciales en mi sistema doméstico. A <- [Auth] - B - [Connect] -> C Así -Kque en realidad no ayuda, pero es una gran solución para la otra Q.
Aaron
112

Resolví ese problema en Mac OSX (10.10) usando la opción -K para ssh-add:

ssh-add -K ~/.ssh/your_private_key

Para macOS 10.12 y posterior, necesita editar adicionalmente su configuración ssh como se describe aquí: https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain

totas
fuente
3
esta es una mejor respuesta para las personas que desean configurarlo permanentemente
punkrockpolly
12
De ahí este bit: "en Mac OSX (10.10)" ...
Andrew K.
1
Esto es bueno y funciona en Mac OSX, pero no funciona en Ubuntu (14.04 en mis pruebas).
haxpor
55
Esto no funcionó para mí (en OSX 10.12.4)
guptron
2
De acuerdo con man ssh-addmacOS High Sierra, ssh-add -Kguardará la frase de contraseña en el llavero y, después de reiniciar, simplemente use ssh-add -A, que no necesita que ingrese su frase de contraseña.
DawnSong
36

Simplemente agregue el llavero, como se menciona en los Consejos rápidos de Ubuntu https://help.ubuntu.com/community/QuickTips

Qué

En lugar de iniciar constantemente ssh-agent y ssh-add, es posible usar keychain para administrar sus claves ssh. Para instalar el llavero, puede hacer clic aquí o usar Synaptic para hacer el trabajo o apt-get desde la línea de comandos.

Línea de comando

Otra forma de instalar el archivo es abrir el terminal (Aplicación-> Accesorios-> Terminal) y escribir:

sudo apt-get install keychain

Editar archivo

Luego debe agregar las siguientes líneas a su $ {HOME} /. Bashrc o /etc/bash.bashrc:

keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh
Christian Saiki
fuente
¿Qué hace exactamente el segundo comando, por curiosidad? esto solo abre los permisos para el usuario actual?
Vincent Buscarello
1
Este .es un alias parasource
Brad Solomon el
18

Probé la solución de @ Aaron y no funcionó para mí, porque volvería a agregar mis claves cada vez que abriera una nueva pestaña en mi terminal. Así que lo modifiqué un poco (tenga en cuenta que la mayoría de mis claves también están protegidas con contraseña, por lo que no puedo enviar la salida a / dev / null):

added_keys=`ssh-add -l`

if [ ! $(echo $added_keys | grep -o -e my_key) ]; then
    ssh-add "$HOME/.ssh/my_key"
fi

Lo que esto hace es que comprueba la salida de ssh-add -l(que enumera todas las claves que se han agregado) para una clave específica y, si no la encuentra, la agrega con ssh-add.

Ahora, la primera vez que abro mi terminal, me piden las contraseñas de mis claves privadas y no me vuelven a preguntar hasta que reinicie (o cierre la sesión, no he verificado) mi computadora.

Como tengo un montón de claves, almaceno la salida ssh-add -len una variable para mejorar el rendimiento (al menos supongo que mejora el rendimiento :))

PD: estoy en Linux y este código fue a mi ~/.bashrcarchivo; si está en Mac OS X, supongo que debe agregarlo .zshrco.profile

EDITAR: como señaló @Aaron en los comentarios, el .zshrcarchivo se usa desde el zshshell, por lo que si no lo está usando (si no está seguro, lo más probable es que lo esté usando bash), este código debería ve a tu .bashrcarchivo.

Nikola Ivanov Nikolov
fuente
3
.zshrces para el zshshell, que uso en lugar de bash. Si está utilizando bashMac OS X (el valor predeterminado), también estaría .bashrcallí.
Aaron
1
Después del ssh-add -lcódigo de retorno echo $?se puede usar para decidir si agregar clave o no. Soy mi máquina Linux con bash, ssh-add -lno mostrará el nombre de archivo clave. El código de retorno siempre funciona.
Bharat G
12

En mi caso la solución fue:

Los permisos en el archivo de configuración deben ser 600. chmod 600 config

Como se menciona en los comentarios anteriores por generalopinion

No es necesario tocar el contenido del archivo de configuración.

erezmta
fuente
No fue suficiente para mí en Linux Mint 17.1.
Benares
No creo que 600 tenga sentido. man ssh nos dice que el ~/.ssh/configarchivo es de lectura / escritura para el usuario, y no puede ser escrito por otros.
DawnSong
600 es de lectura y escritura solo para el usuario
Enthusiasmus
6

Tuve el mismo problema en Ubuntu 16.04: algunas claves se agregaron permanentemente, para otras tuve que ejecutarlas ssh-adden cada sesión. Descubrí que las claves que se agregaron permanentemente tenían claves privadas y públicas ubicadas ~/.sshy las claves que se olvidaron en cada sesión solo tenían claves privadas en ~/.sshdir. Entonces, la solución es simple: debe copiar tanto la clave privada como la pública ~/.sshantes de ejecutarla ssh-add.

PD: Por lo que yo entiendo de Gnome wiki, mi método funciona gracias a la herramienta gnome-keyring, que forma parte del entorno de escritorio Gnome. Por lo tanto, mi método probablemente debería funcionar solo si usa Gnome o DE basado en Gnome.

NShiny
fuente
1
Respuesta infravalorada. Esto resolvió mi problema sin necesidad de scripts o paquetes adicionales después de buscar durante dos horas.
etagenklo
Flarkin fabuloso! Gran trabajo de detective. No creo que hubiera resuelto esto.
nicorellius
4

Agregar las siguientes líneas en "~ / .bashrc" resolvió el problema para mí. Estoy usando Ubuntu 14.04 de escritorio.

eval `gnome-keyring-daemon --start`
USERNAME="reynold"
export SSH_AUTH_SOCK="$(ls /run/user/$(id -u $USERNAME)/keyring*/ssh|head -1)"
export SSH_AGENT_PID="$(pgrep gnome-keyring)"
reynoldpj
fuente
3

En Ubuntu 14.04 (tal vez antes, tal vez aún) ni siquiera necesita la consola:

  • inicie seahorseo inicie lo que encuentre buscando "clave"
  • cree una clave SSH allí (o importe una)
    • no es necesario dejar la frase de contraseña vacía
    • se le ofrece incluso enviar la clave pública a un servidor (o más)
  • terminarás con un agente ssh ejecutándose y esta clave cargada, pero bloqueada
  • el uso sshrecogerá la identidad (es decir, la clave) a través del agente
  • en el primer uso durante la sesión, se verificará la frase de contraseña
    • y tienes la opción de desbloquear automáticamente la clave al iniciar sesión
    • esto significa que la autenticación de inicio de sesión se usará para ajustar la frase de contraseña de la clave
  • Nota: si desea pasar su identidad (es decir, agente de reenvío) invocan tu sshcon -Ao hacer que el valor predeterminado
    • de lo contrario, no puede autenticarse con esa clave en una máquina en la que inicie sesión más tarde en una tercera máquina
Robert Siemer
fuente
3

Ejecuto Ubuntu usando dos claves id_rsa. (uno personal para el trabajo). ssh-add recordaría una clave (personal) y olvidaría la compañía cada vez.

Al comprobar la diferencia entre los dos, vi que mi clave personal tenía 400 derechos, mientras que la empresa tenía 600 derechos. (tenía u + w). La eliminación de la escritura del usuario directamente desde la clave de la empresa (uw o establecida en 400) solucionó mi problema. ssh-add ahora recuerda ambas teclas.

Fholst
fuente
2

Esto funcionó para mí.

ssh-agent /bin/sh
ssh-add /path/to/your/key
Jaseem Abbas
fuente
1

muy simple ^ _ ^ dos pasos

1.yum instalar llavero

2.añada el siguiente código a .bash_profile

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh
LawrenceLi
fuente
12
Ubuntu no tiene yum tonto;)
Adam F
1

Para aquellos que usan Fish Shell, puede usar la siguiente función y luego llamarla ~/.config/fish/config.fisho en un archivo de configuración separado ~/.config/fish/conf.d/loadsshkeys.fish. Cargará todas las claves que comienzan con id_rsa en el ssh-agent.

# Load all ssh keys that start with "id_rsa"
function loadsshkeys
  set added_keys (ssh-add -l)
   for key in (find ~/.ssh/ -not -name "*.pub" -a -iname "id_rsa*")
    if test ! (echo $added_keys | grep -o -e $key)
      ssh-add "$key"
    end
  end
end

# Call the function to run it.
loadsshkeys

Si desea que el ssh-agentauto se inicie cuando abra una terminal, puede usar tuvistavie / fish-ssh-agent para hacerlo.

frederickjh
fuente