Usando gpg-agent sobre ssh

8

Tengo un problema al usar el agente gpg sobre ssh a través de una sola línea de comando.

Aquí está mi configuración:

Servidor A: activa el comando a través de ssh.

ssh user@serverB "sudo -E /path/to/script.sh"

Servidor B: ejecutar el script que requiere una firma de frase de contraseña.

Información del sistema: Ubuntu 12.04

He configurado el gpg-agent en el servidor B, he agregado esta configuración a /home/user/.bashrc:

Invoke GnuPG-Agent the first time we login.                                                                          
# Does `~/.gpg-agent-info' exist and points to gpg-agent process accepting signals?                                    
if test -f $HOME/.gpg-agent-info && \
    kill -0 `cut -d: -f 2 $HOME/.gpg-agent-info` 2>/dev/null; then
    GPG_AGENT_INFO=`cat $HOME/.gpg-agent-info | cut -c 16-`
else
    # No, gpg-agent not available; start gpg-agent                                                                     
    eval `gpg-agent --daemon --write-env-file $HOME/.gpg-agent-info`
fi
export GPG_TTY=`tty`
export GPG_AGENT_INFO

Aquí está la configuración del agente en /home/user/.gnupg/gpg-agent.conf:

enable-ssh-support
#1 year cache support
default-cache-ttl 31536000
default-cache-ttl-ssh 31536000
max-cache-ttl 31536000
max-cache-ttl-ssh 31536000
#debug-all

Entonces, para que esto funcione, me conecto al servidor B a través de ssh:

ssh user@serverB

Se inicia el gpg-agent, disparo manualmente el script:

sudo -E /path/to/script.sh

Luego, el agente gpg me solicita que pida una frase de contraseña, una vez que la configuré, puedo ejecutar el script nuevamente, y está haciendo su tarea sin pedir una frase de contraseña.

Mi problema es cuando trato de activarlo a distancia, por ejemplo, a través de:

ssh user@serverB "sudo -E /path/to/script.sh"

Parece que el gpg-agent no funciona, porque el script sigue pidiéndome una frase de contraseña.

Editar:

He agregado el siguiente contenido a /etc/sudoers.d/user para activar el script a distancia sin la contraseña de sudo y mantener las variables de entorno:

user ALL=(ALL)NOPASSWD:SETENV:/path/to/script.sh

¿Algunas ideas?

Tony
fuente
Perdona la pregunta, pero ¿estás seguro de que está pidiendo una frase de contraseña? Con lo que ha mostrado anteriormente, esperaría que le pidiera una contraseña para autenticar el sudocomando.
MadHatter
He administrado el archivo sudoers con un NOPASSWD para el usuario / comando que intento ejecutar a distancia. Puede que necesite precisar esto también. Me está pidiendo una frase de contraseña.
Tony
OK, eso tiene sentido; gracias por aclarar, ¡solo quería asegurarme de que no nos mordiera lo obvio!
MadHatter

Respuestas:

1

Cuando inicie sesión y ssh user@serverBluego ejecute manualmente el script, le pedirá la frase de contraseña la primera vez, luego, cuando ejecute el script, shh-agent le proporcionará la frase de contraseña almacenada.

Sin embargo, cuando ejecuta ssh user@serverB "sudo -E /path/to/script.sh, está haciendo un nuevo inicio de sesión cada vez, y no creo que ssh-agent sea compatible con guardar la frase de contraseña en inicios de sesión SSH separados.

Keychain parece hacer lo que necesita: http://www.funtoo.org/Keychain

Con el llavero, solo necesita ingresar una frase de contraseña una vez cada vez que se reinicia su máquina local. Keychain también facilita que los trabajos cron remotos se "conecten" de forma segura a un proceso ssh-agent de larga ejecución, permitiendo que sus scripts aprovechen los inicios de sesión basados ​​en claves.

La versión actual de keychain admite gpg-agent y ssh-agent.

v25
fuente
En cuanto a las sshcadenas, estás equivocado. Hago esto muchas veces al día; sshdesde el host A al host B, luego a C y luego a D, con el agente ssh a la cabeza realizando operaciones clave todo el tiempo.
MadHatter
Tengo entendido que no está tratando de conectarse de A a B utilizando el agente. El servidor B está configurado como el cliente ssh-agent (para todos los efectos) y cuando se ejecuta sudo -E /path/to/script.shen el servidor B, algo aquí requiere la frase de contraseña. EDITAR: aunque, con su comentario en mente, puede tener más sentido para él configurar A como el cliente del agente, y usar el reenvío ssh-agent que le permitiría ejecutar el script en el servidor B sin que le pida una frase de contraseña .
v25
Ok, intentaré configurar el gpg-agent en el servidor A. ¿Tienes alguna información sobre el reenvío de ssh-agent? He visto esta publicación hasta ahora: superuser.com/questions/161973/…
Tony
Esto está bien documentado, aquí hay una guía: livecipher.blogspot.co.uk/2013/02/ssh-agent-forwarding.html
v25
v25, disculpas, parece que tenías razón. Tony, nunca funcionará si ejecutas el agente en B, porque la conexión no es persistente.
MadHatter