सवाल गैर इंटरैक्टिव गिट क्लोन (एसएसएच फिंगरप्रिंट प्रॉम्प्ट) [डुप्लिकेट]


इस प्रश्न का उत्तर यहां दिया गया है:

मैं एक गैर-संवादात्मक तरीके से एक रेपो क्लोन करना चाहता हूं। क्लोनिंग करते समय, गिट मेजबान के फिंगरप्रिंट की पुष्टि करने के लिए कहता है:

The authenticity of host 'bitbucket.org (207.223.240.182)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)? no

जब भी ये प्रश्न पॉप-अप होते हैं, तो मैं "हां" कैसे मजबूर करूं? मैंने उपयोग करने की कोशिश की yes yes | git clone ..., लेकिन यह काम नहीं करता है।

संपादित करें: यहां एक समाधान है: क्या मैं स्वचालित रूप से ज्ञात_होस्ट में एक नया होस्ट जोड़ सकता हूं? (जोड़ता है ssh-keyscan के साथ ज्ञात_होस्ट्स में प्रवेश करता है)।


108
2017-11-09 09:04


मूल


यह देखने में दिलचस्प है कि दो साल बाद भी इस प्रश्न का उचित उत्तर नहीं है। ऐसे कुछ अन्य मामले हैं जहां गिट संकेत मिलेगा, उदाहरण के लिए यदि आप http पर क्लोन करने का प्रयास करते हैं और सर्वर basic_auth मांग रहा है। गैर-इंटरैक्टिस मोड में यह कैसे करें? - sorin
जोड़ना -q विकल्प (शांत) यह मेरे लिए किया था। अब मैं पासफ्रेज स्वचालित कर रहा हूँ।


जवाब:


मुझे नहीं लगता कि यह सबसे अच्छा समाधान है, लेकिन यह मेरे लिए एक समाधान था।

उत्तर:

डोमेन नाम जोड़ना known_hosts का उपयोग कर फ़ाइल ssh-keyscan आदेश ने इस मुद्दे को हल किया:

ssh-keyscan <enter_domainname_e.g._github.com> >> ~/.ssh/known_hosts


92
2017-11-02 04:13



