Administrar múltiples claves ssh

2

Tengo muchas claves ssh, todas están protegidas por contraseña y administradas por ssh-agent. Como resultado de esto, ahora recibo "Demasiadas fallas de autenticación" en algunas conexiones.

Como se explicó anteriormente en este sitio, esto se debe a que ssh probará todas las claves que el agente le arroje.

La solución propuesta es usar IdentitiesOnly en la configuración, junto con un IdentityFile. Si bien esto realmente deja de ofrecer claves incorrectas, parece que deshabilita completamente al agente por completo, por lo que ahora tengo que escribir la frase de contraseña en cada conexión.

No pude encontrar información clara sobre esto. ¿IdentitiesOnly solo desactiva la obtención de claves de ssh-agent en su totalidad? ¿O debería bloquear las claves que no se mencionan?

Gracias Mathijs

# here's my config
~% cat .ssh/config
Host bluemote
  HostName some.host.com
  IdentitiesOnly yes
  IdentityFile /home/mathijs/.ssh/keys/bluebook_ecdsa

# I had the key loaded into the agent, shown here
~% ssh-add -L
ecdsa-sha2-nistp521 SOME_LONG_BASE64_NUMBER== /home/mathijs/.ssh/keys/bluebook_ecdsa

# but it doesn't seem to get used
~% ssh bluemote
Enter passphrase for key '/home/mathijs/.ssh/keys/bluebook_ecdsa':
Mathijs Kwik
fuente
Tengo un servidor que solo es autenticación de clave, he agregado 'IdentitiesOnly yes' con IdentityFile y se conecta normalmente si ssh -vvv puedo ver que solo ofrece mi clave especificada, luego me conecto a otro host que no está en .ssh / config Puedo conectarme bien, ¿qué quieres decir con 'deshabilita al agente por completo'?
Joel Davey

Respuestas:

1

¿IdentitiesOnly solo desactiva la obtención de claves de ssh-agent en su totalidad? ¿O debería bloquear las claves que no se mencionan?

Y

parece que deshabilita completamente al agente por completo

Este es el comportamiento previsto como se describe en la página de manual ssh_config(5):

 IdentitiesOnly
         Specifies that ssh(1) should only use the authentication identity
         files configured in the ssh_config files, even if ssh-agent(1)
         offers more identities.  The argument to this keyword must be
         “yes” or “no”.  This option is intended for situations where ssh-
         agent offers many different identities.  The default is “no”.

 IdentityFile
         Specifies a file from which the user's DSA, ECDSA or DSA authen‐
         tication identity is read.  The default is ~/.ssh/identity for
         protocol version 1, and ~/.ssh/id_dsa, ~/.ssh/id_ecdsa and
         ~/.ssh/id_rsa for protocol version 2.  Additionally, any identi‐
         ties represented by the authentication agent will be used for
         authentication.  ssh(1) will try to load certificate information
         from the filename obtained by appending -cert.pub to the path of
         a specified IdentityFile.

Hay una workround: ssh-add. Si bien un agente de clave SSH normal parece estar deshabilitado usando IdentitiesOnly, los que agrego usando ssh-addse usan de todos modos.

gertvdijk
fuente
Gracias por tu respuesta. En mi caso, agregué las claves a través de ssh-add, por lo que esto no parece funcionar para mí.
Mathijs Kwik
Debo decir que creo que este comportamiento previsto es extraño. Básicamente, esto hace que un agente sea inutilizable cuando tienes más de 6 claves. Volver a las claves sin frase de contraseña no parece una buena opción.
Mathijs Kwik
@MathijsKwik ¿Alguna vez encontraste una solución para esto?
crdx
¿Puede aclarar qué significa "deshabilitado"?
Joel Davey
@JoelDavey Haga caso omiso de las claves ofrecidas por el agente; no lo consultes, solo considera las claves accesibles como un archivo directamente.
gertvdijk
0

También tengo muchas llaves y descubrí una forma de hacerlo esta noche:

#!/bin/bash
remove_public () { # remove the public key after 2 seconds
  sleep 2
  rm -f $HOME/.ssh/public_key $HOME/.ssh/config
}

get_public () { # get the public key from ssh-add
  ssh-add -L | grep "$1" > $HOME/.ssh/public_key
  if [ ! -s "$HOME/.ssh/public_key" ] #identity hasn't yet been loaded
  then
    export KEY="$1" #use the private key it'll be added to the agent for next time assuming agent is configured.
  else
    export KEY="$HOME/.ssh/public_key" #use the public key
    ( remove_public & ) >/dev/null 2>&1
  fi
  chmod 700 "$KEY"
  echo "IdentitiesOnly=yes" > "$HOME/.ssh/config"
  echo "IdentityFile $KEY" >> "$HOME/.ssh/config"
}

ssh_connect () {
  chmod -R 700 $HOME/.ssh
  if [[ -z "$1" || -z "$2" ]]
  then
    echo "Username or server not specified!"
    exit 1;
  else
    get_public "$HOME/.ssh/$2"
    ssh "$2@$1" -i "$HOME/.ssh/$2"
  fi
}

Conéctese usando:

ssh_connect "server" "user"

Esto supone que su clave privada es $ HOME / .ssh / {username} pero, por supuesto, podría adaptarse.

Exporta la clave pública del agente y la usa. Si aún no se ha agregado al agente, utiliza la clave privada.

Tenga en cuenta que eliminará su configuración ssh, por lo que debe modificarse para reescribir su configuración en lugar de eliminarla si tiene algo allí que deba conservar.

Chelsea Urquhart
fuente