B से निजी कुंजी का उपयोग करके B से C के माध्यम से SSH


59

मैं अपने स्थानीय मशीन, ए, से प्रॉक्सी, बी, एक गंतव्य होस्ट, सी के माध्यम से एसएसएच के लिए एक सरल मार्ग की तलाश कर रहा हूं। सी पर सार्वजनिक कुंजी के साथ जाने वाली निजी कुंजी बी पर है, और मैं नहीं कर सकता उस चाबी को मेरी लोकल मशीन पर रख दो। कोई सुझाव?

इसके अलावा, मैं ~ / .ssh / config का उपयोग करके ऐसा करने में सक्षम होना चाहता हूं।

धन्यवाद!


1
क्या आप कह रहे हैं कि आप A से B तक और उसके बाद SSH से C पर एसएसएच करना चाहते हैं? या प्रॉक्सी एक सही पास-थ्रू स्थिति है?
पतले

मैं ए से सी से ssh करना चाहता हूं, बी से गुजर रहा हूं। नीचे मेरा उत्तर भाग से गुजरने के लिए काम करता है, लेकिन यह अभी भी बी के बजाय मेरे स्थानीय कंप्यूटर पर पहचान-पत्र देखने की कोशिश करता है, पास-थ्रू होस्ट।
रैंगलर

जवाबों:


74

योजनाबद्ध:

    ssh       ssh
A ------> B ------> C
    ^          ^
 using A's   using B's
 ssh key     ssh key

पूर्व शर्त:

  • A ssh-agent चला रहा है;
  • Aपहुंच सकते हैं B;
  • Bपहुंच सकते हैं C;
  • Aसार्वजनिक ssh सार्वजनिक कुंजी में मौजूद है B:~/.ssh/authorized_keys
  • Bसार्वजनिक ssh सार्वजनिक कुंजी में मौजूद है C:~/.ssh/authorized_keys

में ~/.ssh/configपर A, जोड़ने

Host C
    ProxyCommand ssh -o 'ForwardAgent yes' B 'ssh-add && nc %h %p'

यदि आपकी ssh निजी कुंजी B पर है तो वह एक अमानक स्थान पर है, इसके बाद अपना रास्ता जोड़ें ssh-add

अब आप का उपयोग करने के लिए सक्षम होना चाहिए Cसे A:

A$ ssh C
C$

13
इसमें केवल 4 साल लगे, लेकिन लगता है कि हमारे पास इसका जवाब है! बहुत बढ़िया
रैंगलर

3
ओपनश v.7.3 के साथ शुरू, आप बस का उपयोग कर सकते हैं ProxyJump B। स्रोत: विकीबूकस
कीथ

2
क्या इसे इस तरह परिभाषित किया जा सकता है: होस्ट user1 @ c ProxyCommand ssh -o 'ForwardAgent Yes' user2 @ B 'ssh-add && nc% h% p'
रवींद्रनाथ अकिला

2
यदि मशीन B में नहीं है तो समाधान कैसे बदलेगा nc?
मज्जालेल

1
@DrewVS ठीक है, एक को कमांड ForwardAgent yes से पहले जोड़ना होगा ProxyJump
अंगूर

22

जाँच करें कि निम्नलिखित काम कर रहा है।

ssh -t B ssh C

यदि आप B पर संग्रहीत कुंजी का उपयोग करना चाहते हैं, तो निम्न आदेश का उपयोग करें।

ssh -t B ssh -i /path/to/identity_on_B C

यहां हम कमांड को निर्दिष्ट कर रहे हैं अर्थात ssh -i /path/to/identity_on_B Cलॉगिन शेल के बजाय बी पर निष्पादित किया जाना है।


यह काम करता है लेकिन यह बी से IdentityFile को नहीं उठाता है। यह अभी भी ए पर दिखता है
रैंगलर

@DrewVS मैंने उत्तर को अपडेट कर दिया है। कृपया जांचें कि क्या यह आपके लिए काम कर रहा है।
सचिन दिवेकर

