Comment utiliser le trousseau Mac OS X avec des clés SSH?

141

Je comprends que depuis Mac OS X Leopard, le trousseau prend en charge le stockage des clés SSH. Quelqu'un pourrait-il s'il vous plaît expliquer comment cette fonctionnalité est censée fonctionner.

J'ai généré des clés RSA stockées dans mon répertoire ~ / .ssh pour accéder à différents serveurs. Je n'ai pas de phrases secrètes définies sur ces clés. Actuellement, pour me connecter à ces serveurs, j'utilise les commandes suivantes dans le terminal:

eval `ssh-agent`
ssh-add ~ / .ssh / some_key_rsa
ssh utilisateur @ serveur

(J'ai écrit quelques fonctions Bash pour rendre cela plus facile.)

Y at-il une meilleure façon de faire cela en utilisant le trousseau?

John Topley
la source

Réponses:

16

Pour que cela fonctionne, $SSH_AUTH_SOCKil faut indiquer la variable d'environnement /tmp/launch-xxxxxx/Listeners. Cela est supposé se faire automatiquement lorsque vous vous connectez. L'écouteur de ce socket parle du protocole ssh-agent.

Vos scripts bash démarrent votre propre agent ssh (orthographié ssh-agent, pas ssh_agent) et écrasent l'existant ssh-agentconfiguré pour vous lors de la connexion.

En outre, l’intérêt principal du trousseau est de stocker les mots de passe sur vos clés ssh, mais vous dites que vous n’avez pas de phrase secrète définie sur ces clés, je ne suis donc pas sûr de ce que vous attendez de l’intégration du trousseau.

Enfin, lors de votre première connexion, vous ne verrez probablement pas de processus ssh-agent. Ce processus sera lancé automatiquement par les services de lancement la première fois que quelque chose tente de lire ce socket /tmp.

Rudedog
la source
1
Merci. Il me faudra donc encore courir ssh-addpour ajouter mes identités RSA à l'agent ssh par défaut démarré à la connexion?
John Topley
Vous n'êtes pas obligé de lancer ssh-add; ssh-agent vous demandera la phrase secrète de la clé la première fois que vous exécuterez ssh.
Rudedog
3
Cela me demande le mot de passe chaque fois que je lance ssh. Le fait est que je ne veux pas avoir à entrer de mot de passe.
John Topley
1
Qu'est-ce qui vous demande le mot de passe? Je commence à soupçonner que c'est le serveur distant qui vous y invite, ce qui permet d'affirmer que vos clés n'ont pas de phrase secrète dans une meilleure perspective. Si vous souhaitez ignorer le mot de passe sur le serveur distant, vous devez ajouter votre clé publique $HOME/.ssh/authorized_keyssur ce serveur. Le trousseau ssh-agent + de Mac OS n’est utilisé que pour stocker la phrase secrète de vos clés ssh locales; il n'est pas destiné à envoyer des mots de passe distants via des connexions ssh existantes.
Rudedog
1
utiliser ssh -vpour diagnostiquer ce que ssh fait. utilisez également sshd -p 8900 -vcôté serveur et ssh -v remote:8900pour diagnostiquer ce que fait sshd.
Rudedog
252

Depuis la version OS X de Leopard, ssh-agent est plus étroitement intégré à Keychain. Il est possible de stocker les phrases secrètes de toutes vos clés SSH en toute sécurité dans Keychain, à partir duquel ssh-agent les lira au démarrage. L'essentiel, c'est qu'il est simple de sécuriser vos clés avec des phrases secrètes, mais vous n'avez jamais à taper la phrase secrète pour les utiliser! Voici comment:

Ajoutez la phrase de passe à chaque clé ssh du trousseau: (l'option -k charge uniquement les clés privées, ignore les certificats)

ssh-add -K [path/to/private SSH key]

(notez que c'est un K majuscule)

Chaque fois que vous redémarrez votre Mac, toutes les clés SSH de votre trousseau seront automatiquement chargées. Vous devriez pouvoir voir les clés dans l'application Keychain Access, ainsi que depuis la ligne de commande via:

ssh-add -l
jeffmcc
la source
ssh-add -lne liste aucune clé lors d'une connexion à distance (où $ DISPLAY n'est pas défini). Des astuces spéciales doivent être utilisées ici pour utiliser le trousseau (par exemple, dans superuser.com/questions/141044/… )
Ether
2
developer.apple.com/library/mac/documentation/Darwin/Reference/… Vous avez également besoin de l'option -K pour stocker les phrases secrètes dans le trousseau.
Neeme Praks
5
Si vous avez installé une autre version de SSH via un système de package tel que Homebrew, il est nécessaire d'utiliser un chemin absolu tel que /usr/bin/ssh-add.
Ludovic Kuty
1
Fait intéressant dans mon macOS Sierra, il ne demande pas le mot de passe après un redémarrage, mais ssh-add -lrenvoie "L'agent n'a aucune identité." ( ps auxinclus /usr/bin/ssh-agent -l).
Halil Özgür
4
Pour macOS Sierra, les choses ont changé. Voir github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain
schieferstapel
80

À partir de macOS Sierra , ssh-agent ne charge plus automatiquement les clés ssh précédemment chargées lorsque vous vous connectez à votre compte. C’est intentionnel de la part d’Apple, ils voulaient se ré-aligner sur la mise en œuvre traditionnelle d’ OpenSSH . [1]


Comme expliqué ici , voici la méthode recommandée depuis macOS 10.12.2 :

  1. Ajoutez les lignes suivantes à votre ~/.ssh/configfichier:

    Host *
        UseKeychain yes
        AddKeysToAgent yes
    
  2. Toute clé que vous ajoutez à ssh-agent à l'aide de la ssh-add /path/to/your/private/key/id_rsacommande sera automatiquement ajoutée au trousseau et devrait être chargée automatiquement au redémarrage.


Ce qui suit est obsolète (conservé pour référence).

Pour revenir au comportement précédent, vous souhaitez exécuter la ssh-add -Acommande (qui charge automatiquement toutes les clés ssh comportant des phrases de passe sur votre trousseau) lorsque vous vous connectez. Pour cela, procédez comme suit:

  1. Tout d’abord, ajoutez toutes les clés que vous souhaitez charger automatiquement dans ssh-agent à l’aide de la ssh-add -K /absolute/path/to/your/private/key/id_rsacommande. L' -Kargument garantit que la phrase clé est ajoutée au trousseau de macOS . Assurez-vous d'utiliser le chemin absolu vers la clé. Si vous utilisez un chemin relatif, le script lancé automatiquement ne trouvera pas votre clé.

  2. Assurez-vous que toutes vos clés sont affichées comme ajoutées lorsque vous tapez ssh-add -A.

  3. Créez un fichier com.yourusername.ssh-add.plistdans ~/Library/LaunchAgents/le contenu ci - dessous. Les fichiers Plist tels que celui-ci sont utilisés launchdpour exécuter des scripts lorsque vous vous connectez. [2] [3]

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    <key>Label</key>
      <string>com.user.loginscript</string>
    <key>ProgramArguments</key>
      <array>
        <string>ssh-add</string>
        <string>-A</string>
      </array>
    <key>RunAtLoad</key>
      <true/>
    </dict>
    </plist>
    
  4. Dites launchdà charger le fichier plist que vous venez de créer en exécutant: launchctl load ~/Library/LaunchAgents/com.yourusername.ssh-add.plist.

Et vous devriez être tous ensemble.

Ricardo Sanchez-Saez
la source
33

La réponse de Ricardo offre un moyen plus simple de conserver votre mot de passe entre les sessions / redémarrages de votre Mac exécutant 10.12 Sierra.

  1. ssh-add -K ~/.ssh/id_rsa
    Remarque: modifiez le chemin d'accès à l'emplacement de votre clé id_rsa.
  2. ssh-add -A
  3. Créez (ou éditez s'il existe) le ~/.ssh/configfichier suivant :

    Host *
      UseKeychain yes
      AddKeysToAgent yes
      IdentityFile ~/.ssh/id_rsa
    

    Maintenant, le mot de passe est mémorisé entre les redémarrages!

Apple a délibérément modifié le comportement de ssh-agent dans macOS 10.12 Sierra pour ne plus charger automatiquement les clés SSH précédentes, comme indiqué dans cette discussion OpenRadar , Twitter et technique de Apple . La solution ci-dessus imitera l'ancien comportement d'El Capitan et retiendra votre mot de passe.

ChrisJF
la source
2
Génial, fonctionne comme un charme, à mon avis beaucoup plus propre que les autres et résolu au bon endroit :)
GerardJP
10

Remarque: pour macOS Sierra, veuillez vous reporter à la réponse plus récente de ChrisJF .

La [réponse de Jeff McCarrell] [2] est correcte, sauf que la commande pour ajouter la phrase secrète contient un tiret en à la place d'un trait d'union, c'est-à-dire –Kau lieu de -K, générant un message à l'effet de –K: No such file or directory. Il devrait lire:

ssh-add -K [path/to/private SSH key]
simonair
la source
2
Cela devrait être un commentaire sur la réponse à laquelle vous faites référence plutôt qu'une réponse nouvelle. Nous parlons de sécurité ici. On pourrait suggérer que vous devriez taper soigneusement le ssh-add -K
texte
1
En utilisant un trait d'union avec K, je reçois illegal option -- K. K minuscule est répertorié comme une option.
Sam Dutton
Merci pour les commentaires. Je viens de vérifier sur macOS Sierra -K
:,
6

Je soupçonne que vous n'utilisez pas la sshcommande par défaut . Avez-vous sshinstallé via des ports? Essayez which sshde voir quelle sshcommande vous utilisez.

Habituellement, il devrait afficher une boîte de dialogue vous demandant votre mot de passe, s'il n'est pas déjà stocké dans votre trousseau.

Olly
la source
Je n'utilise pas de ports.
John Topley
Merci pour l'info :) J'ai eu des problèmes parce que j'utilisais OpenSSH de Homebrew.
ggustafsson
6

J'ai eu un problème similaire lors de la connexion à l'aide d'un cert ssh client. Dans ce cas spécifique, c'était pour accéder à un dépôt git. C'était la situation:

  • La clé a été enregistrée dans ~/.ssh/
  • La clé privée a un mot de passe.
  • La phrase secrète est stockée dans le trousseau de connexion OS X. ~/Library/Keychains/login.keychain
  • La connexion était la suivante: mon serveur Mac ->distant mac ->git / ssh
  • Mac OS X 10.8.5

Lorsque je me suis connecté à un Mac distant en utilisant le Bureau à distance, je n’ai eu aucun problème. Cependant, lors de la connexion avec SSH au Mac distant, le mot de passe ssh m'a été demandé à chaque fois. Les étapes suivantes l'ont résolu pour moi.

  1. security unlock-keychainLa phrase secrète est stockée dans le trousseau de connexion. Cela le déverrouille et permet à ssh-agent d'y accéder.
  2. eval `ssh-agent -s`Démarre ssh-agent pour l'utilisation du shell. Il obtiendra la phrase secrète du trousseau et l'utilisera pour déverrouiller la clé privée ssh.
  3. Établissez la connexion ssh / git et faites mon travail.
  4. eval `ssh-agent -k` Tuez le ssh-agent en cours d'exécution.
  5. security lock-keychain Verrouillez à nouveau le trousseau.
Orkoden
la source
1
Pour que le n ° 2 fonctionne pour moi au sein d'un alias, je devais utiliser eval \$(ssh-agent)chaque connexion et trousseau Re: remote . Lorsqu'il n'est pas dans un alias, cela eval $(ssh-agent)fonctionne ( sans la barre oblique inverse $ ).
Travis
4

Voir également:

security import priv_key.p12 -k ~/Library/Keychains/login.keychain
security import pub_key.pem -k ~/Library/Keychains/login.keychain

... en ajoutant cette note sous forme de détails supplémentaires: la commande "sécurité" permet d'importer des clés (et d'autres éléments) directement dans des trousseaux. La bonne chose est que contrairement à ssh-add, vous êtes en mesure de spécifier le trousseau. Cela permet d’importer directement dans le système Keychain ("sécurité homme" pour savoir comment)

xaphod
la source
1
Pourriez-vous donner un peu plus de détails à cette réponse s'il vous plaît? Merci.
Matthew Williams
1

La meilleure solution envisagée par Apple (depuis macOS 10.12.2) est décrite ici.

Il suffit donc de faire ce qui suit:

echo "UseKeychain yes" >> ~ / .ssh / config

Ben
la source
1
L'utilisation >>est à risque si vous entrez la commande plusieurs fois. Mieux vaut faire une édition manuelle du fichier, comme décrit par la réponse de ChrisJF .
Cœur
Oui vous juste là
Ben