क्या ssh कुंजी को id_rsa नाम दिया जाना चाहिए?


130

मैं इस समस्या से दो-चार बार आया हूं जब कुंजीबद्ध प्रमाणीकरण के साथ बिल्ड सर्वर बना रहा हूं।

मैं सोच रहा था कि क्या किसी और के पास यह अनुभव है। मेरे पास मेरे वर्तमान उपयोगकर्ता के लिए कुछ कुंजियाँ हैं जो विभिन्न मशीनों से जुड़ सकती हैं। मान लीजिए मशीन 1 और मशीन 2। मैंने अपनी सार्वजनिक कुंजी उनकी संबंधित अधिकृत_की फ़ाइल में चिपका दी है। पहली कुंजी को मैंने पहली कुंजी id_rsa और दूसरी कुंजी bender नाम दिया है।

जब मैं बेंडर से कनेक्ट करने का प्रयास करता हूं तो मुझे अपने वर्बोज़ ssh कनेक्शन के साथ निम्न आउटपुट मिलता है

debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: /home/bozo/.ssh/.ssh/identity
debug1: Trying private key: /home/bozo/.ssh/.ssh/id_rsa
debug1: Trying private key: /home/bozo/.ssh/id_dsa
debug1: No more authentication methods to try.
Permission denied (publickey).

यह केवल id_rsa कुंजी प्रदान करता है, जैसा कि आप ऊपर देख सकते हैं। क्या ये सही है? यदि हां तो क्यों? अधिक कुंजियों की पेशकश करने के लिए मुझे यह कैसे मिलेगा? मुझे पता है कि यह एक ऐसी समस्या है जिसे मैं रुक-रुक कर देखता हूं, क्योंकि घर पर मेरे पास बिना किसी परेशानी के कई चाबियां हैं।

मैं एक अवलोकन की भी सराहना करता हूं कि कैसे ग्राहक और सर्वर के साथ पब और निजी कुंजियां बातचीत करती हैं। मुझे लगा कि मेरे पास एक बहुत अच्छा विचार है, लेकिन जाहिर तौर पर मुझे कुछ याद आ रहा है।

कृपया और धन्यवाद।

जवाबों:


156

डिफ़ॉल्ट रूप से, ssh फ़ाइलों id_dsaऔर id_rsaफ़ाइलों की खोज करता है। चाबियों को इस तरह नामित करने की आवश्यकता नहीं है, आप इसे mykeyकेवल नाम दे सकते हैं , या इसे एक अलग निर्देशिका में भी रख सकते हैं। हालाँकि, यदि आप दोनों में से किसी एक को करते हैं, तो आपको ssh कमांड में कुंजी को स्पष्ट रूप से संदर्भित करने की आवश्यकता है:

ssh user@server -i /path/to/mykey

यदि कोई कमांड स्वीकार नहीं करता है -i, उदाहरण sshfsके लिए, IdentityFileविकल्प का उपयोग करें :

sshfs -o IdentityFile=/path/to/mykey user@host:/path/on/remote /mountpoint

यह काम किस प्रकार करता है

कुंजी बनाते समय, आपको दो फाइलें मिलेंगी: id_rsa(निजी कुंजी) और id_rsa.pub(सार्वजनिक कुंजी)। जैसा कि उनके नाम से पता चलता है, निजी कुंजी को गुप्त रखा जाना चाहिए और सार्वजनिक कुंजी सार्वजनिक रूप से प्रकाशित की जा सकती है।

सार्वजनिक कुंजी प्रमाणीकरण एक सार्वजनिक और एक निजी कुंजी के साथ काम करता है। क्लाइंट और सर्वर दोनों की अपनी कुंजी है। openssh-serverसर्वर स्थापित करते समय सार्वजनिक और निजी कुंजी स्वचालित रूप से उत्पन्न होती हैं। क्लाइंट के लिए, आपको अपने दम पर ऐसा करना होगा।

जब आप (क्लाइंट) सर्वर से जुड़ते हैं, तो सार्वजनिक कुंजी का आदान-प्रदान होता है। आपको सर्वर एक और सर्वर आपका प्राप्त होगा। पहली बार जब आप सर्वर सार्वजनिक कुंजी प्राप्त करते हैं, तो आपको इसे स्वीकार करने के लिए कहा जाएगा। यदि यह सार्वजनिक कुंजी एक समय में बदल जाती है, तो आपको चेतावनी दी जाएगी क्योंकि संभावित MITM (बीच में आदमी) हमला हो रहा है, क्लाइंट और सर्वर के बीच यातायात को रोक रहा है।