सचिन, बहुत चालाक। यह पूरी तरह से काम किया। बहुत बहुत धन्यवाद!
रैंगलर

@DrewVS यह सुनकर खुश हो गई कि इसने आपके लिए काम किया। तो कृपया उत्तर स्वीकार करें।
सचिन दिवेकर

हालाँकि, ऐसा लगता है कि यह पासवर्ड रक्षित कुंजी के साथ काम नहीं करता है। पासवर्ड इनपुट छिपा हुआ है, जिससे उपयोगकर्ता को काम करने के लिए इस दृष्टिकोण के लिए अपनी ssh-key की कुंजी को जोड़ना पड़ता है। कोई विचार?
रैंगलर

10

मैंने अभी यह काम किया है। यहां समाधान है, जो सीधा नहीं है। मुझे इसे जल्द ही देखना चाहिए:

~ / .Ssh / config:

Host B
  HostName 1.2.3.4
  User myuser
  IdentityFile ~/.ssh/rsa_key
  ControlMaster auto
  ControlPath ~/.ssh/socket/master-%l-%r@%h:%p

Host C.*
  User customer_username
  Port customer_port
  IdentityFile remote/path/to/ssh/key
  ForwardAgent yes
  ProxyCommand ssh accessable.server nc %h %p

Host C.server-1
  HostName 2.3.4.5

'B' वह प्रॉक्सी सर्वर है जिससे आप कूद रहे हैं। इसे कॉन्फ़िगर किया जाना चाहिए क्योंकि आप सामान्य रूप से किसी सर्वर तक पहुंच को कॉन्फ़िगर करेंगे।

'C' डेस्टिनेशन होस्ट है। कनेक्शन प्रक्रिया में 'बी' का उपयोग करने के लिए इसे कॉन्फ़िगर करने की आवश्यकता है। 'C' में पहचान फ़ाइल 'B' पर ssh-key का पथ है। ProxyCommand 'C' का कनेक्शन 'B' से खोलने के लिए Netcat का उपयोग करता है। Netcat, या nc, को 'B' पर स्थापित करना होगा।

आशा है कि यह दूसरों की मदद करता है।


3
मैंने भी जल्दी ही बोल दिया। यह समाधान काम नहीं करता है। Ssh- एजेंट में कुंजी लोड की गई थी, इसलिए मुझे लगा कि यह काम कर रहा है। उपरोक्त में, C के लिए कुंजी अभी भी A पर होनी चाहिए, B.
रैंगलर

2

मैंने दूरस्थ उदाहरण पर मूल रूप से मेरी ssh कुंजियों को सूचीबद्ध करने के लिए एक साधारण स्क्रिप्ट लिखी थी, और फिर जो मैंने अपने स्थानीय ssh एजेंट को चुना था, उसे जोड़ दूंगा। यह बहुत साफ नहीं है, लेकिन मुझे स्थानीय रूप से एक दूरस्थ स्थान पर सभी चाबियाँ रखने की अनुमति देता है।

अगर किसी को दिलचस्पी है तो यहां की स्क्रिप्ट देखें:

#!/usr/bin/ruby

require "rubygems"
require "fileutils"

# Get key list
key_list = (`ssh jumpbox "cd ~/.ssh/ ; ls id_rsa*" | sed 's/id_rsa_/  /g' | sed     's/id_rsa//g'`)
puts ' '
puts 'Available customer keys:'
puts key_list

# Get customer name input
puts ' '
puts 'Enter customer name: '
customer_name = gets.chomp

# Add key to ssh-agent
key_name = "~/.ssh/id_rsa_#{customer_name}"
puts ' '
puts "Adding #{key_name} to local ssh-agent"
`ssh jumpbox "ssh-add ~/.ssh/id_rsa_#{customer_name}"`
exit 0

