Gérer plusieurs clés SSH

2

J'ai beaucoup de clés SSH, elles sont toutes protégées par une phrase secrète et gérées par SSH-Agent. À la suite de cela, je reçois maintenant "Trop d'échecs d'authentification" sur certaines connexions.

Comme cela a déjà été expliqué sur ce site, c’est que ssh essaiera toutes les clés que l’agent lui lance.

La solution proposée consiste à utiliser IdentitiesOnly dans la configuration, avec un fichier IdentityFile. Bien que cela cesse effectivement d’offrir de mauvaises clés, il semble que l’agent soit complètement désactivé. Je dois maintenant taper la phrase secrète à chaque connexion.

Je n'ai pas trouvé d'informations claires à ce sujet. Est-ce qu'IdentitiesOnly désactive simplement l'obtention complète des clés de ssh-agent? Ou devrait-il simplement bloquer les clés qui ne sont pas mentionnées?

Merci, 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
la source
J'ai un serveur qui n'utilise que l'authentification par clé, j'ai ajouté le 'IdentitiesOnly yes' avec IdentityFile et il se connecte normalement si je ssh -vvv je vois qu'il n'offre que la clé spécifiée, puis je me connecte à un autre hôte ne se trouvant pas dans .ssh / config je peux me connecter correctement, que voulez-vous dire par «désactive l'agent en entier»
Joel Davey

Réponses:

1

Est-ce qu'IdentitiesOnly désactive simplement l'obtention complète des clés de ssh-agent? Ou devrait-il simplement bloquer les clés qui ne sont pas mentionnées?

& amp;

il semble qu'il désactive complètement l'agent dans son intégralité

Ceci est le comportement voulu comme décrit dans la page de manuel 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.

Il y a une solution de contournement: ssh-add. Bien qu'un agent de clé SSH normal semble être désactivé à l'aide de IdentitiesOnly, ceux que j’ajoute en utilisant ssh-add sont utilisés quand même.

gertvdijk
la source
Merci pour votre réponse. Dans mon cas, j’ai ajouté les clés via ssh-add, donc cela ne semble pas fonctionner pour moi.
Mathijs Kwik
Je dois dire que je pense que ce comportement souhaité est étrange. Cela rend fondamentalement un agent inutilisable lorsque vous avez plus de 6 clés. Revenir aux clés sans phrase secrète ne semble pas être une bonne option.
Mathijs Kwik
@MathijsKwik Avez-vous déjà trouvé une solution à cela?
crdx
Pouvez-vous préciser ce que "handicapé" signifie?
Joel Davey
@JoelDavey Ignorez les clés proposées par l'agent; ne l'interrogez pas - considérez uniquement les clés accessibles directement sous forme de fichier.
gertvdijk
0

J'ai aussi beaucoup de clés et j'ai juste trouvé un moyen de faire ça ce soir:

#!/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
}

Connecter en utilisant:

ssh_connect "server" "user"

Cela suppose que votre clé privée est $ HOME / .ssh / {nom d'utilisateur}, mais elle pourrait être adaptée bien sûr.

Il exporte la clé publique de l'agent et l'utilise. S'il n'a pas encore été ajouté à l'agent, il utilise plutôt la clé privée.

Notez que cela va effacer votre configuration ssh donc il devrait être modifié pour réécrire votre config au lieu de le supprimer si vous avez quelque chose à garder là-dedans.

Chelsea Urquhart
la source