
Si tengo un servidor A en el que puedo iniciar sesión con mi clave ssh y tengo la capacidad de "sudo su - otheruser", pierdo el reenvío de claves porque las variables env se eliminanyel socket solo es legible por mi usuario original. ¿Hay alguna manera de puentear el reenvío de claves a través de "sudo su - otheruser", para poder hacer cosas en un servidor B con mi clave reenviada (git clone y rsync en mi caso)?
La única forma que se me ocurre es agregar mi clave a las claves_autorizadas de otro usuario y "ssh otrousuario@localhost", pero eso es complicado de hacer para cada combinación de usuario y servidor que pueda tener.
En breve:
$ sudo -HE ssh user@host
(success)
$ sudo -HE -u otheruser ssh user@host
Permission denied (publickey).
Respuesta1
Como mencionó, las variables de entorno se eliminan sudo
por razones de seguridad.
Pero, afortunadamente, sudo
es bastante configurable: puedes indicarle con precisión qué variables de entorno deseas conservar gracias a la env_keep
opción de configuración en /etc/sudoers
.
Para el reenvío de agentes, debe mantener la SSH_AUTH_SOCK
variable de entorno. Para hacerlo, simplemente edite su /etc/sudoers
archivo de configuración (siempre usando visudo
) y configure la env_keep
opción para los usuarios apropiados. Si desea que esta opción esté configurada para todos los usuarios, use una Defaults
línea como esta:
Defaults env_keep+=SSH_AUTH_SOCK
man sudoers
para más detalles.
Ahora debería poder hacer algo como esto (siempre que user1
la clave pública de esté presente en ~/.ssh/authorized_keys
y user1@serverA
y user2@serverB
el serverA
archivo /etc/sudoers
esté configurado como se indicó anteriormente):
user1@mymachine> eval `ssh-agent` # starts ssh-agent
user1@mymachine> ssh-add # add user1's key to agent (requires pwd)
user1@mymachine> ssh -A serverA # no pwd required + agent forwarding activated
user1@serverA> sudo su - user2 # sudo keeps agent forwarding active :-)
user2@serverA> ssh serverB # goto user2@serverB w/o typing pwd again...
user2@serverB> # ...because forwarding still works
Respuesta2
sudo -E -s
- -E preservará el medio ambiente
- -s ejecuta un comando, por defecto es un shell
Esto le dará un shell raíz con las claves originales aún cargadas.
Respuesta3
Permitirotro usuariopara acceder $SSH_AUTH_SOCK
al archivo y su directorio, por ejemplo mediante la ACL correcta, antes de cambiar a ellos.
El ejemplo asume Defaults:user env_keep += SSH_AUTH_SOCK
en /etc/sudoers
la máquina 'host':
$ ssh -A user@host
user@host$ setfacl -m otheruser:x $(dirname "$SSH_AUTH_SOCK")
user@host$ setfacl -m otheruser:rwx "$SSH_AUTH_SOCK"
user@host$ sudo su - otheruser
otheruser@host$ ssh server
otheruser@server$
Más seguro y también funciona para usuarios no root
Respuesta4
Siempre puedes simplemente enviar ssh a localhost con reenvío de agente en lugar de usar sudo:
ssh -A otheruser@localhost
La desventaja es que necesita iniciar sesión nuevamente, pero si lo está usando en una pestaña de pantalla/tmux, eso es solo un esfuerzo de una vez; sin embargo, si se desconecta del servidor, el socket (por supuesto) se romperá nuevamente. . Por lo tanto, no es ideal si no puede mantener abierta su sesión de pantalla/tmux en todo momento (sin embargo, puede actualizar manualmente su SSH_AUTH_SOCK
var env si está bien).
También tenga en cuenta que cuando usa el reenvío ssh, root siempre puede acceder a su socket y usar su autenticación ssh (siempre que haya iniciado sesión con el reenvío ssh). Así que asegúrese de poder confiar en root.