SSH कुंजी-आधारित प्रमाणीकरण: ज्ञात_होस्ट बनाम अधिकृत_की


21

मैं लिनक्स में ssh कीज़ की स्थापना के बारे में पढ़ता हूँ और कुछ प्रश्न रखता हूँ। यदि मैं गलत हूं तो मुझे सही करों…

मान लीजिए कि मेजबान tr-lgto ssh का उपयोग करके मेजबान tr-mdm से जुड़ना चाहता है। यदि हम यह सुनिश्चित करना चाहते हैं कि यह वास्तविक tr-mdm है, तो हम known_hoststr-mdm पर कुंजियों की एक जोड़ी उत्पन्न करते हैं और हम tr-lgto पर सार्वजनिक कुंजी जोड़ते हैं। यदि tr-mdm यह जांचना चाहता है कि यह असली tr-lgto है, तो tr-lgto को एक की-जनरेट करना होगा और tr-mdm authorized_keysपर सार्वजनिक कुंजी जोड़ना होगा ।

प्रश्न 1 : फ़ाइल में कोई उपयोगकर्ता फ़ील्ड ज्ञात_होस्ट नहीं है, बस आईपी पते और होस्टनाम हैं। tr-mDM में बहुत सारे उपयोगकर्ता हो सकते हैं, जिनमें से प्रत्येक के पास अपना .sshफ़ोल्डर है। क्या हमें प्रत्येक known_hostsफाइल में सार्वजनिक कुंजी को जोड़ना चाहिए ?

प्रश्न 2 : मैंने पाया कि ssh-keyscan -t rsa tr-mdmtr-mdm की सार्वजनिक कुंजी वापस कर देंगे। मुझे कैसे पता चलेगा कि यह कुंजी किस उपयोगकर्ता की है? इसके अलावा, सार्वजनिक कुंजी /root/.ssh/उस आदेश से अलग है जो वापस आती है। यह कैसे हो सकता है?



मैंने @Gilles द्वारा उल्लिखित प्रश्न पर "ssh 'के लिए कुछ पृष्ठभूमि संदर्भ" सिक्योर फाइल्स युक्त सार्वजनिक कुंजी के बारे में "एक उत्तर में जोड़ा: < Security.stackexchange.com/questions/20706/… >
IAM_AL_X

जवाबों:


33

आप क्लाइंट मशीन के लिए सर्वर मशीन के प्रमाणीकरण और उपयोगकर्ता के प्रमाणीकरण को सर्वर मशीन से मिला रहे हैं।

सर्वर प्रमाणीकरण

एसएसएच कनेक्शन स्थापित होने पर होने वाली पहली चीजों में से एक यह है कि सर्वर क्लाइंट को अपनी सार्वजनिक कुंजी भेजता है, और क्लाइंट के लिए ( सार्वजनिक कुंजी क्रिप्टोग्राफी के लिए धन्यवाद) साबित करता है कि यह संबंधित निजी कुंजी जानता है। यह सर्वर को प्रमाणित करता है: यदि प्रोटोकॉल का यह भाग सफल होता है, तो क्लाइंट जानता है कि सर्वर वह है जो यह दिखावा करता है कि यह है।

क्लाइंट जाँच सकता है कि सर्वर एक ज्ञात है, न कि कुछ दुष्ट सर्वर सही एक के रूप में पास होने की कोशिश कर रहे हैं। SSH सर्वर की वैधता को सत्यापित करने के लिए केवल एक सरल तंत्र प्रदान करता है: यह उन सर्वरों को याद करता है जो आप ~/.ssh/known_hostsक्लाइंट मशीन पर फ़ाइल में कनेक्ट कर चुके हैं (सिस्टम-वाइड फ़ाइल भी है /etc/ssh/known_hosts)। पहली बार जब आप किसी सर्वर से कनेक्ट होते हैं, तो आपको कुछ अन्य तरीकों से जांचने की आवश्यकता होती है कि सर्वर द्वारा प्रस्तुत सार्वजनिक कुंजी वास्तव में उस सर्वर की सार्वजनिक कुंजी है जिसे आप कनेक्ट करना चाहते थे। यदि आपके पास उस सर्वर की सार्वजनिक कुंजी है जिसे आप कनेक्ट करना चाहते हैं, तो आप इसे ~/.ssh/known_hostsक्लाइंट पर मैन्युअल रूप से जोड़ सकते हैं ।

किसी भी गोपनीय डेटा को भेजने से पहले सर्वर को प्रमाणित करना होगा। विशेष रूप से, यदि उपयोगकर्ता प्रमाणीकरण में एक पासवर्ड शामिल है, तो पासवर्ड को किसी अनहोनी सर्वर पर नहीं भेजा जाना चाहिए।

