web-dev-qa-db-fra.com

La clé ssh doit-elle s'appeler id_rsa?

J'ai rencontré ce problème plusieurs fois lors de la création de serveurs de génération avec authentification par clé.

Je me demandais si quelqu'un d'autre a déjà expérimenté cela. J'ai quelques clés pour mon utilisateur actuel qui peuvent se connecter à différentes machines. Laissez dire machine1 et machine2. J'ai collé ma clé publique dans leur fichier allowed_keys respectif. Le premier que j'ai nommé la première clé id_rsa et la deuxième clé bender.

Lorsque j'essaie de me connecter à Bender, la sortie suivante est fournie avec ma connexion ssh verbose

debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /home/bozo/.ssh/.ssh/identity
debug1: Trying private key: /home/bozo/.ssh/.ssh/id_rsa
debug1: Trying private key: /home/bozo/.ssh/id_dsa
debug1: No more authentication methods to try.
Permission denied (publickey).

Comme vous pouvez le voir ci-dessus, il n’offre que la clé id_rsa. Est-ce correct? Si oui, pourquoi? Comment puis-je l'obtenir pour offrir plus de clés? Je sais que c'est un problème que je vois par intermittence, car chez moi, j'ai plusieurs clés sans trop de peine.

J'apprécierais également un aperçu de la manière dont la clé publique et la clé privée interagissent avec le client et le serveur. Je pensais que j'avais une idée assez décente, mais apparemment, il me manque quelque chose.

S'il te plaît et merci.

124
myusuf3

Par défaut, ssh recherche les fichiers id_dsa et id_rsa. Les clés ne doivent pas obligatoirement être nommées ainsi, vous pouvez aussi le nommer mykeyname__, ou même le placer dans un autre répertoire. Cependant, si vous utilisez l'une de ces méthodes, vous devez explicitement référencer la clé dans la commande ssh comme suit:

ssh user@server -i /path/to/mykey

Si une commande n'accepte pas -i, par exemple. sshfsname__, utilisez l'option IdentityFilename__:

sshfs -o IdentityFile=/path/to/mykey user@Host:/path/on/remote /mountpoint

Comment ça marche

Lors de la génération d'une clé, vous aurez deux fichiers: id_rsa (clé privée) et id_rsa.pub (clé publique). Comme leur nom l'indique, la clé privée doit rester secrète et la clé publique peut être publiée.

L'authentification par clé publique fonctionne avec une clé publique et une clé privée. Le client et le serveur ont leurs propres clés. Lors de l'installation de openssh-server, les clés publique et privée du serveur sont générées automatiquement. Pour le client, vous devrez le faire vous-même.

Lorsque vous (client) vous connectez à un serveur, des clés publiques sont échangées. Vous recevrez les serveurs un, et le vôtre. La première fois que vous recevez la clé publique du serveur, il vous sera demandé de l’accepter. Si cette clé publique change au fil du temps, vous en serez averti car une éventuelle attaque MITM (homme au milieu) est en cours, interceptant le trafic entre le client et le serveur.

Le serveur vérifie si vous êtes autorisé à vous connecter (défini dans /etc/ssh/sshd_config) et si votre clé publique est répertoriée dans le fichier ~/.ssh/authorized_keys. Raisons possibles pour lesquelles la clé publique est refusée:

  • /etc/ssh/sshd_config:
    • AllowUsersou AllowGroupsest spécifié, mais votre utilisateur de serveur ne figure pas dans la liste des groupes ou des utilisateurs (par défaut, non défini, sans restriction pour les utilisateurs ou les groupes de se connecter).
    • DenyUsersou DenyGroupsest spécifié et vous vous trouvez dans la liste des utilisateurs ou des groupes.
    • Vous essayez de vous connecter en tant qu'utilisateur root, mais PermitRootLoginest défini sur No(valeur par défaut yesname__).
    • PubkeyAuthenticationest défini sur No(par défaut yesname__).
    • AuthorizedKeysFileest défini sur un autre emplacement et les clés publiques ne sont pas ajoutées à ce fichier (valeur par défaut .ssh/authorized_keys, relative à home dir)
  • ~/.ssh/authorized_keys: votre clé publique n'est pas ajoutée dans ce fichier (notez que ce fichier est lu en tant qu'utilisateur root)

Utilisation de plusieurs clés

Il n'est pas rare d'utiliser plusieurs clés. Au lieu d'exécuter ssh user@Host -i /path/to/identity_file, vous pouvez utiliser un fichier de configuration, ~/.ssh/config.

Les paramètres communs sont IdentityFile (les clés) et le port. La prochaine configuration vérifiera "id_dsa" et "bender" uniquement lors de la connexion avec ssh youruser@yourhost:

Host yourhost
   IdentityFile ~/.ssh/id_dsa
   IdentityFile ~/.ssh/bender

Si vous omettez Host yourhost, les paramètres s’appliqueront à toutes les connexions SSH. D'autres options peuvent également être spécifiées pour cette correspondance d'hôte, telles que User youruser, Port 2222, etc. Cela vous permettrait de vous connecter avec le raccourci ssh yourhost au lieu de ssh -p2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender.

150
Lekensteyn

Ma méthode préférée permet la sélection automatique de la clé privée

IdentityFile ~/.ssh/%l_%r@%h_id_rsa

SSH remplacera% l par le nom de la machine locale,% r par le nom d'utilisateur distant et% h par l'hôte distant. Par conséquent, si je souhaite me connecter à partir de ma machine appelée foo pour interdire à un utilisateur, je lance:

ssh bar

Et ssh utiliserait automatiquement:

~/.ssh/foo_user@bar_id_rsa

Comme l'hôte local est également stocké, cela permet de créer des répertoires personnels partagés sur NFS (clé différente par machine!) Ou même d'identifier la machine sur laquelle la clé était censée être placée ...

35
Viperfang

Compte tenu du commentaire de StevenRoose selon lequel il faut plus de temps pour spécifier de nombreuses clés et que je joue avec beaucoup de clés, j'aimerais suggérer ma solution personnelle.

Je crée un lien symbolique vers la clé que je souhaite utiliser à ce moment-là, et comme cela ne change que rarement selon le projet sur lequel je travaille, j'en suis heureux.

Ici, j'ai lié à mes clés pour les machines fonctionnant sous virtualbox:

$ cd .ssh/
$ ln -s adam_vbox-id_rsa.pub id_rsa.pub
$ ln -s adam_vbox-id_rsa id_rsa

$ ls -l
total 12
-rw------- 1 adam adam 1675 2013-10-04 02:04 adam_vbox-id_rsa
-rw-r--r-- 1 adam adam  396 2013-10-04 02:04 adam_vbox-id_rsa.pub
lrwxrwxrwx 1 adam adam   16 2013-10-04 02:17 id_rsa -> adam_vbox-id_rsa
lrwxrwxrwx 1 adam adam   20 2013-10-04 02:17 id_rsa.pub -> adam_vbox-id_rsa.pub
-rw-r--r-- 1 adam adam 3094 2013-10-04 02:09 known_hosts

On pourrait aussi ajouter un script très rapide pour passer à un autre jeu sans avoir à taper à nouveau manuellement la commande ln.

Encore une fois, ce n'est pas une solution pour deux clés seulement, mais pour un plus grand nombre, cela pourrait être réalisable.

1
ajhcasual