web-dev-qa-db-fra.com

Comment configurer SSH pour ne pas essayer automatiquement tous les fichiers d’identité?

Je mets mes fichiers d’identité ssh dans mon dossier ~/.ssh /. J'ai probablement environ 30 fichiers ici.

Lorsque je me connecte à des serveurs, je vais spécifier le fichier d'identité à utiliser, avec quelque chose comme:

 ssh -i ~/.ssh/client1-identité [email protected] 

Cependant, si je ne spécifie pas de fichier d'identité et que j'utilise quelque chose comme ceci:

 ssh [email protected] 

Je reçois l'erreur

Trop d'échecs d'authentification pour user123

Je comprends que c’est parce que si aucun fichier d’identité n’est spécifié et que ssh peut trouver des fichiers d’identité, il les testera tous.

Je comprends aussi que je peux éditer le fichier ~/.ssh/config et spécifier quelque chose comme:

 Host example.com 
 PreferredAuthentications avec clavier, interactif, mot de passe 

afin d'empêcher cette connexion d'essayer des fichiers d'identité connus.

Donc, je suppose que je pourrais déplacer mes fichiers d'identité en dehors du répertoire ~/.ssh/ ou spécifier chaque hôte pour lequel je souhaite désactiver l'authentification de fichier d'identité dans le fichier de configuration, mais existe-t-il un moyen de dire à SSH d'acheter la valeur par défaut? pour les fichiers d'identité? Ou pour spécifier ceux qu'il recherchera?

95
cwd

Vous pouvez utiliser l'option IdentitiesOnly=yes avec IdentityFile (voir page de manuel de ssh_config ). De cette façon, vous pouvez spécifier le (s) fichier (s) à rechercher.