प्रयोक्ता प्रमाणीकरण

सर्वर केवल एक दूरस्थ उपयोगकर्ता को लॉग इन करने देता है यदि वह उपयोगकर्ता यह साबित कर सकता है कि उन्हें उस खाते तक पहुंचने का अधिकार है। सर्वर के कॉन्फ़िगरेशन और उपयोगकर्ता की पसंद के आधार पर, उपयोगकर्ता कई प्रकार के क्रेडेंशियल्स में से एक प्रस्तुत कर सकता है (नीचे दी गई सूची संपूर्ण नहीं है)।

  • उपयोगकर्ता उस खाते के लिए पासवर्ड प्रस्तुत कर सकता है जिसे वह लॉग इन करने की कोशिश कर रहा है; सर्वर तब सत्यापित करता है कि पासवर्ड सही है।
  • उपयोगकर्ता सार्वजनिक कुंजी प्रस्तुत कर सकता है और यह साबित कर सकता है कि उसके पास उस सार्वजनिक कुंजी से जुड़ी निजी कुंजी है। यह ठीक उसी विधि है जिसका उपयोग सर्वर को प्रमाणित करने के लिए किया जाता है, लेकिन अब उपयोगकर्ता अपनी पहचान साबित करने की कोशिश कर रहा है और सर्वर उन्हें सत्यापित कर रहा है। यदि उपयोगकर्ता यह साबित करता है कि वह निजी कुंजी जानता है और लॉगिन कुंजी खाता की प्राधिकरण सूची ( ~/.ssh/authorized_keysसर्वर पर) में है, तो लॉगिन प्रयास स्वीकार किया जाता है ।
  • एक अन्य प्रकार की विधि में उपयोगकर्ता को क्लाइंट मशीन को प्रमाणित करने के काम का हिस्सा शामिल करना शामिल है। यह नियंत्रित वातावरण में होता है जैसे कि उद्यम, जब कई मशीनें समान खाते साझा करती हैं। सर्वर क्लाइंट मशीन को उसी तंत्र द्वारा प्रमाणित करता है जिसका उपयोग दूसरे तरीके से किया जाता है, फिर उपयोगकर्ता को प्रमाणित करने के लिए क्लाइंट पर निर्भर करता है।

1
अच्छा जवाब गाइल्स, लेकिन मेरा सवाल यह है कि कोई भी सर्वर एक यादृच्छिक सार्वजनिक कुंजी भेज सकता है और यह साबित कर सकता है कि उसके पास संबंधित सार्वजनिक कुंजी है। कैसे साबित होता है कि सर्वर प्रामाणिक है?
एलेक्स

@spartacus मुझे लगता है कि आपका मतलब था "और यह साबित करना कि यह संबंधित निजी कुंजी है", है ना? विचार यह है कि ग्राहक एक यादृच्छिक रूप से उत्पन्न मूल्य (ए) भेजता है चुनौती ) , और सर्वर निजी कुंजी के आधार पर कुछ गणना करता है जो चुनौती पर निर्भर करता है (इसलिए सर्वर इसे प्राप्त होने तक गणना नहीं कर सकता है चुनौती) और यह केवल निजी कुंजी के ज्ञान के साथ किया जा सकता है।
गिलेस एसओ- बुराई को रोकना '

मुझे लगता है कि पहली बार क्लाइंट सर्वर से कनेक्ट होता है। मुझे लगता है कि क्लाइंट उस सर्वर पर पहली बार भरोसा करेगा। तब सर्वर अपनी सार्वजनिक कुंजी भेजेगा और ग्राहक निम्नलिखित कनेक्शन के लिए सर्वर को प्रमाणित करने में सक्षम होगा।
सिंक करें

@synack आह, पहली बार? बल्कि, क्लाइंट लेस उपयोगकर्ता निर्णय लेते हैं ("क्या आप वाकई कनेक्ट करना जारी रखना चाहते हैं (हां / नहीं)?")। सर्वर उस बिंदु पर कुछ भी साबित नहीं करता है।
गिल्स एसओ- बुराई को रोकें '

आप सही हैं, यह निर्णय लेने वाला उपयोगकर्ता है।
सिंक करें

2

मेरे दोस्तों ने मुझे इसका जवाब दिया। डिफ़ॉल्ट रूप से, कुंजी एक मशीन की पहचान करती है और उपयोगकर्ता की नहीं। तो कुंजियाँ / etc / ssh / में संग्रहीत की जाती हैं। इसलिए मुझे /root/.sh में संग्रहीत एक से अलग कुंजी मिली

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