सर्वर यह जाँचता है कि क्या आपको कनेक्ट (परिभाषित /etc/ssh/sshd_config) करने की अनुमति है और यदि आपकी सार्वजनिक कुंजी ~/.ssh/authorized_keysफ़ाइल में सूचीबद्ध है । सार्वजनिक कुंजी को अस्वीकार करने के संभावित कारण:

  • /etc/ssh/sshd_config:
    • AllowUsersया AllowGroupsनिर्दिष्ट किया गया है, लेकिन आपका सर्वर उपयोगकर्ता समूहों या उपयोगकर्ता सूची में सूचीबद्ध नहीं है (डिफ़ॉल्ट रूप से परिभाषित नहीं है, उपयोगकर्ताओं या समूहों पर लॉगिंग से कोई प्रतिबंध नहीं है)।
    • DenyUsersया DenyGroupsनिर्दिष्ट किया गया है और आप उपयोगकर्ता या समूह सूची में हैं।
    • आप रूट के रूप में लॉगिन करने का प्रयास कर रहे हैं, लेकिन (डिफ़ॉल्ट ) पर PermitRootLoginसेट है ।Noyes
    • PubkeyAuthenticationNo(डिफ़ॉल्ट yes) पर सेट है ।
    • AuthorizedKeysFileएक अलग स्थान पर सेट किया गया है, और सार्वजनिक कुंजी को उस फ़ाइल में नहीं जोड़ा जाता है (डिफ़ॉल्ट .ssh/authorized_keys, होम डायर के सापेक्ष)
  • ~/.ssh/authorized_keys: आपकी सार्वजनिक कुंजी इस फ़ाइल में नहीं जोड़ी गई है (ध्यान दें कि यह फ़ाइल रूट उपयोगकर्ता के रूप में पढ़ी जाती है)

कई कुंजियों का उपयोग करना

कई कुंजियों का उपयोग करना असामान्य नहीं है। चल रहा है के बजाय ssh user@host -i /path/to/identity_file, आप एक विन्यास फाइल का उपयोग कर सकते ~/.ssh/config

सामान्य सेटिंग्स आइडेंटिटीफाइल (चाबियां) और पोर्ट हैं। अगला कॉन्फ़िगरेशन "id_dsa" और "bender" की जाँच करेगा जब केवल साथ कनेक्ट होगा ssh youruser@yourhost:

Host yourhost
   IdentityFile ~/.ssh/id_dsa
   IdentityFile ~/.ssh/bender

यदि आप छोड़ देते हैं Host yourhost, तो सेटिंग्स सभी SSH कनेक्शनों पर लागू होगी। अन्य विकल्प भी तरह इस होस्ट मैच के लिए निर्दिष्ट किया जा सकता User youruser, Port 2222आदि यह आपको आशुलिपि के साथ कनेक्ट करने की अनुमति होगी ssh yourhostके बजाय ssh -p2222 youruser@yourhost -i ~/.ssh/id_dsa -i ~/.ssh/bender


1
मुझे कुंजी निर्दिष्ट करने की आवश्यकता क्यों है? पूरे बिंदु तो मैं मशीन के लिए आसान कर सकते हैं ssh है।
myusuf3

2
@StevenRoose से ssh_config(5): फ़ाइल का नाम किसी उपयोगकर्ता की होम निर्देशिका या निम्न एस्केप वर्णों में से एक को संदर्भित करने के लिए tilde सिंटैक्स का उपयोग कर सकता है: '% d' (स्थानीय उपयोगकर्ता के घरेलू निर्देशिका), '% u' (स्थानीय उपयोगकर्ता नाम), '% l '(स्थानीय होस्ट नाम),'% h '(दूरस्थ होस्ट नाम) या'% r '(दूरस्थ उपयोगकर्ता नाम)। वाइल्ड कार्ड निर्दिष्ट करना संभव नहीं है, लेकिन यह सुविधाजनक होना चाहिए जो मुझे लगता है। ध्यान रखें कि एक सर्वर को आपके द्वारा भेजे गए प्रत्येक कुंजी की जांच करनी है, इसलिए कम कुंजी निर्दिष्ट करना बेहतर है। होस्ट कार्य पर वाइल्डकार्ड, फिर से मैनुअल पेज देखें ssh_config(5)
लेकेनस्टाइन