Dans cet exemple, ssh cherchera only dans les identités indiquées dans les fichiers ssh_config + les 4 identifiées dans la ligne de commande (les identités fournies par l'agent seront ignorées):

ssh -o IdentitiesOnly=yes \
    -o IdentityFile=id1.key \
    -o IdentityFile=id2.key \
    -i id3.key \
    -i id4.key \
    [email protected]

Les formulaires -i et -o IdentityFile= sont interchangeables.

92
user76528

la réponse courte de user76528 est correcte, mais je viens d'avoir ce problème et pensais que quelques précisions seraient utiles. Vous pouvez également vous intéresser à cette solution si vous vous demandez "Pourquoi ssh ignore-t-il l'option de configuration de mon fichier d'identité"?

Tout d’abord, contrairement à toutes les autres options de ssh_config, ssh n’utilise pas la première IdentityFile qu’elle trouve. Au lieu de cela, l'option IdentityFile ajoute ce fichier à une liste d'identités utilisées. Vous pouvez empiler plusieurs options IdentityFile et le client ssh les testera toutes jusqu'à ce que le serveur en accepte une ou rejette la connexion.

Deuxièmement, si vous utilisez un agent ssh, ssh essaiera automatiquement d'utiliser les clés de l'agent, même si vous ne les avez pas spécifiées avec l'option IdentityFile (ou -i) de ssh_config. C’est une raison courante pour laquelle vous pourriez obtenir l’erreur Too many authentication failures for user. L'utilisation de l'option IdentitiesOnly yes désactive ce comportement.

Si vous utilisez plusieurs utilisateurs sur plusieurs systèmes, je vous recommande de placer IdentitiesOnly yes dans votre section globale de ssh_config et de placer chaque IdentityFile dans les sous-sections appropriées de l'hôte.

77
chrishiestand

Je le fais généralement comme ça:

$ ssh -o IdentitiesOnly=yes -F /dev/null -i ~/path/to/some_id_rsa [email protected]

Les options sont les suivantes:

  • -o IdentitiesOnly=yes - indique à SSH de n'utiliser que les clés fournies via l'interface de ligne de commande et aucune depuis le $HOME/.ssh ou via ssh-agent
  • -F /dev/null - désactive l'utilisation de $HOME/.ssh/config
  • -i ~/path/to/some_id_rsa - la clé que vous voulez explicitement utiliser pour la connexion

Exemple

$ ssh -v -o IdentitiesOnly=yes -F /dev/null -i ~/my_id_rsa [email protected]
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /dev/null
debug1: Connecting to someserver.mydom.com [10.128.12.124] port 22.
debug1: Connection established.
debug1: identity file /Users/sammingolelli/my_id_rsa type 1
debug1: identity file /Users/sammingolelli/my_id_rsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.3
debug1: match: OpenSSH_5.3 pat OpenSSH_5*
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server Host key: RSA f5:60:30:71:8c:a3:da:a3:fe:b1:6d:0b:20:87:23:e1
debug1: Host 'someserver' is known and matches the RSA Host key.
debug1: Found key in /Users/sammingolelli/.ssh/known_hosts:103
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/sammingolelli/my_id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 535
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
Authenticated to someserver.mydom.com ([10.128.12.124]:22).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
Last login: Tue Dec  8 19:03:24 2015 from 153.65.219.15
someserver$

Notez dans la sortie ci-dessus que ssh n'a identifié que la clé privée my_id_rsa via la CLI et qu'elle l'utilise pour se connecter à someserver.

Plus précisément ces sections:

debug1: identity file /Users/sammingolelli/my_id_rsa type 1
debug1: identity file /Users/sammingolelli/my_id_rsa-cert type -1

et:

debug1: Next authentication method: publickey
debug1: Offering RSA public key: /Users/sammingolelli/my_id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 535
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
18
slm

Dans le cas où vous avez plusieurs clés, vous rencontrerez invariablement l'erreur "Trop d'échecs d'authentification". Si vous avez un mot de passe et souhaitez simplement vous en servir pour vous connecter, voici comment procéder.

Pour utiliser UNIQUEMENT l'authentification par mot de passe et NON pour utiliser la clé publique et NE PAS utiliser le "clavier interactif" quelque peu trompeur (qui est un sur-ensemble comprenant un mot de passe), vous pouvez le faire à partir de la ligne de commande:

ssh -o PreferredAuthentications=password [email protected]
9
Greg Rundlett

Utilisez IdentityFile mais continuez à utiliser ssh-agent pour éviter les reprogrammes de phrase secrète

La solution acceptée consistant à utiliser IdentitiesOnly yes signifie que vous ne pourrez jamais tirer parti de ssh-agent, ce qui entraîne des invites répétées pour votre phrase secrète lors du chargement de votre clé.

Pour continuer à utiliser ssh-agent et éviter les erreurs «Trop d'échecs d'authentification», essayez ceci:

  1. Supprimez tous les scripts de démarrage de la console interactive qui chargent automatiquement les clés dans ssh-agent.

  2. ajoutez AddKeysToAgent yes à la configuration ssh de votre client. Cela vous demandera la phrase secrète lors de la première connexion, mais ajoutera ensuite la clé à votre agent.

  3. utilisez ssh-add -D lorsque vous obtenez des erreurs de type "trop ​​d'authentification". Ceci simplement "réinitialise" (supprime) votre cache ssh-agent. Puis tentez à nouveau la connexion au cours de la même session. Une phrase secrète vous sera demandée et, une fois acceptée, elle sera ajoutée à votre agent. Comme vous n’avez qu’une clé dans votre agent, vous serez autorisé à vous connecter. ssh-agent est alors toujours là pour les connexions futures au cours de la même session afin d’éviter les messages réécrits.

    Host ex example.com
       User joe
       HostName example.com
       PreferredAuthentications publickey,password
       IdentityFile /path/to/id_rsa
       AddKeysToAgent yes
    
6
AndrewD

Le client ssh et l'agent-ssh communiquent via un socket de domaine Unix dont le nom est spécifié au client par la variable d'environnement SSH_AUTH_SOCK (définie par l'agent au démarrage).

Ainsi, pour empêcher une seule invocation du client d'interroger l'agent, cette variable peut être définie explicitement sur une valeur non valide, telle qu'une chaîne vide;

$ SSH_AUTH_SOCK= ssh user@server

Une telle invocation client échouera dans la communication avec l'agent et ne sera en mesure de proposer au serveur que les identités disponibles sous forme de fichiers dans ~/.ssh/ou celles spécifiées sur la ligne de commande à l'aide de -i.

debug1: pubkey_prepare: ssh_get_authentication_socket: Connection refused
1
mikini

Vous avez eu la réponse tout le temps (ou presque):

Host *
PreferredAuthentications keyboard-interactive,password

Travaillé pour moi.

0
Henry Grebler