
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 socat
funciona 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 socat
para 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 uid
y gid
del usuario (Aliciaen el ejemplo) dentro del chroot que debería poder acceder al agente. Luego crea ese directorio y establece socat
prá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 socat
PID para poder eliminarlo cuando salga el chroot. Finalmente exporta la SSH_AUTH_SOCK
variable para que esté disponible dentro del chroot.
Ahora, chroot
solo se puede hacer root
así, supongo que el script se ejecuta sudo
desde 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 sudo
pasar 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/sudoers
dentro del chroot si sudo
se utilizará dentro del chroot (es decir, para cambiar de root
a 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