कृपया इस तरह से मत करो। यह पूरी तरह से सुरक्षित नहीं है: फिंगरप्रिंट आपको परेशान करने के लिए यहां नहीं हैं लेकिन यह सुनिश्चित करने के लिए कि आप एक मध्यम-बीच-मध्य हमले का सामना नहीं कर रहे हैं। कृपया नीचे मेरा जवाब देखें। - autra
जैसा कि मैंने कहा, "मुझे नहीं लगता कि यह सबसे अच्छा समाधान है, लेकिन मेरे लिए एक समाधान था।" क्योंकि मैं भीड़ में था, निश्चित रूप से ऐसा करने के "policataly सही तरीका" है ((: - kroe
यह राजनीतिक रूप से सही का सवाल नहीं है :-) यह सवाल है कि यह सुरक्षित है या नहीं। आपका समाधान सुरक्षित है अगर केवल तभी आप अपने फिंगरप्रिंट को मैन्युअल रूप से जांच लें ssh-keyscan और इसे जोड़ने से पहले .ssh/known_hosts एक ही जीथूब ने अपनी वेबसाइट पर प्रकाशित होने के समान ही होना चाहिए। आप इसे कई तरीकों से कर सकते हैं, और मेरा उनमें से एक है। आप अपनी स्क्रिप्ट में एक समान जांच भी कर सकते हैं, लेकिन अंत में यह सब इस बात पर आता है: आपको यह जानने के लिए अपनी स्क्रिप्ट चाहिए कि कौन सा फिंगरप्रिंट इसकी अपेक्षा करता है, और यदि आपको सही नहीं मिलता है तो आपको असफल होने की आवश्यकता है। - autra
केवल कुंजी जोड़ने के लिए यदि यह अस्तित्व में नहीं है ssh-keygen -F github.com || ssh-keyscan github.com >>~/.ssh/known_hosts - transang
कॉन्फ़िगरेशन प्रबंधन या प्रावधान चलाने के हिस्से के रूप में इसे एक बार करना ठीक होना चाहिए। अगर फिंगरप्रिंट भविष्य में कभी भी बदलता है, तो एसएसएच इरादे के रूप में काम करेगा और आपको सतर्क करेगा कि प्रमाण बदल गया है, एक गैर 0 निकास कोड लौटा रहा है। यह किसी भी स्क्रिप्ट को रोकने की संभावना है जहां आप एसएसएच या गिट का उपयोग कर रहे हैं। - emhohensee


न तो "StrictHostKeyChecking no" और न ही "ssh-keyscan" विकल्प सुरक्षित हैं। आप जरुरत यदि आप एसएसएच के साथ चिपकते हैं तो एमआईटीएम हमले से बचने के लिए किसी बिंदु पर मैन्युअल फिंगरप्रिंट सत्यापन।

दरअसल, आपके पास 2 विकल्प हैं:

गिट के बजाय https प्रोटोकॉल का प्रयोग करें

यह आपको एक फिंगरप्रिंट के लिए नहीं पूछेगा, क्योंकि एसएसएच शामिल नहीं है, इसके बजाय https का उपयोग किया जाता है। एक सुरक्षा दृष्टिकोण के लिए आप अपने ओएस पर रूट प्रमाण पत्र इंस्टॉलो पर भरोसा कर रहे हैं। यदि आप कम से कम छवि या डॉकर का उपयोग कर रहे हैं, तो आपको सीए-प्रमाणपत्र पैकेज स्थापित करने की आवश्यकता हो सकती है।

यदि आप वास्तव में गिट + एसएसएच प्रोटोकॉल चाहते हैं

क्या आपको वास्तव में रनटाइम पर कुंजी जोड़ने की ज़रूरत है? यह सुरक्षित नहीं है क्योंकि आपने फिंगरप्रिंट की जांच नहीं की है और यह आपको एमआईटीएम हमलों के लिए खोल देता है। यह सिर्फ सैद्धांतिक नहीं है, और यह काम करने के लिए साबित हुआ है।

अपनी स्क्रिप्ट चलाने से पहले, github (अपनी स्थानीय मशीन पर) से कुंजी प्राप्त करें:

ssh-keyscan github.com >> githubKey

फिंगरप्रिंट जेनरेट करें:

ssh-keygen -lf githubKey

और इसे जांचें मैन्युअल रूप से सूचीबद्ध लोगों के खिलाफ इस पृष्ठ में (ठीक है, आप मूल github वेबसाइट लाने के लिए https प्रमाणपत्र और ओपनएसएसएल पर भरोसा करते हैं, लेकिन यह अभी भी सार्वजनिक कुंजी को अंधाधुंध स्वीकार करने से कहीं बेहतर है)।

फिर, आप इसे अपनी स्क्रिप्ट में जोड़कर इसे हार्कोड करते हैं:

echo '<copy paste the content of 'cat githubKey' on your machine>'  >> ~/.ssh/known_hosts

गिट क्लोन से पहले।

गिटहब सार्वजनिक कुंजी केवल तभी बदल जाएगी जब उनका मानना ​​है कि यह समझौता किया गया था (या पर्याप्त सुरक्षित नहीं है)। यदि यह हमेशा मामला है, तो आप चाहते हैं वैसे भी आपकी स्क्रिप्ट विफल हो।


80
2018-06-25 15:39



इस सवाल का एकमात्र सही और सुरक्षित जवाब है। यह आखिरी क्यों है? मैं मानवता से शर्मिंदा हूं ;-( - Jan Warchoł
दुर्भाग्यवश, यदि आप दो कारक औथ का उपयोग करते हैं, तो आप गिटहब के साथ गैर-इंटरैक्टिव HTTPS नहीं कर सकते हैं। - Brett Widmeier
मैं नहीं देखता क्यों नहीं। हम यहां एक सार्वजनिक रेपो के बारे में बात कर रहे हैं, प्रमाणीकरण की कोई आवश्यकता नहीं है। एक स्क्रिप्ट से एक निजी रेपो क्लोनिंग एक और बात पूरी तरह से है: आपको ऐसा करने के लिए अपनी स्क्रिप्ट को अधिकृत करने की आवश्यकता है। - autra
आधुनिक खोजकर्ताओं में "खोज बार" की सहायता से (मैन्युअल रूप से "फिंगरप्रिंट को मैन्युअल रूप से जांचना कम दर्दनाक है (जैसे कि क्रोम)। - Franklin Yu


मेरा मानना ​​है कि यहां एक बेहतर विकल्प बैक अप और खाली करना है ~/.ssh/known_hosts फ़ाइल, मैन्युअल रूप से एसएसएच कनेक्शन निष्पादित करें, आईपी पता और फिंगरप्रिंट की पुष्टि करें, mv ~/.ssh/known_hosts ~/bitbucket_hosts, फिर की सामग्री का उपयोग करें ~/bitbucket_hostsज्ञात फिंगरप्रिंट को ज्ञात_होस्ट फ़ाइल में स्वचालित रूप से संलग्न करने के लिए अपनी स्क्रिप्ट में (मूल को पुनर्स्थापित करना न भूलें ~/.ssh/known_hosts)।

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


7
2018-04-07 18:53





जबकि मैं निश्चित रूप से समझता हूं कि आप ऐसी प्रक्रिया को स्वचालित करना चाहते हैं, ऐसा करने से बीमार सलाह दी जाएगी। एक सुरक्षित प्रोटोकॉल का उपयोग करते समय एसएसएच और संबंधित नेटवर्किंग सबकंपोनेंट्स बाल्क का कारण यह है कि एक मानव की चेतावनी है कि एक सिस्टम की सार्वजनिक कुंजी अज्ञात है। यह जानबूझकर है - उपयोगकर्ता को मेजबान की अपेक्षा की जाने वाली प्रणाली को स्पष्ट रूप से सूचित करने की आवश्यकता है। आप एसएसएच या टीएलएस / एसएसएल में सुरक्षा के हिस्से को प्रस्तुत करने या सुरक्षा के हिस्से को स्वचालित रूप से स्वीकार नहीं करना चाहते हैं। एक उदाहरण एक मैन-इन-द-बीच हमले के माध्यम से होता है जैसे कि जब प्रॉक्सी सॉफ़्टवेयर आपके द्वारा अपेक्षित मेजबान की जगह में अपनी कुंजी प्रस्तुत करता है।

सावधानी के साथ आगे बढ़ें।

यदि आपको तार के कोड के स्रोत के बारे में कोई डर नहीं है, तो क्लोनिंग के दौरान आपको स्पष्ट रूप से और विशेष रूप से गिट: // प्रोटोकॉल का उपयोग करना चाहिए - यह प्रमाणीकरण रहित और स्पष्ट पाठ में है।


6
2018-01-22 22:34



मैं निश्चित रूप से उपयोग मामलों को देख सकता हूं जहां हमें गैर-इंटरैक्टिव उपयोगों को लागू करने की आवश्यकता है git clone... और इसका मतलब यह नहीं है कि हमें किसी भी चेक (विशेष रूप से फिंगरप्रिंट) स्वीकार करने की आवश्यकता है। मेरे मामले में, मैं इस तरह की चीज पर स्वचालित रूप से विफल होने के लिए पूरी तरह से खुश हूं। - vaab


जैसा कि जेफ हॉल ने कहा, ऐसा करना खतरनाक है क्योंकि यह ज्ञात मानव-इन-द-बीच हमलों की अनुमति देता है। हालांकि, आप इसका उपयोग कर सकते हैं StrictHostKeyChecking no होस्ट कुंजी की जांच अक्षम करने के लिए ssh में विकल्प। हालांकि, अगर मैं आप थे तो मैं उस विकल्प से बहुत सावधान रहूंगा।


5
2018-02-03 07:45



यह मनुष्यों के बीच में सही भी अनुमति देता है? - autra


कुंजी जोड़ना .ssh/known_hosts ऐसा करने के लिए सही काम प्रतीत होता है।

यद्यपि जब आप कार्य को स्वचालित करते हैं तो आप यह सुनिश्चित करना चाहते हैं कि कुंजी पहले से ही निहित नहीं है और प्रत्येक पर जोड़ा गया है clone/pull कार्य।

यह स्निपेट केवल फिंगरप्रिंट जोड़ देगा यदि पहले से नहीं मिला है:

if [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ]; then ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts 2>/dev/null; fi

4
2018-02-16 10:42



यह सही था। आसानी से एक तैनाती स्क्रिप्ट में रखा जा सकता है और होस्ट सत्यापन अक्षम करने से सुरक्षित है। गीथूब के लिए यहां एक लाइनर है: if [ ! -n "$(grep "^github.com " ~/.ssh/known_hosts)" ]; then ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null; fi; ssh-agent bash -c "ssh-add /path/to/your/deploy/id_rsa; git clone -b master git@github.com:githubAccount/githubRepo.git /your/target/dir - tweak2
यह तब काम नहीं करता है HashKnownHosts में सक्षम है / Etc / ssh / ssh_config (या ~ / .Ssh / config)। के बजाय [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ] इसका उपयोग करना बेहतर होगा [ ! "$(ssh-keygen -F bitbucket.org)" ], जो दोनों में धोया और गैर-धोया लाइनों को पाता है known_hosts। - Claus Conrad