¿Por qué no simplemente usar% h en la opción ControlPath de OpenSSH ssh?

13

¿Por qué la "ssh_config (5)" páginas de manual recomiendan que la ControlPathopción debe contener al menos el %h, %py %rmarcadores de posición con el fin de identificarlo de forma inequívoca cada conexión compartida?

Pensé que varias sesiones deberían compartir el mismo socket con una conexión al mismo host. ¿No tendría sentido tener una definición simple como:

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

En lugar de algo como:

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

Según tengo entendido con la primera definición, se comparte una conexión entre varias sesiones con diferentes usuarios remotos, al mismo host remoto, en diferentes puertos remotos.

Quiero tener la primera definición en la sección predeterminada del host para que sea suficiente decirlo ssh -o ControlMaster=no.

Quiero compartir la conexión con el mismo host remoto entre todas las sesiones iniciadas por el mismo usuario local, independientemente del usuario remoto y el puerto remoto. El socket del cliente maestro debe vivir debajo del directorio de inicio del usuario local.

Tim Friske
fuente
"Quiero compartir la conexión con el mismo host remoto entre todas las sesiones iniciadas por el mismo usuario local, independientemente del usuario remoto y el puerto remoto". Respuesta corta: no puedes . He agregado una especie de explicación en mi respuesta.
Ricitos de oro

Respuestas:

13

"Pensé que varias sesiones deberían compartir el mismo socket con una conexión al mismo host".

Ellos pueden. Sin embargo, tenga en cuenta que si se conecta a un host mediante una conexión existente ControlPath, independientemente del usuario con el que desee iniciar sesión, iniciará sesión como el usuario original de la conexión. Por ejemplo, sin conexión establecida a "algún lugar":

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

Esta sesión es bob @ en alguna parte.

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

Esta sesión también será bob @ en alguna parte, porque usó el mismo ControlPath y set ControlMaster=no; si ControlMaster=yes, iniciarás sesión como demanda, pero ssh habrá ignorado tu argumento ControlPath, como se indica en man ssh_config:

Se pueden conectar sesiones adicionales a este socket usando el mismo ControlPath con ControlMaster configurado en 'no' .

Como evidencia de esto, si ControlMaster=yesen ambos casos, cuando Bob salga, el socket ControlPath ~/.ssh/somewheredesaparecerá a pesar de que la sesión "demandar" todavía se está ejecutando, lo que significa que la sesión demandada nunca usó ese socket .

Por lo tanto, si desea utilizar la misma conexión, %hestá bien, pero tenga en cuenta que no puede compartir una conexión ya que varios usuarios remotos diferentes : ssh no se lo permitirá.

encerrada dorada
fuente
Muchas gracias. Antes de su respuesta elaborada, me perdí el hecho de que no es posible compartir el socket maestro de un cliente entre diferentes usuarios remotos sin que al mismo tiempo el segundo usuario remoto asuma la identidad del primero.
Tim Friske
5

Podría tener múltiples usuarios y múltiples puertos en uso incluso para el mismo servidor. Yo mismo, me conecto a cientos de sistemas en las intranets de la compañía, la mayoría tiene múltiples usuarios con diferentes funciones o servidores de aplicaciones. El acceso al usuario A es muy diferente al acceso al usuario B, y la conexión maestra debería ser diferente. Más sucintamente, si fuera a correr:

$ 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

Como puede ver, no obtenemos una sesión OpenSSH con el usuario B, sino la original con el usuario A. Eso significa que el directorio de inicio, los permisos e incluso la autenticación en sí no es lo que se espera. Con esto, si intentara eliminar un archivo en el directorio del usuario B, entonces a) podría ser el archivo incorrecto yb) podría tener permisos incorrectos.

Si nunca se conectará a más de un usuario en un servidor usando un solo puerto, entonces sí, usar %hpodría ser suficiente. En su ~/.ssh/configarchivo, desearía usar:

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

Con la ControlPersistopción, la conexión maestra permanece abierta en segundo plano hasta que se cancela o finaliza con ssh -O exit. Esta es una buena característica para configurarlo y olvidarlo.

Pero si hay alguna posibilidad de conectarse a más de un usuario en cualquier anfitrión, entonces usted quiere algo más seguro:

ControlMaster=auto
ControlPath=~/.cache/ssh/mux/%r@%h:%p
ControlPersist=yes
Arcege
fuente
Todavía estoy confundido. Traté de aclarar el escenario de configuración y mi intención en los párrafos "Quiero". ¿Podría alguno de ustedes responder mi pregunta con mayor precisión con esta información adicional?
Tim Friske