Bir gpg anahtarını ssh-agent ile nasıl yönlendirebilirim?


29

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?


3
Her iki cevap da, socat'ın GPG ajanı unix soketini bir tcp portunda ortaya çıkarmasını öneriyor. Ancak, unix soketlerinden farklı olarak, TCP bağlantı noktaları erişim kontrolünde aynı seviyeye sahip değildir. Özellikle, aynı ana bilgisayardaki her kullanıcı artık GPG temsilcinize bağlanabilir. Bu, tek kullanıcılı bir dizüstü bilgisayarınız varsa, tamamdır, ancak diğer kullanıcılar da aynı sisteme giriş yapabilirlerse (GPG aracısının çalıştığı sistem), GPG aracınıza erişebilirler ve bu da önemli bir güvenlik sorunu oluşturur. Socat'ın EXEC adres türünü kullanarak doğrudan SSH'yi başlatmasına izin vermek muhtemelen bunu düzeltmenin en iyi yoludur.
Matthijs Kooijman,

Openssh 6.7+ çözümün başka sunum için bkz 2015.rmll.info/IMG/pdf/an-advanced-introduction-to-gnupg.pdf
PHS

Bu benim için faydalı oldu.
phs

Yanıtlar:


16

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!


Yönlendirme yapılandırma dosyasında yönlendirildiğinde, ssh agent tuşları otomatik olarak iletilir. Bunu deneyeceğim.
txwikinger

Haklısın, ssh-agent da bir unix soketi kullanıyor, ama bunun için özel bir desteği var (burada biraz yoruldum :) Yine de, çözüm hala çalışmalı.
b0fh

1
Bu çözüm için, bir güvenlik duvarı / NAT'ın arkasında olmasaydım gpg-ajanıma 12345 portu üzerinden halka açık olacaktı. Bu cevapta belirtilmelidir lütfen.
Jonas Schäfer,

Son düzenlemenin bu sorunu çözdüğünü tahmin ediyorum, Jonas? bu sadece localhostşu an için bağlayıcı .
jmtd

Bu uzak ana en aşağıdaki argümanı ile benim için başarısız 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ı?
jmtd

17

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

@DrewR. Bunu duyduğuma sevindim.
Brian Minton

2
Gerekli bir kritik ayrıntı buldum: uzak (özel anahtarsız) makinede, imza kimliğinin ortak anahtarı bulunmalıdır. Yerel gpg sürüm 2.1.15 OS X, uzak 2.1.11 linux.
phs

4

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.


Bazı sorun giderme de dahil olmak üzere daha ayrıntılı bir öğretici burada bulunabilir: mlohr.com/gpg-agent-forwarding
MaLo

1
Uzak ana bilgisayarın Debian'ın geçerli bir sürümünü çalıştırması durumunda, 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.
sampi

3

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:

  1. Eşyaları imzalamak / en / deşifre etmek için kullanmayı düşündüğünüz anahtarlıklar.
  2. Uzaktan kumandadaki gpg sürümüne bağlı olarak, sahte bir 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.


Son komutta, socat'tan önce 'user @ host' argümanını kaçırmıyor musunuz? Her neyse, bunu düzelttikten sonra bile, bu benim için başarısız oluyor "socat [6788] E connect (3, AF = 2 127.0.0.1:0, 16): Gpg-connect-agent'ı uzaktan denerken yerel olarak açılmayı reddetti".
David Faure

1

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.


özet

  1. Uzaktan kumandaya eklenen yapılandırma /etc/sshd_config:

    StreamLocalBindUnlink yes
    
  2. 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
    
  3. 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>
    

@brian minton: Ekstra prize gönderilmiyorsa, bu benim için işe yaramaz.
18'de 12

0

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:

  • Yerel: ssh -v -o RemoteForward=${remote_sock}:${local_sock} ${REMOTE}
  • ${remote_sock}Ssh'den ayrıntılı çıktıda gösterildiğini kontrol edin.
  • Uzak: ls -l ${remote_sock}
  • Uzak: gpg --list-secret-keys
    • debug1Ssh'den iletilen trafiği gösteren birçok ileti görmelisiniz

Bu 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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.