2
@therobyouknow आपको प्रत्येक मशीन के लिए एक अद्वितीय कुंजी जोड़ी बनाने की आवश्यकता नहीं है। आमतौर पर आपके पास कुछ कुंजियाँ होती हैं, और .ssh/authorized_keysदूरस्थ मशीनों पर फ़ाइल में से किसी एक की सार्वजनिक कुंजी को जोड़ते हैं। यदि आप मानक .ssh/id_rsaफ़ाइल नाम (या id_dsa, id_ecdsa या हाल ही में id_ed25519) का उपयोग करते हैं, तो ssh यह स्वचालित रूप से प्रयास करेगा और आपको IdentityFileअपने कॉन्फ़िगरेशन (या इसके लिए -i path/to/id_fileपैरामीटर ssh) को निर्दिष्ट करने की आवश्यकता नहीं है ।
लेकेन्स्टाइन 16

4
मुझे ऐसे उत्तर पसंद हैं जो आवश्यक विवरण से परे हैं और अवधारणा को समझाने के लिए समय लेते हैं। अद्भुत काम! +1
उपयोगकर्ता 2490003

1
@landed यह SSH सर्वर का होस्ट है (यह एक IP पता या DNS नाम हो सकता है)। मैंने उस खंड को स्पष्ट करने की कोशिश की है, उम्मीद है कि इससे मदद मिलेगी।
लेकेनस्टेन जु

40

मेरी पसंदीदा विधि निजी कुंजी को स्वचालित रूप से चयनित करने की अनुमति देती है

IdentityFile ~/.ssh/%l_%r@%h_id_rsa

SSH स्थानीय मशीन के नाम के साथ% l, रिमोट यूजरनेम के साथ% r, और रिमोट होस्ट के साथ% h को प्रतिस्थापित करेगा, इस प्रकार अगर मैं अपने मशीन से कनेक्ट करना चाहता था जिसे फू कहा जाता है तो उपयोगकर्ता के रूप में बार, मैं चलाता हूं:

ssh bar

और ssh स्वचालित रूप से उपयोग करेगा:

~/.ssh/foo_user@bar_id_rsa

स्थानीय होस्ट के रूप में भी संग्रहीत किया जाता है, यह एनएफएस (अलग-अलग कुंजी प्रति मशीन!) पर साझा किए गए घर निर्देशिकाओं के लिए अनुमति देता है या यहां तक ​​कि यह भी पहचानता है कि कुंजी किस मशीन पर थी ...


1

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

मैं उस कुंजी के लिए एक सिम्लिंक बनाता हूं जिसे मैं उस समय उपयोग करना चाहता हूं, और उसके बाद से केवल जिस परियोजना पर मैं काम कर रहा हूं, उसके आधार पर केवल परिवर्तन होता है, मैं इससे खुश हूं।

यहां मैंने वर्चुअलबॉक्स के तहत चलने वाली मशीनों के लिए अपनी कुंजियों से जोड़ा है:

$ cd .ssh/
$ ln -s adam_vbox-id_rsa.pub id_rsa.pub
$ ln -s adam_vbox-id_rsa id_rsa

$ ls -l
total 12
-rw------- 1 adam adam 1675 2013-10-04 02:04 adam_vbox-id_rsa
-rw-r--r-- 1 adam adam  396 2013-10-04 02:04 adam_vbox-id_rsa.pub
lrwxrwxrwx 1 adam adam   16 2013-10-04 02:17 id_rsa -> adam_vbox-id_rsa
lrwxrwxrwx 1 adam adam   20 2013-10-04 02:17 id_rsa.pub -> adam_vbox-id_rsa.pub
-rw-r--r-- 1 adam adam 3094 2013-10-04 02:09 known_hosts

मैन्युअल रूप से ln कमांड को फिर से टाइप किए बिना एक दूसरे सेट पर बदलने के लिए वास्तव में त्वरित स्क्रिप्ट को भी जोड़ा जा सकता है ।

फिर, यह केवल दो कुंजी के लिए एक समाधान नहीं है, लेकिन अधिक संख्या के लिए, यह व्यावहारिक हो सकता है।


1
मैं बस प्रत्येक सर्वर के साथ काम करने के लिए bash_profile द्वारा एक उपनाम जोड़ता हूं। तो एक सर्वर के लिए जिसे बॉब कहा जाता है, मेरे पास बस यही है ... उर्फ ​​बॉब = "ssh bob.example.com -l pete -i / path / to / key" - तो मैं सिर्फ bob टाइप करता हूँ - और मैं अंदर हूँ!
पीटर बैगनॉल

2
हालांकि, कभी-कभी "चीजों को जिस तरह से आप पहले से जानते हैं, उसे प्राप्त करना आसान होता है", यदि आप सेटअप और कुंजी और होस्ट को कॉन्फ़िगर करते हैं तो आसान तरीके हैं। यह टिप्पणी दोनों टिप्पणी पोस्टर और टिप्पणी @ पीटर-बैगनॉल पर निर्देशित है
स्कॉट प्रिव डे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.