Comment obtenir une seule et unique phrase de passe pour la clé SSH en cas de besoin?

15

(J'ai lu de nombreuses questions sur ce site qui semblent liées et je pense que c'est une question vraiment nouvelle.)

J'ai beaucoup de clés sur beaucoup de serveurs et elles sont toutes protégées par des mots de passe.

J'aime saisir des mots de passe autant que j'aime saisir des mots de passe - c'est un véritable fardeau de productivité.

  • Les commandes ssh-agent + ssh-add peuvent être utilisées sur un shell de connexion pour signifier que vous n'avez à saisir votre mot de passe qu'une seule fois lors de la connexion

  • le trousseau peut être utilisé pour maintenir un agent ssh en vie au-delà de la déconnexion.

Le problème que j'ai, c'est que ces deux solutions sont généralement lancées dans une connexion shell (par exemple .zshrc), si je saisis ma phrase secrète lorsque je me connecte, même si je n'ai pas besoin qu'elle soit déverrouillée. (Je ne suis pas content que le trousseau garde un agent en vie indéfiniment.)

Ce que j'aimerais, c'est qu'on ne me demande une phrase secrète (pour un agent) qu'en cas de besoin .

Je peux donc me connecter au serveur A, faire quelques trucs, puis ssh au serveur B et à ce moment-là me demander la phrase secrète. Faites des choses sur le serveur B, déconnectez-vous. De retour sur A, refaites quelques trucs, ssh vers B à nouveau et pas besoin de ma phrase secrète (elle est détenue par un agent).

Je note que cela est possible sur des bureaux graphiques comme Gnome - vous obtenez une fenêtre contextuelle demandant la phrase secrète pour déverrouiller votre clé privée dès que vous essayez de ssh. C'est donc ce que je recherche mais à partir d'une console.

artfulrobot
la source
Pourquoi ne pas simplement générer des clés ssh sans mots de passe? Si vous allez passer par tous ces problèmes de toute façon?
devnull
1
Si quelqu'un entre et qu'il y a des clés sans mot de passe (ou un agent ssh actif), il peut également avoir accès à de nombreux autres serveurs. Des clés sans mot de passe peuvent également être volées et utilisées ailleurs.
artfulrobot
Pour autant que je sache, il n'y a aucun moyen de faire ce que vous voulez sans sacrifier un certain niveau de sécurité, ce qui semble ne pas être le cas. Il y avait ici une réponse approfondie de Thomas Nyman qui va dans de nombreuses possibilités si vous ne l'avez pas déjà lue: unix.stackexchange.com/a/90869/82289 . Je contourne cela dans mon entreprise par l'utilisation d'un serveur intermédiaire qui gère les sessions ssh avec Tmux.
devnull
@DevNull semble bizarre que vous puissiez le faire avec un bureau mais pas avec un terminal, non? Certes, il a juste besoin que l'agent passe au tty si aucune clé n'a été ajoutée? Ce doit être la façon dont les gui fonctionnent?
artfulrobot du
Vous pouvez consulter ma réponse ici: unix.stackexchange.com/a/184160/89706 ( Lien de la question: unix.stackexchange.com/questions/90853/… )
Johnny Wong

Réponses:

16

N'ajoutez rien à aucun de vos scripts de démarrage du shell, c'est du piratage inutile.

Au lieu de cela, ajoutez

AddKeysToAgent yes

à votre .ssh / config

Comme cela, ssh-add est exécuté automatiquement la première fois que vous utilisez ssh dans une autre boîte. Il vous suffit de ressaisir votre clé lorsqu'elle expire de ssh-agent ou après le redémarrage.

Toby
la source
J'aimerais que les gens commentent lors du vote négatif. Si ce n'est pas bien, c'est important, nous savons pourquoi ce n'est pas bien. Merci d'avoir posté, je n'ai pas eu le temps d'essayer moi-même votre suggestion.
artfulrobot
Je me demandais aussi, peut-être à cause de mes cross-posts?
Toby
Cela fonctionne pour moi. Cependant, c'est un ajout très récent à openssh (7.2). Au cas où cela aiderait quelqu'un, openssh 7.3 est disponible dans Debian Sid.
artfulrobot
@artfulrobot: Étrange, car j'ai eu ce même comportement (auto-ssh-add au premier appel de ssh) pendant des années, jusqu'à ce qu'il s'arrête finalement il y a quelque temps. À la recherche de la cause, j'ai trouvé AddKeysToAgent et j'ai supposé que la raison de son arrêt était que par accident j'ai dû nettoyer mon .ssh / config et AddKeysToAgent avec lui. Maintenant, je me demande pourquoi cela fonctionnait bien avant la sortie d'OpenSSH 7.2? Je n'imagine pas cela :-)
Toby
@Toby c'est exactement ce dont j'ai besoin. Malheureusement, ssh-agent ne semble pas démarrer automatiquement dans kubuntu, c'est donc la prochaine chose que je dois résoudre.
Ogaday
7

Zsh a un preexechook qui exécute une fonction avant qu'une commande entrée sur la ligne de commande soit exécutée. Voici un crochet qui recherche sshdans votre ligne de commande et s'il est trouvé, vérifie l'existence d'un agent ssh. Si ce n'est pas trouvé, il exécute le trousseau.

Ainsi, le trousseau est uniquement exécuté avant les commandes ssh, puis uniquement si nécessaire.

Mettez ceci dans votre ~/.zshrc:

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

Ce qui se passe ici est à chaque fois qu'une commande est tapée, check_sshest appelée avant l'exécution de la commande.

La première ligne de la fonction vérifie la commande développée pour l' sshutilisation d'une expression régulière Zsh. sshdoit avoir des limites de mots de \bchaque côté. Si cela n'est pas trouvé, la fonction retourne.

La ligne suivante vérifie qu'il existe un processus d'agent SSH dans la variable d'environnement et que ce processus existe toujours dans la table de processus, puis qu'au moins une clé a été ajoutée à l'agent. Si tout cela est OK, alors l'agent ssh est configuré et nous n'avons rien à faire, donc il revient.

Enfin, nous commençons le trousseau, avec l'agent à garder en vie pendant une heure.

Cela laisse toujours le problème des choses ssh intégrées, comme gitou rsyncou scpqui ne déclenchera pas la fonction (vous pouvez les ajouter au regex).

artfulrobot
la source
Même sans zsh, on pourrait créer un court script avec le même effet et le placer PATHdevant le sshclient réel . Pourrait même fonctionner avec rsyncet al, s'ils lisent PATHau lieu de s'exécuter /usr/bin/sshdirectement.
ilkkachu
2

Pour zsh, j'ai écrit un ensemble d'utilitaires et de wrappers pour faire plus ou moins ce que vous voulez: https://www.vinc17.net/unix/index.fr.html#zsh-ssh-utils

En fait, cela fait encore plus, car le ssh-agentsera partagé par toutes les sessions de connexion (bureau ou via SSH, et l'écran GNU est également pris en charge si vous démarrez des shells de connexion à partir de celui-ci, par exemple avec shell -zshdans le ~/.screenrcfichier), et il ne se fermera qu'après la la dernière session se termine.

Remarque: j'utilise une seule phrase de passe pour toutes mes clés. Je ne suis pas sûr du comportement des différentes phrases secrètes; il peut avoir besoin de quelques changements.

vinc17
la source
Wow, c'est beaucoup de code. Beau travail et merci pour le partage. Je pense que j'ai besoin de quelque chose de plus simple - SSH est un joli outil de base pour moi.
artfulrobot