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, socatunix 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-agentsokete 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 socatsonra ö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.socketsystemd'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_INFOdeğ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.extrayerel sokete iletmeniz gerekiyor S.gpg-agent. Ayrıca StreamLocalBindUnlinksunucuda 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-socketsırasıyla gpgconf --list-dir agent-extra-socketası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_configbirlikte 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
debug1Ssh'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ış sshdben ekleyerek rağmen giriş yaptığında StreamLocalBindUnlink yeskardeş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 sshdAçıkça yeterli değildi ...)
Ubuntu 16.04 tarihinde test edildi.