Comment utiliser la clé privée SSH pour se connecter sans saisir de phrase secrète à chaque fois sur Mac OS X Lion?

23

J'utilise Mac OS X Lion et je me connecte à des hôtes distants via SSH tous les jours. Malgré le fait que j'utilise une paire de clés SSH pour l'authentification à distance et que je n'ai pas besoin de motoriser la phrase de connexion de chaque hôte, il est toujours très ennuyeux que le terminal demande la phrase secrète pour accéder à ma clé privée SSH.

Pour des raisons de sécurité, je pense qu'une phrase secrète pour accéder à la clé privée SSH est indispensable. Existe-t-il un moyen qui permet au terminal de demander la phrase exactement une seule fois au démarrage, puis de la mémoriser et d'utiliser automatiquement ma clé privée dans les sessions SSH ultérieures?

Il existe un script appelé keychainqui fonctionne très bien sur Gentoo Linux. Mais je ne l'ai jamais compris sur Mac OS X Lion. De plus, il y a tellement de termes intimidants, comme ssh-agent, ssh-add. Après avoir lu divers documents sur ces boîtes à outils SSH et fait des expériences frustrées, je suis devenu plus confus.

Par conséquent, je suis venu à StackExchange, à la recherche de conseils sur les questions suivantes.

  1. Quels sont ssh-agent, ssh-add, keychain, Keychain Access.appet comment ils interagissent les uns avec les autres?
  2. Comment puis-je saisir la phrase secrète de ma clé privée SSH une fois à la connexion et l'utiliser librement lors de la création de session SSH ultérieure?
  3. Euh ... Qu'est-ce qui ne va pas Keychain Access.app? Il ne stocke pas la phrase SSH comme auparavant.

Je liste ce que j'ai fait ici. J'espère qu'il y a des indices sur les étapes que j'ai manquées.

Étape 1. Créez une paire de clés SSH sur mon Mac.

$ ssh-keygen -t rsa -C "[email protected]"
# Set a passphrase for accessing the private key.

Étape 2. Copiez ma clé publique SSH sur l'hôte distant. Pour prendre un exemple, je copie la clé sur localhost, Mac.

$ ssh-copy-id USER@localhost
# Enter the login password for USER at localhost, not my SSH passphrase

Étape 3. Ensuite, essayez de vous connecter à l'hôte distant (localhost ici), via l'authentification par paire de clés SSH.

$ ssh USER@locahost
Enter passphrase for key '/Users/YOUR_ACCOUNT/.ssh/id_rsa': 
# Enter my SSH passphrase, not the login password.

Étape 4. Déconnectez-vous de l'hôte distant et essayez de vous y connecter à nouveau. Merde, le terminal demande à nouveau la phrase SSH.

Une question fréquemment posée est: "Est-ce que ssh-agent fonctionne bien sur votre Mac?". Franchement, je n'ai aucune idée de ce qui se passe. Voici quelques résultats en cours d'exécution.

$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(EMPTY)
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-Z54zXukQiP/agent.26769; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26770; export SSH_AGENT_PID;
echo Agent pid 26770;
$ ssh-add -l
Could not open a connection to your authentication agent.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(STILL EMPTY)
$ ssh-agent  # Oh no, anther ssh-agent with different PID
SSH_AUTH_SOCK=/tmp/ssh-cx0B4FUX8B/agent.26898; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26899; export SSH_AGENT_PID;
echo Agent pid 26899;
$ ps -e | grep -i ssh
26769 ??         0:00.03 ssh-agent
26899 ??         0:00.02 ssh-agent

Toute rétroaction est la bienvenue. Merci!

Jianwen W.
la source
Connexes . Il y a de fortes chances que vous puissiez adapter la réponse acceptée à votre cas d'utilisation.
Daniel Beck

Réponses:

12

ssh-agentest la pièce que vous voulez faire travailler, car elle fait exactement ce que vous demandez. L'agent s'exécute en tant que démon et lorsque vous lui "ajoutez" une clé privée, il se souvient de cette clé et la fournit automatiquement à la télécommande sshdlors de la connexion initiale. ( ssh-addest simplement la commande à laquelle vous exécutez pour ajouter manuellement une clé privée ssh-agent).

Sous OS X, à partir de Leopard, vous ne devriez jamais avoir à exécuter ssh-agentou ssh-addmanuellement. Cela devrait "se produire" lorsque vous essayez de vous connecter à un serveur. Une fois par clé, il vous invitera avec une boîte de dialogue de mot de passe de l'interface utilisateur, qui (entre autres choses) vous permettra d'ajouter automatiquement la clé à la ssh-agentafin que vous ne soyez plus jamais invité.

