Ssh-agent'a eklenen ssh tuşlarının iletimini sağlamak için ssh yapılandırma dosyasını kullanabilirim. Aynı şeyi gpg tuşları ile nasıl yapabilirim?
Ssh-agent'a eklenen ssh tuşlarının iletimini sağlamak için ssh yapılandırma dosyasını kullanabilirim. Aynı şeyi gpg tuşları ile nasıl yapabilirim?
Yanıtlar:
EDIT: Bu cevap, OpenSSH'de uygun bir destek verildiği için artık kullanılmıyor, Brian Minton'ın cevabına bakınız.
SSH, sadece tünel içindeki tcp bağlantılarını iletme yeteneğine sahiptir.
Bununla birlikte, socat
unix soketini TCP üzerinden aktarmak gibi bir program kullanabilirsiniz, bunun gibi bir şey (hem istemcide hem de sunucu ana bilgisayarlarında socat'a ihtiyacınız olacak):
# 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) &
Çalışıp çalışmadığını test edin gpg-connect-agent
. Uzak ana bilgisayarda GPG_AGENT_INFO'nun tanımsız olduğundan ve $HOME/.gnupg/S.gpg-agent
sokete geri döndüğünden emin olun .
Şimdi umarım ihtiyacınız olan tek şey, tüm bunları otomatik olarak çalıştırmanın bir yoludur!
localhost
şu an için bağlayıcı .
gpg-connect-agent
: can't connect to server: ec=31.16383 gpg-connect-agent: error sending RESET command: Invalid value passed to IPC
. Uzaktan kumanda socat
sonra ölür. Yerel socat
ölür ve konuşur socat[24692] E connect(3, AF=1 "", 2): Invalid argument
. Bu sayfa , aracının anahtarı (yalnızca parolayı) saklamadığı için bunun asla işe yaramayacağına inanmamı sağlıyor. Bunun herhangi biri tarafından çalışması doğrulandı mı?
OpenSSH'nin yeni Unix Domain Socket Forwarding bunu doğrudan 6.7 sürümünden başlayarak yapabilir.
Gibi bir şey yapabilmelisin:
ssh -R /home/bminton/.gnupg/S.gpg-agent:/home/bminton/.gnupg/S-gpg-agent -o "StreamLocalBindUnlink=yes" -l bminton 192.168.1.9
GnuPG veya Linux dağıtımlarının yeni sürümlerinde soketlerin yolları değişebilir. Bunlar üzerinden öğrenilebilir
$ gpgconf --list-dirs agent-extra-socket
ve
$ gpgconf --list-dirs agent-socket
Ardından, bu yolları SSH yapılandırmanıza ekleyin:
Host remote
RemoteForward <remote socket> <local socket>
Açık anahtarların kopyalanması için hızlı çözüm:
scp .gnupg/pubring.kbx remote:~/.gnupg/
Uzak makinede GPG aracısını etkinleştirin:
echo use-agent >> ~/.gnupg/gpg.conf
Uzak makinede, SSH sunucusu yapılandırmasını da değiştirin ve bu parametreyi ekleyin (/ etc / ssh / sshd_config):
StreamLocalBindUnlink yes
SSH sunucusunu yeniden başlatın, uzaktaki makineye tekrar bağlayın - sonra çalışması gerekir.
systemctl --global mask --now gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket gpg-agent-browser.socket
systemd'nin uzak gpg aracısını çalan bir soket başlatmasını önlemek için çalışıyor gibi görünüyor . Bugs.debian.org/850982'ye göre amaçlanan davranış budur.
Ben de aynısını yapmak zorunda kaldım ve senaryomu b0fh tarafından çözüme dayandırdım, birkaç küçük değişiklikle: Arka plan işlemlerini kapattı ve öldürdü; döngü (ve arka planı socat'ı açıkça öldürülebilir hale getirir).
Her şey tek seferde ileriye doğru ilerliyor, bu yüzden muhtemelen otomatik bir kuruluma yaklaşıyor.
Uzaktaki bilgisayarda, aşağıdakilere ihtiyacınız olacağını unutmayın:
GPG_AGENT_INFO
değişken. Madeni önceden dolduruyorum ~/.gnupg/S.gpg-agent:1:1
- ilk 1 gpg aracısı için bir PID (her zaman çalışan "init" ler gibi taklit ediyorum), ikincisi ise ajan protokol sürüm numarası. Bu, yerel makinenizde çalışanla aynı olmalıdır.
#!/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'
Ayrıca yalnızca bir SSH komut çağrısı (uzaktaki ana bilgisayardan yerel olana bağlanma) kullanan bir çözüm olduğuna inanıyorum -o LocalCommand
, ancak çıkışta uygun şekilde nasıl öldürüleceğini tam olarak bulamadım.
GnuPG Wiki'ye göre , uzak soketi S.gpg-agent.extra
yerel sokete iletmeniz gerekiyor S.gpg-agent
. Ayrıca StreamLocalBindUnlink
sunucuda etkinleştirmeniz gerekir .
Ayrıca, GnuPG uzaktan kumandasında bulunan anahtarınızın halka açık kısmına da ihtiyacınız olduğunu unutmayın .
Kullanım gpgconf --list-dir agent-socket
sırasıyla gpgconf --list-dir agent-extra-socket
asıl yolları almak için uzaktan kumandadaki.
Uzaktan kumandaya eklenen yapılandırma /etc/sshd_config
:
StreamLocalBindUnlink yes
Ortak anahtarınızı uzaktan kumandadan içe aktarın:
gpg --export <your-key> >/tmp/public
scp /tmp/public <remote-host>:/tmp/public
ssh <remote-host> gpg --import /tmp/public
Gpg-agent yönlendirme özelliği etkinleştirilmiş SSH ile bağlanma komutu:
ssh -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent.extra <remote-host>
Modifiye alternatif olarak /etc/ssh/sshd_config
birlikte StreamLocalBindUnlink yes
, bunun yerine değiştirilmesi gerekiyor soket dosyalarının oluşturulmasını önleyebilir:
systemctl --global mask --now \
gpg-agent.service \
gpg-agent.socket \
gpg-agent-ssh.socket \
gpg-agent-extra.socket \
gpg-agent-browser.socket
Bunun ana bilgisayardaki tüm kullanıcıları etkilediğini unutmayın .
Bonus: GPG aracısı yönlendirmesinin nasıl test edileceği çalışıyor:
ssh -v -o RemoteForward=${remote_sock}:${local_sock} ${REMOTE}
${remote_sock}
Ssh'den ayrıntılı çıktıda gösterildiğini kontrol edin.ls -l ${remote_sock}
gpg --list-secret-keys
debug1
Ssh'den iletilen trafiği gösteren birçok ileti görmelisinizBu işe yaramazsa (benim için olmadığı gibi) hangi soket GPG'sinin eridiğini takip edebilirsiniz:
strace -econnect gpg --list-secret-keys
Örnek çıktı:
connect(5, {sa_family=AF_UNIX, sun_path="/run/user/14781/gnupg/S.gpg-agent"}, 35) = 0
Benim durumumda yolu mükemmel erişilen eşleştirilerek ${remote_sock}
, ancak bu soket tarafından oluşturulmamış sshd
ben ekleyerek rağmen giriş yaptığında StreamLocalBindUnlink yes
kardeşime karşı /etc/ssh/sshd_config
. Giriş yapıldıktan sonra systemd tarafından yaratıldım.
(Not: Şimdi ana bilgisayara fiziksel erişimim olmadığı için sshd'yi yeniden başlatmak için çok korkaktım . service reload sshd
Açıkça yeterli değildi ...)
Ubuntu 16.04 tarihinde test edildi.