मैं ssh- एजेंट के माध्यम से gpg कुंजी कैसे अग्रेषित कर सकता हूं?


29

Ssh- एजेंट में जोड़े गए ssh कीज को फॉरवर्ड करने के लिए ssh कॉन्फ़िगरेशन फाइल का उपयोग कर सकता हूं। मैं gpg कुंजियों के साथ कैसे कर सकता हूँ?


3
दोनों उत्तर एक चलित बंदरगाह पर GPG एजेंट यूनिक्स सॉकेट का पर्दाफाश करने के लिए सोसाइटी चलाने का सुझाव देते हैं। हालाँकि, यूनिक्स सॉकेट्स के विपरीत, टीसीपी पोर्ट्स का एक्सेस कंट्रोल पर समान स्तर नहीं है। विशेष रूप से, एक ही होस्ट का प्रत्येक उपयोगकर्ता अब आपके GPG एजेंट से जुड़ सकता है। यह संभवत: ठीक है यदि आपके पास एकल-उपयोगकर्ता लैपटॉप है, लेकिन यदि कोई अन्य उपयोगकर्ता भी उसी प्रणाली (जीजी एजेंट चला रहा है) में लॉग इन कर सकता है, तो वे एक महत्वपूर्ण सुरक्षा समस्या का सामना करते हुए, आपके जीपीजी एजेंट तक पहुंच सकते हैं। EXEC पता प्रकार का उपयोग करते हुए SSH को सीधे SSH शुरू करना संभवत: इसे ठीक करने का सबसे अच्छा तरीका है।
माथिज्स कोइजमैन

अधिभारित 6.7+ समाधान का एक और प्रस्तुति के लिए, देखें 2015.rmll.info/IMG/pdf/an-advanced-introduction-to-gnupg.pdf
PHS

यह मेरे लिए उपयोगी था।
phs

जवाबों:


16

EDIT: यह उत्तर अब अप्रचलित है कि ओपनएसएसएच में उचित समर्थन लागू किया गया है, ब्रायन मिंटन का उत्तर देखें।

एसएसएच केवल सुरंग के भीतर टीसीपी कनेक्शन को अग्रेषित करने में सक्षम है।

हालाँकि, आप 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- एजेंट एक यूनिक्स सॉकेट का भी उपयोग करता है, लेकिन इसके लिए विशेष समर्थन है (यहां थोड़ा थक गया है) फिर भी, समाधान अभी भी काम करना चाहिए।
b0fh

1
इस समाधान के लिए, मेरे gpg- एजेंट पोर्ट 12345 के माध्यम से सार्वजनिक रूप से सुलभ होंगे यदि मैं फ़ायरवॉल / NAT के पीछे नहीं था। कृपया उत्तर में इसका उल्लेख किया जाना चाहिए।
जोनास 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। जानकर ख़ुशी हुई की।
ब्रायन मिंटन

2
मुझे एक आवश्यक महत्वपूर्ण विवरण मिला: रिमोट (निजी कुंजी-कम) मशीन पर, हस्ताक्षर की पहचान की सार्वजनिक कुंजी मौजूद होनी चाहिए। स्थानीय gpg संस्करण 2.1.15 OS X, दूरस्थ 2.1.11 लिनक्स।
phs

4

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 सर्वर को पुनरारंभ करें, दूरस्थ मशीन को फिर से कनेक्ट करें - फिर इसे काम करना चाहिए।


कुछ समस्या निवारण सहित अधिक विस्तृत ट्यूटोरियल यहां देखे
MaLo

1
यदि दूरस्थ होस्ट डेबियन का वर्तमान संस्करण चलाता है, तो ऐसा लगता है systemctl --global mask --now gpg-agent.service gpg-agent.socket gpg-agent-ssh.socket gpg-agent-extra.socket gpg-agent-browser.socketकि सिस्टम को दूरस्थ जीपीजी-एजेंट को चोरी करने वाले सॉकेट को लॉन्च करने से रोकने के लिए आवश्यक है। Bugs.debian.org/850982 के अनुसार यह इच्छित व्यवहार है।
संपी

3