Ceci est géré en ayant une launchdconfiguration qui écoute les connexions sur le $SSH_AUTH_SOCKsocket, et se lance automatiquement ssh-agentquand il en a besoin; après cela, ssh-agentvous invite à saisir vos informations d'identification uniquement lorsqu'il doit ouvrir une nouvelle clé.

Si cela ne fonctionne pas, assurez-vous que le bon launchdfichier de configuration est présent:

/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist

Si cela ne fonctionne toujours pas pour vous pour une raison quelconque, voici la "vieille" façon de faire fonctionner les choses à la main:

http://timesinker.blogspot.com/2007/08/getting-ssh-agent-going-on-mac-osx.html

Il y a aussi cette application, que j'ai cessé d'utiliser depuis la sortie de Leopard mais qui a essentiellement fait la même chose dans les versions précédentes de Mac OS X:

http://www.sshkeychain.org/

KutuluMike
la source
4
Merci, Michael Edenfield. J'ai compris ce qui ne va pas et maintenant ssh-login-without-passphrase fonctionne parfaitement sur Mac OS X Lion. J'ai fait des choses stupides - j'ai fait un lien symbolique ~/tmppointant vers /tmp/et exécutant une tâche cron pour nettoyer ~/tmptoutes les 2 heures, ce qui a également supprimé le socket ssh-agent. Oh mec, je me déteste.
Jianwen W.12
13

Au cours du processus de résolution du « problème », j'ai googlé des sujets connexes et d' écrire quelques notes sur la façon dont ssh-agent, ssh-add, keychain, KeyChain Access.apptravail. Il s'avère finalement que ce problème n'est pas du tout un problème, mais plutôt de moi, et ce que l'on appelle ssh-login-without-ask-passphrase-every-time fonctionne parfaitement sur Mac prêt à l'emploi.

Cependant, ce processus m'a fait gagner quelques expériences. J'écris mes notes ici dans l'espoir qu'elles aident quelqu'un à confondre ces termes.

Deux termes de mot de passe:

  • passphrase fait référence à la phrase requise lors de l'accès à votre clé privée SSH.
  • password fait référence à l'expression requise pour se connecter à votre Mac.

Maintenant , je peux comprendre ce que ces boîtes à outils font, qui est, ssh-agent, ssh-add, keychain, Keychain Access.appsur Mac.

  • ssh-agentest le service essentiel pour permettre l'utilisation de la clé privée SSH sans saisir de phrase secrète SSH. ssh-agentfonctionne de cette façon. Tout d'abord, il stocke ou met en cache votre clé privée SSH dans la mémoire principale. Ensuite, plus tard dans cette session, lorsque votre clé SSH privée SSH sera nécessaire pour l'authentification à distance, ssh-agentelle trouvera votre clé privée dans la mémoire principale et la remettra au processus distant. La seule chance que l'on vous demande de saisir votre phrase secrète SSH est lorsque votre clé privée est ajoutée ssh-agentinitialement.
  • ssh-addfait partie de la ssh-agentcollection, ce qui permet de gérer vos clés SSH dans ssh-agent. Nous utilisons la ssh-addcommande pour lister, ajouter, supprimer des clés privées dans le trousseau de clés de ssh-agent. ssh-addCommunique ensuite avec le ssh-agentservice pour accomplir les tâches.
  • keychainest un script pour trouver un ssh-agentservice (s'il n'existe pas, en démarrer un nouveau) et appeler ssh-addpour ajouter des clés privées SSH. keychaina une idée simple et directe, fonctionne très bien sur Linux où ssh-agent ne démarre généralement pas automatiquement.
  • Keychain Access.appsemble être le composant le plus compliqué. Il s'agit du service de stockage de jetons universel de Mac OS X. Il stocke divers jetons, tels que les mots de passe, les certificats et autres, et sert d' agent de jeton pour les applications qui demandent les jetons. Dans notre cas de clé privée SSH, il saisit d'abord la demande d'accès à la clé privée SSH et ouvre une fenêtre pour vous demander de stocker la phrase secrète SSH, qui est une sorte de jeton, dans Keychain Access.apple trousseau de clés. Ensuite, la prochaine fois que vous utiliserez des clés privées pour l'authentification, Keychain Access.appune nouvelle fenêtre apparaîtra, vous demandant si vous accordez le privilège. Après avoir obtenu un grand oui, keychain Access.appajoute votre clé privée dans ssh-agentle stockage de.

Deux choses méritent votre attention:

  1. Mac OS X Lion démarre automatiquement un ssh-agentservice au démarrage, en écoutant sur un socket situé sous /tmp.
  2. Keychain Access.appstocke votre phrase secrète SSH, afin qu'il puisse ajouter votre clé privée ssh-agentsans vous interrompre. Oui, pas besoin de taper votre phrase SSH, mais vous devez taper le mot de passe de connexion de votre compte Mac pour accorder le privilège lors de la création de cette entrée pour la première fois.

