लिनक्स ssh: उपयोगकर्ता को निजी कुंजी को पढ़ने के अधिकार दिए बिना सार्वजनिक कुंजी प्रमाणीकरण की अनुमति दें


14

मेरे लिनक्स सर्वर पर लॉग इन किए गए उपयोगकर्ता डिफ़ॉल्ट खाते के साथ एक विशिष्ट रिमोट मशीन पर ssh कर सकते हैं। रिमोट मशीन पर प्रमाणीकरण सार्वजनिक कुंजी का उपयोग करता है, इसलिए सर्वर पर संबंधित निजी कुंजी उपलब्ध है।

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

मैं उपयोगकर्ताओं को निजी कुंजी तक पहुंच दिए बिना उन्हें ssh कनेक्शन खोलने की अनुमति कैसे दे सकता हूं?

मेरे विचार अब तक: जाहिर है कि ssh निष्पादन योग्य निजी कुंजी को पढ़ने में सक्षम होना चाहिए, इसलिए इसे सर्वर पर किसी अन्य उपयोगकर्ता के तहत चलना चाहिए, जिनके पास यह अधिकार है। एक बार ssh कनेक्शन स्थापित हो जाने के बाद, मैं इसे उपयोगकर्ता को "फॉरवर्ड" कर सकता हूं ताकि वह कमांड में प्रवेश कर सके और रिमोट मशीन के साथ इंटरैक्ट कर सके।

  • क्या यह एक अच्छा तरीका है?
  • मुझे आगे कैसे लागू करना चाहिए?
  • उपयोगकर्ता कनेक्शन कैसे शुरू कर सकता है (अर्थात, उपयोगकर्ता द्वारा ssh का निष्पादन जिसने कुंजी पर अधिकार पढ़ा है)?
  • क्या कोई सुरक्षा खामी है? - अगर उपयोगकर्ता किसी अन्य उपयोगकर्ता के रूप में एक ssh निष्पादित कर सकते हैं, तो क्या वे वह सब कुछ कर सकते हैं जो अन्य उपयोगकर्ता कर सकते हैं (निजी कुंजी को पढ़ने सहित)?


1
केवल अपने सर्वर के IP से उस कुंजी के साथ कनेक्शन स्वीकार करने के लिए दूरस्थ सर्वर को कॉन्फ़िगर करें? इस तरह भले ही वे चाबी चुरा लें लेकिन वे कुछ नहीं कर सकते।

@ AndréDaniel अच्छी तरह से शायद वे दूसरे में प्रवेश कर सकते हैं, पूरी तरह से असंबंधित कंप्यूटर जो सर्वर से पासवर्ड रहित लॉगिन स्वीकार करने के लिए भी कॉन्फ़िगर किया गया है। यही कारण है कि मैं इस तरह से एक सेटअप के बारे में सोच सकता हूं; अगर ऐसा नहीं है, तो मैं बल्कि उत्सुक हूं कि यह क्या है। (ऐसा नहीं है कि यह वास्तव में मायने रखता है।)
डेविड जेड

@DavidZ मुझे वास्तव में समझ नहीं आया ... कुंजी पर कहीं भी भरोसा नहीं किया जाना चाहिए, लेकिन लक्ष्य सर्वर पर यह माना जाता है कि आईपी पहले सर्वर में से एक से मेल खाता है (जहां उपयोगकर्ता कनेक्ट होते हैं)।

2
यदि आपको इसे इस तरह से लॉक करने की आवश्यकता है, तो मुझे लगता है कि आपने उपयोगकर्ताओं को ~/.ssh/authorized_keysफ़ाइल में नई सार्वजनिक कुंजी जोड़ने से रोकने के लिए उपाय किए हैं ?
mpontillo

जवाबों:


31

यही एक कारण sudoहै। केवल अपने उपयोगकर्ताओं को केवल पूर्व-अधिकृत कमांड-लाइन विकल्पों के साथ 1 एकल कमांड चलाने की अनुमति दें और सबसे स्पष्ट परिधि हल की गई हैं। जैसे

#/etc/sudoers
%users ALL = (some_uid) NOPASSWD: /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

समूह के sudoसभी सदस्यों को सेट usersssh कमांड चला सकते हैं जब उपयोगकर्ता अपने पासवर्ड (या some_uid खाते के) दर्ज किए बिना कुछ_uid चलाते हैं:

sudo -u some_uid /usr/bin/ssh -i /home/some_uid/.ssh/remote-host.key username@remotehost

