Я могу использовать файл конфигурации ssh, чтобы включить пересылку ключей ssh, добавленных в ssh-agent. Как я могу сделать то же самое с ключами gpg?
5 ответов
Новая Unix Domain Socket Forwarding от 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
РЕДАКТИРОВАТЬ: Этот ответ устарел теперь, когда надлежащая поддержка была реализована в OpenSSH, см. Ответ Брайана Минтона.
SSH способен только пересылать TCP-соединения в туннеле.
Однако вы можете использовать такую программу, как socat
для ретрансляции сокета unix через 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
.
Теперь, надеюсь, все, что вам нужно, это способ запустить все это автоматически!
Мне пришлось сделать то же самое, и мой сценарий основывался на решении b0fh с несколькими крошечными модификациями: он перехватывает выходы и убивает фоновые процессы, а также использует параметры "fork" и "reuseaddr" для socat, что сохраняет вас цикл (и делает фоновый сокат чисто убиваемым).
Все это настраивает все форварды за один раз, так что это, вероятно, приближается к автоматической настройке.
Обратите внимание, что на удаленном хосте вам потребуется:
- Брелки, которые вы намереваетесь использовать для подписи /en /decrypt.
- В зависимости от версии gpg на пульте, поддельная переменная
GPG_AGENT_INFO
. Я~/.gnupg/S.gpg-agent:1:1
- первый 1 - это PID для агента gpg (я имитирую его как "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
, но я не мог понять, как удобно убить это при выходе.
В новых версиях дистрибутивов 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, переподключитесь к удаленному компьютеру - тогда он должен работать.
Согласно GnuPG Wiki, вы должны перенаправить удаленный сокет S.gpg-agent.extra
в локальный сокет S.gpg-agent
.
Кроме того, вам нужно включить StreamLocalBindUnlink
на сервере.
Имейте в виду, что вам также нужна открытая часть вашего ключа, доступная на удаленной GnuPG .
Используйте gpgconf --list-dir agent-socket
соответственно gpgconf --list-dir agent-extra-socket
на удаленном компьютере, чтобы получить фактические пути.
Резюме
Добавленная конфигурация в удаленном
/etc/sshd_config
:StreamLocalBindUnlink yes
Импортируйте ваш открытый ключ на удаленный компьютер:
gpg --export <your-key> >/tmp/public scp /tmp/public <remote-host>:/tmp/public ssh <remote-host> gpg --import /tmp/public
Команда для подключения через SSH с включенной переадресацией gpg-agent: (пути к моему Debian)
ssh -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent.extra <remote-host>