어떻게 ssh-agent를 통해 gpg 키를 전달할 수 있습니까?


28

ssh 구성 파일을 사용하여 ssh-agent에 ssh 키를 전달할 수 있습니다. gpg 키를 사용하여 동일한 작업을 수행하려면 어떻게해야합니까?


3
두 답변은 socat를 실행하여 tcp 포트에 GPG 에이전트 유닉스 소켓을 노출하는 것이 좋습니다. 그러나 유닉스 소켓과 달리 TCP 포트는 액세스 제어에서 동일한 레벨을 갖지 않습니다. 특히, ...마다 같은 호스트에있는 사용자가 이제 GPG 에이전트에 연결할 수 있습니다. 단일 사용자 랩톱을 사용하는 경우에는 문제가 없지만 다른 사용자가 동일한 시스템 (GPG 에이전트가 실행중인 시스템)에 로그인 할 수있는 경우 GPG 에이전트에 액세스 할 수도 있으므로 심각한 보안 문제가 발생할 수 있습니다. socat이 직접 EXEC 주소 유형을 사용하여 SSH를 시작하게하는 것이 아마 이것을 고치는 가장 좋은 방법 일 것입니다.
Matthijs Kooijman

openssh 6.7 + 솔루션에 대한 또 다른 설명은 2015.rmll.info/IMG/pdf/an-advanced-introduction-to-gnupg.pdf
phs

나에게 유용했다.
phs

답변:


16

편집 : OpenSSH에서 적절한 지원이 구현되었으므로이 답변은 사용되지 않습니다. Brian Minton의 답변을 참조하십시오.

SSH는 터널 내에서 tcp 연결 만 전달할 수 있습니다.

그러나 다음과 같은 프로그램을 사용할 수 있습니다. socat TCP를 통해 유닉스 소켓을 중계하려면 다음과 같이하면된다. (클라이언트 호스트와 서버 호스트 모두에 socat이 필요하다.)

# 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) &

그것이 효과가 있는지 테스트하십시오. gpg-connect-agent. GPG_AGENT_INFO가 원격 호스트에서 정의되지 않았는지 확인하십시오. $HOME/.gnupg/S.gpg-agent 소켓.

이제는 자동으로 실행하는 방법이 필요합니다.


ssh 에이전트 키는 구성 파일에서 전달이 설정되면 자동으로 전달됩니다. 나는 이것을 시도 할 것이다.
txwikinger

당신 말이 맞아요. ssh-agent도 유닉스 소켓을 사용합니다. 그러나 여기에 약간의 피곤함이 있습니다. 그럼에도 불구하고 해결책은 여전히 ​​유효합니다.
b0fh

1
이 솔루션의 경우, gpg-agent는 방화벽 / NAT 뒤에 있지 않으면 포트 12345를 통해 공개적으로 액세스 할 수 있습니다. 이것은 답변에 언급되어야합니다.
Jonas Schäfer

마지막 편집이 그 문제를 해결 한 것 같아, 조나 스? 그것은 단지 구속력이있다. localhost 지금.
jmtd

이것은 원격 호스트의 다음 인수로 인해 실패합니다. gpg-connect-agent: can't connect to server: ec=31.16383 gpg-connect-agent: error sending RESET command: Invalid value passed to IPC. 원격 socat 그리고 나서 죽는다. 지역 socat 금형 및 절단기 socat[24692] E connect(3, AF=1 "", 2): Invalid argument. 이 페이지 에이전트가 키 (단지 암호문)를 저장하지 않기 때문에 이것이 결코 작동하지 않을 것이라고 생각하게 만듭니다. 누구에게나 작동하는 것으로 확인 되었습니까?
jmtd

17

OpenSSH의 새로운 유닉스 도메인 소켓 포워딩은 버전 6.7부터 직접 할 수 있습니다.

당신은 다음과 같이 할 수 있어야합니다 :

ssh -R /home/bminton/.gnupg/S.gpg-agent:/home/bminton/.gnupg/S-gpg-agent -o "StreamLocalBindUnlink=yes" -l bminton 192.168.1.9

@DrewR. 다행 이군.
Brian Minton

1
필자는 필수적인 세부 사항을 발견했습니다. 원격 (개인 키가없는) 시스템에서 공공의 서명 신분의 열쇠가 있어야합니다. 로컬 gpg 버전 2.1.15 OS X, 원격 2.1.11 Linux.
phs