NOPASSWD:रिमोट-होस्ट में लॉग इन करने से पहले उपयोगकर्ता अपने स्वयं के पासवर्ड दर्ज करने के लिए बाध्य करने का विकल्प निकालें ।
संभवतः अपने उपयोगकर्ताओं के लिए एक सुविधा के रूप में एक उपनाम या आवरण स्क्रिप्ट सेट करें क्योंकि sudoसही तर्कों का उपयोग करने के बारे में काफी उपयुक्त है।


एक जादू की तरह काम करता है। यह wenzul द्वारा उल्लिखित डुप्लिकेट के लिए अनुशंसित उत्तर भी होना चाहिए।
फिलिप

10

यह होस्ट-आधारित प्रमाणीकरण के लिए एक अच्छा उपयोग मामला जैसा लगता है। यह प्रमाणन का एक तरीका है, जहां SSH एक व्यक्ति का उपयोग नहीं करता है उपयोगकर्ता के स्थानीय मशीन पर कुंजी (इस मामले में, अपने सर्वर) को प्रमाणित करने के लिए; इसके बजाय, यह मेजबान की निजी कुंजी का उपयोग करता है , जो इसमें संग्रहीत है /etc/ssh/और जो केवल पढ़ने योग्य है root

इसे सेट करने के लिए, आपको .shostsदूरस्थ मशीन पर एक फ़ाइल बनाने की आवश्यकता होगी , जिस उपयोगकर्ता के होम डायरेक्टरी में आप चाहते हैं कि लोग (जैसे नहीं ~/.ssh) लॉग इन करें । फ़ाइल में सामग्री होनी चाहिए

server-hostname +

server-hostnameआपके सर्वर का नाम कहां है, और +एक शाब्दिक प्लस संकेत है जो वाइल्डकार्ड अर्थ "किसी भी उपयोगकर्ता" के रूप में कार्य करता है।

आप यह भी सुनिश्चित करने के लिए रिमोट मशीन सर्वर का होस्ट कुंजी, जिसका अर्थ है सर्वर का होस्ट कुंजी सूचीबद्ध किए जाने की आवश्यकता पुष्टि कर सकते हैं की आवश्यकता होगी में या तो /etc/ssh/ssh_known_hostsया ~/.ssh/known_hostsदूरस्थ मशीन पर। यदि यह पहले से ही मामला नहीं है, तो आप इसे रिमोट मशीन में लॉग इन करके और चलाकर सेट कर सकते हैं

ssh-keyscan server-hostname >> /etc/ssh/ssh_known/hosts

एक बार जब आप इन चरणों को सेट कर लेते हैं, तो आप सर्वर पर निजी कुंजी को पूरी तरह से हटा सकते हैं, अगर आपको किसी और चीज की आवश्यकता नहीं है। (और यदि आप करते हैं, तो आप इसे केवल rootया कुछ और पढ़ने के लिए सेट कर सकते हैं ।)

आप कुछ उपयोगकर्ताओं को रिमोट मशीन तक पहुंच की अनुमति देने या अस्वीकार करने जैसे काम भी आसानी से कर सकते हैं। मैन ऑफ द पृष्ठ देखें sshऔर hosts.equivजानकारी के लिए।

इस सेटअप के साथ एक समस्या यह है कि जो उपयोगकर्ता रिमोट मशीन में लॉग इन करते हैं वे संशोधित कर सकते हैं .shosts। ऐसा कुछ भी नहीं है जो उन्हें दूरस्थ मशीन में एक अलग उपयोगकर्ता के रूप में लॉग इन करने की अनुमति देगा, लेकिन वे रिमोट मशीन पर अपनी या दूसरों की पहुंच को काट सकते हैं। यदि यह एक चिंता का विषय है, तो आप .shostsकेवल rootया कुछ और करने में सक्षम हो सकते हैं - मुझे यकीन नहीं है कि यह काम करता है, लेकिन आप इसे आज़मा सकते हैं और देख सकते हैं। (अन्य तरीके जैसे कि एक sudoही जोखिम के लिए अतिसंवेदनशील होते हैं, क्योंकि एक उपयोगकर्ता हमेशा हटा सकता है ~/.ssh/authorized_keys।)


+1; मुझे लगता है कि यह विकल्प अच्छा लचीलापन प्रदान करता है, अगर उपयोगकर्ता को टर्मिनल के अलावा अन्य एसएसएच सुविधाओं का उपयोग करने की आवश्यकता होती है, जैसे पोर्ट अग्रेषण, सुरक्षित प्रतिलिपि, आदि। यहां तक ​​कि एक वैकल्पिक एसएसएच क्लाइंट को काम करना चाहिए। यह sudoविकल्प लॉक-डाउन परिवेश के लिए बेहतर हो सकता है, हालांकि ...
MPontillo
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.