Pourquoi ne pas simplement utiliser% h dans l'option ControlPath d'OpenSSH ssh?

13

Pourquoi les pages de manuel "ssh_config (5)" recommandent-elles que l' ControlPathoption contienne au moins les espaces réservés et %h, afin d' identifier de manière unique chaque connexion partagée?%p%r

Je pensais que plusieurs sessions devraient partager la même socket avec une connexion au même hôte. Ne serait-il pas logique alors d'avoir une définition simple telle que:

ControlPath ~/.cache/ssh/mux/%h

Au lieu de quelque chose comme:

ControlPath ~/.cache/ssh/mux/%r@%h:%p

Dans ma compréhension de la première définition, une connexion est partagée entre plusieurs sessions avec différents utilisateurs distants, vers le même hôte distant, sur différents ports distants.

Je veux avoir la première définition dans la section par défaut de l'hôte pour qu'il suffise de dire ssh -o ControlMaster=no.

Je souhaite partager la connexion au même hôte distant entre toutes les sessions lancées par le même utilisateur local, quels que soient l'utilisateur distant et le port distant. Le socket du client maître doit vivre sous le répertoire personnel de l'utilisateur local.

Tim Friske
la source
"Je souhaite partager la connexion au même hôte distant entre toutes les sessions lancées par le même utilisateur local, quels que soient l'utilisateur distant et le port distant." Réponse courte: vous ne pouvez pas . J'ai ajouté une sorte d'explication dans ma réponse.
goldilocks

Réponses:

13

"Je pensais que plusieurs sessions devraient partager la même socket avec une connexion au même hôte."

Ils peuvent. Cependant, notez que si vous vous connectez à un hôte à l'aide d'une connexion existante via ControlPath, quel que soit l'utilisateur auquel vous souhaitez vous connecter, vous serez connecté en tant qu'utilisateur d'origine de la connexion. Par exemple, sans connexion établie avec "quelque part":

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=yes bob@somewhere

Cette session est bob @ quelque part.

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=no sue@somewhere

Cette session sera également bob @ quelque part, car vous avez utilisé le même ControlPath et set ControlMaster=no; si ControlMaster=yes, vous seriez connecté en tant que sue, mais ssh aura ignoré votre argument ControlPath, comme impliqué dans man ssh_config:

Des sessions supplémentaires peuvent se connecter à ce socket à l'aide du même ControlPath avec ControlMaster défini sur «non» .

Pour preuve, si ControlMaster=yesdans les deux cas, lorsque Bob quitte la socket ControlPath ~/.ssh/somewheredisparaîtra même si la session "sue" est toujours en cours d'exécution, ce qui signifie que la session sue n'a jamais utilisé cette socket .

Donc, si vous souhaitez utiliser la même connexion, %hc'est très bien, mais attention, vous ne pouvez pas partager une connexion avec plusieurs utilisateurs distants différents - ssh ne vous le permettra pas.

boucle d'or
la source
Merci beaucoup. Avant votre réponse élaborée, j'ai manqué le fait qu'il n'est pas possible de partager le socket maître d'un client entre différents utilisateurs distants sans que le deuxième utilisateur distant assume en même temps l'identité du premier.
Tim Friske
5

Vous pouvez avoir plusieurs utilisateurs et plusieurs ports utilisés, même pour le même serveur. Moi-même, je me connecte à des centaines de systèmes sur les intranets de l'entreprise, la plupart ont plusieurs utilisateurs avec différentes fonctions ou serveurs d'applications. L'accès à userA est très différent de l'accès à userB, et la connexion principale devrait être différente. Plus succinctement, si vous deviez courir:

$ ssh -n -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userA localhost sleep 10 & # create the master connection and background it
$ ssh -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userB localhost whoami
userA

Comme vous pouvez le voir, nous n'obtenons pas de session OpenSSH avec userB, mais l'original avec userA. Cela signifie que le répertoire personnel, les autorisations et même l'authentification elle-même ne sont pas ceux attendus. En utilisant cela, si vous essayez de supprimer un fichier dans le répertoire de l'utilisateur B, alors a) il peut s'agir du mauvais fichier et b) il peut s'agir de mauvaises autorisations.

Si vous ne vous connecterez jamais à plus d'un utilisateur sur un seul serveur à l'aide d'un seul port, alors oui, l'utilisation %hpourrait être suffisante. Dans votre ~/.ssh/configfichier, vous souhaitez utiliser:

ControlMaster=auto  # use existing or create a master connection
ControlPath=~/.cache/ssh/mux/%h
ControlPersist=yes

Avec l' ControlPersistoption, la connexion principale reste ouverte en arrière-plan jusqu'à ce qu'elle soit interrompue ou terminée avec ssh -O exit. Il s'agit d'une fonctionnalité intéressante de définition et d'oubli.

Mais s'il existe une possibilité de se connecter à plusieurs utilisateurs sur un même hôte, vous voudriez quelque chose de plus sécurisé:

ControlMaster=auto
ControlPath=~/.cache/ssh/mux/%r@%h:%p
ControlPersist=yes
Arcege
la source
Je suis encore confus. J'ai essayé de clarifier le scénario de configuration et mon intention dans les paragraphes "Je veux". Quelqu'un parmi vous pourrait-il répondre plus précisément à ma question avec ces informations supplémentaires?
Tim Friske