Donc, en résumé, SSH-login-without-ask-passphrase devrait fonctionner sur Mac OS X prêt à l'emploi.

Jianwen W.
la source
1

Dans le cas où d'autres solutions ici ne fonctionnent pas pour les gens, ce qui suit a fonctionné pour moi.

Pour chaque clé privée de votre répertoire ~ / .ssh, assurez-vous que la clé publique correspondante est également présente. Assurez-vous que la clé publique est nommée exactement de la même manière que la clé privée, mais .pubà la fin. Si vous disposiez déjà d'une clé publique appropriée, essayez de la régénérer.

Si vous avez besoin de recréer les clés publiques, vous pouvez le faire facilement: -

ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub

le remplacer my_keypar le nom de votre clé.

Après cela, MacOS se souvient comme il se doit de la phrase secrète de clé dans le trousseau.

Remarque - entrer la phrase secrète et l'enregistrer le trousseau est désormais une action unique (pas une fois par session de connexion comme OP le souhaite), mais en supposant que la connexion au mac en question est protégée par mot de passe, votre phrase secrète est protégée par ce mot de passe de connexion. De plus, cette solution n'a aucun sens pour moi ... une clé publique ne devrait pas être requise en plus de la clé privée, mais pour une raison quelconque, MacOSX l'exige.

(à l'origine de la réponse à une question similaire sur Apple Stack Exchange)

rowatt
la source
1

La seule chose que je trouve rarement mentionnée concernant la configuration du ~/.sshdossier est de restreindre les autorisations de répertoire.

Pour permettre à ssh d'éviter de demander le mot de passe, j'ai toujours dû définir les autorisations du répertoire personnel de l'utilisateur sur 700, ainsi que les ~/.sshautorisations sur les dossiers 700.

Sinon, il continue de me demander un mot de passe même si toutes les clés sont générées et copiées correctement. Un message d'erreur est généré dans les journaux d'authentification, mais il est invisible pour la plupart des utilisateurs finaux.

Don Wood
la source
0

Une autre chose que vous auriez pu essayer aurait été de remplacer ssh-copy-idpar quelque chose comme k="$(cat ~/.ssh/id_rsa.pub)"; ssh [email protected] "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2".

Lri
la source
0

Cette réponse n'est pas la solution à cette question; cependant c'est très proche (je me suis retrouvé sur cette question en cherchant une solution à mon problème).

Je fais également beaucoup de SSH sur des serveurs distants sur mon Mac, comme décrit dans cette question, mais l' Keychain Access.appapplication a stocké la phrase clé et je n'ai pas besoin de la saisir chaque fois que j'ai besoin de la clé pour m'authentifier sur un serveur SSH.

Cependant, j'ai activé le serveur SSH sur mon Mac, afin de pouvoir me connecter à distance. Lorsque je me connectais à distance sur mon Mac, la phrase clé était toujours demandée quand je voulais SSH encore un autre hôte.

J'ai trouvé une solution qui permet de stocker la phrase clé pour la session en cours. J'ai pensé que cela pourrait être utile à quelqu'un, d'où ce post / réponse.

Benoit Duffez
la source
J'ai noté ma solution similaire ici superuser.com/a/659668/154113
orkoden
0

J'ai été perplexe sur ce problème. ssh fonctionne sur toutes les machines de notre département SAUF pour les pommes (MacBooks ou iMacs n'a pas d'importance). Je me suis finalement lassé de taper les mots de passe et j'ai décidé de déboguer cela.

Je suis allé sur mon iMac et j'ai désactivé sshd dans le panneau des préférences de partage. J'ai ensuite poursuivi en root et tapé "/ usr / sbin / sshd -d" pour lancer sshd en mode débogage. J'ai ensuite essayé de ssh sur cette machine et il a rapidement essayé d'utiliser le protocole 2, que tout semble utiliser très bien, mais sshd a rapidement signalé qu'il ne pouvait pas trouver "authorized_keys". J'avais un fichier authorized_keys2 que toutes mes boîtes unix linux, solaris, you-name-it acceptent très bien. J'ai simplement copié authorized_keys2 vers authorized_keys et BOOM. Fonctionne parfaitement maintenant.

Pourquoi * touches plutôt que * touches2 est inconnue. Surtout quand os x est assez satisfait de known_hosts2.

Dans tous les cas, maintenant toutes nos boîtes Apple peuvent être connectées à, ou avoir des commandes à distance exécutées sur elles sans ce mot de passe falsifié: invite ...

Bob Hyatt
la source