Ssh- एजेंट में जोड़े गए ssh कीज को फॉरवर्ड करने के लिए ssh कॉन्फ़िगरेशन फाइल का उपयोग कर सकता हूं। मैं gpg कुंजियों के साथ कैसे कर सकता हूँ?
Ssh- एजेंट में जोड़े गए ssh कीज को फॉरवर्ड करने के लिए ssh कॉन्फ़िगरेशन फाइल का उपयोग कर सकता हूं। मैं gpg कुंजियों के साथ कैसे कर सकता हूँ?
जवाबों:
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
सॉकेट पर वापस गिर जाए ।
अब उम्मीद है कि आप सभी को स्वचालित रूप से चलाने का एक तरीका है!
localhost
अब के लिए बाध्यकारी है ।
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
। यह पृष्ठ मुझे विश्वास दिलाता है कि यह कभी काम नहीं करेगा, क्योंकि एजेंट कुंजी (केवल पासफ़्रेज़) को संग्रहीत नहीं करता है। क्या इस बात की पुष्टि किसी ने की है?
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
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 सर्वर को पुनरारंभ करें, दूरस्थ मशीन को फिर से कनेक्ट करें - फिर इसे काम करना चाहिए।
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 के अनुसार यह इच्छित व्यवहार है।
मुझे भी ऐसा ही करना पड़ा, और b0fh द्वारा समाधान पर अपनी स्क्रिप्ट आधारित, कुछ छोटे संशोधनों के साथ: यह पृष्ठभूमि प्रक्रियाओं से बाहर निकलता है और मारता है, और यह "कांटा" और "reuseaddr" विकल्प का उपयोग करता है, जो आपको बचाता है पाश (और पृष्ठभूमि को साफ-सुथरा मार सकने में सक्षम बनाता है)।
पूरी चीज एक बार में सभी को आगे की ओर स्थापित करती है, इसलिए यह संभवतः एक स्वचालित सेटअप के करीब आता है।
ध्यान दें कि दूरस्थ होस्ट पर, आपको आवश्यकता होगी:
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
, लेकिन मैं यह पता लगाने में आसानी से कैसे मार सकता हूं, यह पता नहीं लगा सका।
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- एजेंट अग्रेषण सक्षम के साथ: (मेरे डेबियन के लिए पथ)
ssh -R /run/user/1000/gnupg/S.gpg-agent:/run/user/1000/gnupg/S.gpg-agent.extra <remote-host>
के /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
debug1
ssh से बहुत सारे संदेश दिखाई देने चाहिए जो आगे ट्रैफ़िक दिखा रहे हैंयदि वह काम नहीं करता है (जैसा कि मेरे लिए नहीं था) आप ट्रेस कर सकते हैं कि कौन सा सॉकेट 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 पर परीक्षण किया गया