मुझे भी ऐसा ही करना पड़ा, और b0fh द्वारा समाधान पर अपनी स्क्रिप्ट आधारित, कुछ छोटे संशोधनों के साथ: यह पृष्ठभूमि प्रक्रियाओं से बाहर निकलता है और मारता है, और यह "कांटा" और "reuseaddr" विकल्प का उपयोग करता है, जो आपको बचाता है पाश (और पृष्ठभूमि को साफ-सुथरा मार सकने में सक्षम बनाता है)।

पूरी चीज एक बार में सभी को आगे की ओर स्थापित करती है, इसलिए यह संभवतः एक स्वचालित सेटअप के करीब आता है।

ध्यान दें कि दूरस्थ होस्ट पर, आपको आवश्यकता होगी:

  1. आपके द्वारा उपयोग किए जाने वाले सामान को साइन / एन / डिक्रिप्ट करने का इरादा है।
  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, लेकिन मैं यह पता लगाने में आसानी से कैसे मार सकता हूं, यह पता नहीं लगा सका।


क्या आप अंतिम आदेश में, समाज से पहले कुछ 'उपयोगकर्ता @ होस्ट' तर्क याद नहीं कर रहे हैं? किसी भी तरह से तय करने के बाद भी, यह मेरे लिए "समाज [6788] ई कनेक्ट (3, एएफ = 2 127.0.0.1 उपयोग, 16) के साथ विफल रहता है: कनेक्शन ने अस्वीकार कर दिया" स्थानीय रूप से पॉप अप करते समय, जब जीपीजी-कनेक्ट-एजेंट दूर से कोशिश कर रहा हो।
डेविड फॉरेस्ट

1

GnuPG Wiki के अनुसार , आपको रिमोट सॉकेट 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. SSH के माध्यम से कनेक्ट करने के लिए कमांड gpg- एजेंट अग्रेषण सक्षम के साथ: (मेरे डेबियन के लिए पथ)

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

@ ब्रायन मिंटन: अतिरिक्त सॉकेट के लिए अग्रेषित नहीं करने पर यह मेरे लिए काम नहीं करता है।
डॉक

0

के /etc/ssh/sshd_configसाथ संशोधित करने के विकल्प के रूप में StreamLocalBindUnlink yes, आप इसके स्थान पर सॉकेट फ़ाइलों के निर्माण को रोक सकते हैं जिन्हें बदलने की आवश्यकता है:

systemctl --global mask --now \
  gpg-agent.service \
  gpg-agent.socket \
  gpg-agent-ssh.socket \
  gpg-agent-extra.socket \
  gpg-agent-browser.socket

ध्यान दें कि यह होस्ट पर सभी उपयोगकर्ताओं को प्रभावित करता है।

बोनस: GPG एजेंट का परीक्षण कैसे करें अग्रेषण काम कर रहा है:

  • स्थानीय: ssh -v -o RemoteForward=${remote_sock}:${local_sock} ${REMOTE}
  • जाँच करें कि ${remote_sock}ssh से क्रिया आउटपुट में दिखाया गया है
  • रिमोट: ls -l ${remote_sock}
  • रिमोट: gpg --list-secret-keys
    • आपको debug1ssh से बहुत सारे संदेश दिखाई देने चाहिए जो आगे ट्रैफ़िक दिखा रहे हैं

यदि वह काम नहीं करता है (जैसा कि मेरे लिए नहीं था) आप ट्रेस कर सकते हैं कि कौन सा सॉकेट GPG एक्सेस कर रहा है:

strace -econnect gpg --list-secret-keys

नमूना उत्पादन:

connect(5, {sa_family=AF_UNIX, sun_path="/run/user/14781/gnupg/S.gpg-agent"}, 35) = 0

मेरे मामले में पथ पूरी तरह से एक्सेस किए जा रहे मेल नहीं खाते ${remote_sock}, लेकिन है कि सॉकेट द्वारा नहीं बनाया गया sshdहै जब मैं में लॉग इन, जोड़ने के बावजूद StreamLocalBindUnlink yesमेरी को /etc/ssh/sshd_config। मुझे लॉगिन पर सिस्टमड द्वारा बनाया गया था।

(ध्यान दें, मैं sshd को फिर से शुरू करने के लिए बहुत कायर था , क्योंकि मेरे पास अभी मेजबान की कोई भौतिक पहुँच नहीं है। service reload sshdस्पष्ट रूप से पर्याप्त नहीं था । )

उबंटू 16.04 पर परीक्षण किया गया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.