¿Se puede usar socat para reenviar un socket de agente ssh a un chroot?

¿Se puede usar socat para reenviar un socket de agente ssh a un chroot?

Estoy creando entornos Debian personalizados en un servidor remoto, al que me conecto a través de SSH. Esto implica crear un entorno de arranque y luego realizar un chroot en él para ejecutar un instalador personalizado. Como parte del proceso de instalación personalizada, necesito que el instalador pueda salir del entorno chroot a otro servidor remoto, reutilizando las credenciales SSH de mi agente ssh.afuerael chroot lo sabe.

Simplemente no puedo pensar cómo hacer esto. En principio, yopensarDebería poder usar socat para reenviar $SSH_AUTH_SOCK al entorno chroot antes de llamar a chroot de esta manera:

socat UNIX-CONNECT:$SSH_AUTH_SOCK UNIX-LISTEN:chroot_root$SSH_AUTH_SOCK,fork &
sudo -E chroot chroot_root /bin/bash

Pero eso me da una tubería rota de socat tan pronto como intento usar ssh dentro del chroot, lo cual supongo que es comprensible (en cierto modo).

¿Hay alguna manera de evitar esto? Tengo la opción alternativa de configurar un socket maestro SSH antes de realizar el chroot y usarlo para todo lo que esté dentro del chroot, pero eso implicaría una reescritura bastante intrusiva del instalador, así que estoyen realidadNo estoy interesado en ese plan.

ACTUALIZAR

Resulta que puedo obtener el efecto que quiero simplemente creando un enlace físico al socket. Sinceramente, no esperaba que eso funcionara.

Respuesta1

Puede reenviar el Agente SSH a un chroot, pero debe superar algunos pasos, el primero de los cuales es hacer que el socket sea accesible en el chroot y el segundo es informar a los usuarios dentro del chroot al respecto.

Para que el socket esté disponible, la sugerencia de uso del OP socatfunciona siempre que los permisos estén configurados correctamente. Suponiendo que está utilizando una secuencia de comandos para iniciar el chroot, el siguiente fragmento se utiliza socatpara proporcionar el socket del agente en el chroot:

# Set up a SSH AGENT forward socket
if [ -n "$SSH_AUTH_SOCK" ]
then
  _dir="$mnt$(dirname $SSH_AUTH_SOCK)"
  _owner=$(awk -F':' '{if ($1=="alice") {print $3":"$4}}' $mnt/etc/passwd)
  mkdir "$_dir"
  chown "$_owner" "$_dir"
  socat UNIX-CONNECT:$SSH_AUTH_SOCK \
        UNIX-LISTEN:$mnt$SSH_AUTH_SOCK,fork,user=${_owner%:*} &
  socat_pid=$!
  export SSH_AUTH_SOCK
fi

Establece el uidy giddel usuario (Aliciaen el ejemplo) dentro del chroot que debería poder acceder al agente. Luego crea ese directorio y establece socatprácticamente de la misma manera que el OP. La adición es el user=${_owner%:*}precio que establece el uid en el socket dentro del chroot para queAliciapuede acceder a él.

Luego recuerda el socatPID para poder eliminarlo cuando salga el chroot. Finalmente exporta la SSH_AUTH_SOCKvariable para que esté disponible dentro del chroot.


Ahora, chrootsolo se puede hacer rootasí, supongo que el script se ejecuta sudodesde un usuario normal que es propietario del proceso del agente. Si esto es exacto, entonces hay una cosa más por hacer, que es permitir sudopasar la variable de entorno al script. Para hacer esto, edite /etc sudoers(el mecanismo aprobado es así sudo visudo) y agregue lo siguiente:

Defaults env_keep+=SSH_AUTH_SOCK

Este cambio también debe realizarse /etc/sudoersdentro del chroot si sudose utilizará dentro del chroot (es decir, para cambiar de roota alice).

A continuación se muestra un ejemplo de un socket de agente dentro de un chroot visto por un usuario normal.

$ ls -l $SSH_AUTH_SOCK
srwxr-xr-x 1 alice root 0 Feb  1 15:06 /tmp/ssh-q1ntaubl6I2z/agent.1443

información relacionada