3

나는 b0fh에 의해 b0fh에 의해 스크립트를 기반으로 스크립트를 작성해야만했습니다.이 스크립트는 exit를 트랩하고 백그라운드 프로세스를 종료하며 "fork"및 "reuseaddr"옵션을 사용하여 socat을 저장합니다. 루프 (그리고 배경 socat를 깨끗하게 죽일 수있게 만든다).

모든 것은 한 번에 모든 포워드를 설정하므로 자동화 된 설정에 더 가깝습니다.

원격 호스트에서 다음을 수행해야합니다.

  1. 당신이 서명 / en / 해독 물건에 사용하고자하는 열쇠 고리.
  2. 리모컨의 gpg 버전에 따라 위조 GPG_AGENT_INFO 변하기 쉬운. 내 채울거야. ~/.gnupg/S.gpg-agent:1:1 첫 번째 1은 gpg 에이전트의 PID입니다 (항상 "init"으로 위장합니다. 항상 실행됩니다). 두 번째는 에이전트 프로토콜 버전 번호입니다. 이것은 로컬 시스템에서 실행중인 것과 일치해야합니다.

#!/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'

나는 또한 하나의 SSH 명령 호출 (원격 호스트에서 로컬 호스트로 다시 연결)을 사용하는 솔루션도 있다고 생각한다. -o LocalCommand, 그러나 나는 출구에서 그것을 편리하게 죽이는 방법을 알아낼 수 없었다.


마지막 명령에서 socat 앞에 'user @ host'인수가 누락되지 않았습니까? 아무튼 그걸 고친 후에도, gpg-connect-agent를 원격으로 시도 할 때 "socat [6788] E connect (3, AF = 2 127.0.0.1:0, 16) : Connection refused"라는 메시지가 나에게 나타나지 않습니다.
David Faure

2

새로운 버전의 GnuPG 또는 Linux 배포판에서는 소켓의 경로가 변경 될 수 있습니다. 이것들은 다음을 통해 찾을 수 있습니다.

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

$ gpgconf --list-dirs agent-socket

그런 다음이 경로를 SSH 구성에 추가하십시오.

Host remote
  RemoteForward <remote socket> <local socket>

공개 키 복사를위한 빠른 솔루션 :

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

원격 시스템에서 GPG 에이전트를 활성화하십시오.

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

원격 시스템에서 SSH 서버 구성을 수정하고이 매개 변수 (/ etc / ssh / sshd_config)를 추가하십시오.

StreamLocalBindUnlink yes

SSH 서버를 다시 시작하고 원격 컴퓨터에 다시 연결하면 작동합니다.


몇 가지 문제 해결을 포함한 자세한 자습서는 다음에서 찾을 수 있습니다. mlohr.com/gpg-agent-forwarding
MaLo

원격 호스트가 최신 버전의 데비안을 실행하는 경우 실행중인 것으로 보입니다. systemctl --global mask --now gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket gpg-agent-browser.socket systemd가 원격 gpg-agent를 훔치는 소켓을 시작하지 못하게해야합니다. 에 따르면 bugs.debian.org/850982 이것은 의도 된 동작입니다.
sampi

1

에 따르면 GnuPG 위키 , 원격 소켓을 전달해야합니다. S.gpg-agent.extra 국부 소켓에 S.gpg-agent. 또한 당신은 StreamLocalBindUnlink 서버에.
또한 리모컨에서 공개 키를 사용할 수 있어야합니다. GnuPG .

용도 gpgconf --list-dir agent-socket 각기 gpgconf --list-dir agent-extra-socket 실제 경로를 얻으려면 리모컨에서


개요

  1. 리모컨에 추가 된 구성 /etc/sshd_config:

    StreamLocalBindUnlink yes
    
  2. 원격지에서 공개 키 가져 오기 :

    gpg --export <your-key> >/tmp/public
    scp /tmp/public <remote-host>:/tmp/public
    ssh <remote-host> gpg --import /tmp/public
    
  3. gpg-agent 포워딩을 사용하여 SSH를 통해 연결하는 명령 : (내 데비안의 경로)

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

@ 브라이언 minton : 그것은 여분의 소켓으로 전달하지 않으면 나를 위해 작동하지 않습니다.
doak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.