Como posso encaminhar uma chave gpg via ssh-agent?

28

Eu posso usar o arquivo de configuração ssh para habilitar o encaminhamento de chaves ssh adicionadas ao ssh-agent. Como posso fazer o mesmo com as teclas gpg?

    
por txwikinger 10.07.2010 / 04:05

5 respostas

16

EDIT: Esta resposta está obsoleta agora que o suporte adequado foi implementado no OpenSSH, veja a resposta de Brian Minton.

O SSH só é capaz de encaminhar conexões tcp dentro do túnel.

Você pode, no entanto, usar um programa como socat para retransmitir o soquete unix sobre TCP, com algo assim (você precisará de socat tanto no cliente quanto nos hosts do servidor):

# Get the path of gpg-agent socket:
GPG_SOCK=$(echo "$GPG_AGENT_INFO" | cut -d: -f1)

# Forward some local tcp socket to the agent
(while true; do
    socat TCP-LISTEN:12345,bind=127.0.0.1 UNIX-CONNECT:$GPG_SOCK;
done) &

# Connect to the remote host via ssh, forwarding the TCP port
ssh -R12345:localhost:12345 host.example.com

# (On the remote host)
(while true; do
    socat UNIX-LISTEN:$HOME/.gnupg/S.gpg-agent,unlink-close,unlink-early TCP4:localhost:12345;
done) &

Teste se funciona com gpg-connect-agent . Certifique-se de que o GPG_AGENT_INFO esteja indefinido no host remoto, para que ele volte para o soquete $HOME/.gnupg/S.gpg-agent .

Agora esperamos que tudo o que você precise seja uma maneira de executar tudo isso automaticamente!

    
por 19.07.2010 / 15:58
17

O novo Unix Domain Socket Forwarding do OpenSSH pode fazer isso diretamente a partir da versão 6.7.

Você deve poder fazer algo como:

ssh -R /home/bminton/.gnupg/S.gpg-agent:/home/bminton/.gnupg/S-gpg-agent -o "StreamLocalBindUnlink=yes" -l bminton 192.168.1.9
    
por 02.03.2015 / 17:51
3

Eu tive que fazer o mesmo, e baseei meu script na solução por b0fh, com algumas pequenas modificações: Ele intercepta as saídas e mata os processos em segundo plano, e usa as opções "fork" e "reuseaddr" para socat, que economiza o loop (e torna o fundo socat perfeitamente capaz de matar).

A coisa toda configura todos os atacantes de uma só vez, então provavelmente se aproxima de uma configuração automatizada.

Note que no host remoto, você precisará:

  1. Os chaveiros que você pretende usar para assinar / en / descriptografar as coisas.
  2. Dependendo da versão do gpg no controle remoto, uma variável GPG_AGENT_INFO falsa. Prefixo o meu com ~/.gnupg/S.gpg-agent:1:1 - o primeiro 1 é um PID para o agente gpg (eu o falsifico como "init", que está sempre em execução), o segundo é o número da versão do protocolo do agente. Isso deve corresponder ao que está sendo executado na sua máquina local.

#!/bin/bash -e

FORWARD_PORT=${1:-12345}

trap '[ -z "$LOCAL_SOCAT" ] || kill -TERM $LOCAL_SOCAT' EXIT

GPG_SOCK=$(echo "$GPG_AGENT_INFO" | cut -d: -f1)
if [ -z "$GPG_SOCK" ] ; then
    echo "No GPG agent configured - this won't work out." >&2
    exit 1
fi

socat TCP-LISTEN:$FORWARD_PORT,bind=127.0.0.1,reuseaddr,fork UNIX-CONNECT:$GPG_SOCK &
LOCAL_SOCAT=$!

ssh -R $FORWARD_PORT:127.0.0.1:$FORWARD_PORT socat 'UNIX-LISTEN:$HOME/.gnupg/S.gpg-agent,unlink-close,unlink-early,fork,reuseaddr TCP4:localhost:$FORWARD_PORT'

Eu acredito que há também uma solução que envolve apenas uma chamada de comando SSH (conectando de volta do host remoto ao local) usando -o LocalCommand , mas eu não consegui descobrir como matar isso convenientemente ao sair.

    
por 11.01.2014 / 11:39
2

Nas novas versões das distribuições GnuPG ou Linux, os caminhos dos sockets podem mudar. Estes podem ser encontrados via

$ gpgconf --list-dirs agent-extra-socket

e

$ gpgconf --list-dirs agent-socket

Em seguida, adicione esses caminhos à sua configuração de SSH:

Host remote
  RemoteForward <remote socket> <local socket>

Solução rápida para copiar as chaves públicas:

scp .gnupg/pubring.kbx remote:~/.gnupg/

Na máquina remota, ative o agente GPG:

echo use-agent >> ~/.gnupg/gpg.conf

Na máquina remota, modifique também a configuração do servidor SSH e adicione este parâmetro (/ etc / ssh / sshd_config):

StreamLocalBindUnlink yes

Reinicie o servidor SSH, reconecte-se à máquina remota, e isso deve funcionar.

    
por 07.06.2018 / 09:36
1

De acordo com o Wiki do GnuPG , você deve encaminhar o soquete remoto S.gpg-agent.extra para o soquete local S.gpg-agent . Além disso, você precisa habilitar StreamLocalBindUnlink no servidor.
Tenha em mente que você também precisa da parte pública da sua chave disponível no GnuPG

.

Use gpgconf --list-dir agent-socket , respectivamente, gpgconf --list-dir agent-extra-socket no controle remoto para obter os caminhos reais.

Resumo

  1. Configuração adicionada no controle remoto /etc/sshd_config :

    StreamLocalBindUnlink yes
    
  2. Importe sua chave pública no controle remoto:

    gpg --export <your-key> >/tmp/public
    scp /tmp/public <remote-host>:/tmp/public
    ssh <remote-host> gpg --import /tmp/public
    
  3. Comando para se conectar através de SSH com o encaminhamento de gpg-agent ativado: (caminhos para o meu Debian)

    ssh -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent.extra <remote-host>
    
por 06.06.2018 / 14:47