मुझे लगता है कि एक कुंजी को जोड़ने को बेमेल माना जा सकता है जिससे कुंजी सूची प्राप्त करने की आवश्यकता समाप्त हो जाती है।
दिनोरात

आपको serverfault.com/a/701884/127993 को स्वीकार करना चाहिए जो वास्तव में आप चाहते हैं।
sjas

1
#!/usr/bin/env bash
target_host=10.121.77.16
target_port=22
target_user=vagrant

bastion_user=yourusername
bastion_host=10.23.85.245
bastion_port=32780

scp -P $target_port -o ProxyCommand="ssh -o 'ForwardAgent yes' $bastion_user@$bastion_host -p $bastion_port 'ssh-add ~/.ssh/*.rsa && nc %h %p'" /tmp/x.txt $target_user@$target_host:/tmp/

1

करने के लिए:

ssh someuser@IP_D

ऐसा है कि

A -> B-> C -> D जहाँ A आप पर है,

अपने स्थानीय ~ /। ssh / config को जैसे संपादित करें:

Host IP_D
  ProxyCommand ssh -o 'ForwardAgent yes' userX@IP_C 'ssh-add && nc %h %p'
Host IP_C
  ProxyCommand ssh -o 'ForwardAgent yes' userY@IP_B 'ssh-add && nc %h %p'

यह उत्तर चुने गए उत्तर पर आधारित है। मुझे यह पता लगाना था कि विभिन्न उपयोगकर्ता पूरे परिदृश्य में कैसे फिट होते हैं।

यह मेरे लिए काम करता है। HTH।


0

स्नोबॉल के जवाब से बहुत मदद मिली। हालांकि, मैंने कमांड में कुछ संशोधन किए और यह बताना चाहता था कि यह कैसे काम करता है। इस स्थिति को देखते हुए:

    ssh        ssh
A -------> B -------> C
     ^          ^
  using A's  using B's
  ssh key    ssh key

अपनी ~/.ssh/configफ़ाइल को संशोधित करें और उस होस्ट को जोड़ें Bजिसके माध्यम से आप कूदना चाहते हैं, बस आप सामान्य रूप से होस्ट को कैसे कॉन्फ़िगर करेंगे:

Host B
 User myusername
 HostName b.mycompany.com

फिर आप उस होस्ट को जोड़ते हैं Cजिसे आप समाप्त करना चाहते हैं:

Host C
 User myusername
 HostName c.intranet.mycompany.com
 ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 && nc %h %p'

ध्यान दें ProxyCommand, जहां:

  • ssh -T -qइंगित करता है कि इसे एक छद्म-टीटीवाई ( -T) आवंटित नहीं करना चाहिए और शांत होना चाहिए ( -q);
  • एक बार छलांग मेजबान पर B, हम SSH कुंजी के Aमाध्यम से कुंजी जोड़ते हैं ssh-add;
  • जो केवल इसलिए काम करता है क्योंकि हमने SSH एजेंट का उपयोग करके अग्रेषित किया है -o 'ForwardAgent yes'
  • ssh-add -t 1 इंगित करता है कि मैं चाहता हूं कि अंतिम मेजबान सी को प्रमाणित करने के लिए केवल 1 सेकंड के लिए कुंजी जोड़ा जाना चाहिए;
  • और अंत में, पोर्ट पर अंतिम मेजबान के लिए nc %h %pएक netcatकनेक्शन शुरू करता है (दोनों जो फ़ाइल में जानकारी के आधार पर एसएसएच द्वारा भरा जाएगा )।%h%p~/.ssh/config

यदि आपको उपयोग करने के लिए एक कस्टम कुंजी निर्दिष्ट करने की आवश्यकता है B, तो आप उस ssh-addहिस्से को संशोधित करके कर सकते हैं :

Host C
 User myusername
 HostName c.intranet.mycompany.com
 ProxyCommand ssh -T -q -o 'ForwardAgent yes' B 'ssh-add -t 1 ~/.ssh/mykey && nc %h %p'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.