SSH के साथ पासवर्ड रहित खातों के लिए एक सुसंगत और सुरक्षित दृष्टिकोण


13

मुझे यह स्वीकार करना चाहिए कि मुझे कुछ मामलों में पासवर्ड के बिना सर्वर पसंद हैं। एक विशिष्ट सर्वर उन लोगों के लिए असुरक्षित है जिनके पास इसकी भौतिक पहुंच है। इसलिए कुछ मामलों में इसे शारीरिक रूप से बंद करना व्यावहारिक है और तब से किसी भी भौतिक पहुंच पर भरोसा करें ।

मूल अवधारणा

सिद्धांत रूप में, जब मैं शारीरिक रूप से इस तरह के सर्वर तक पहुंचता हूं, तो मुझे बिना rootलॉगिन के ही टाइप करके पासवर्ड के बिना प्रशासन कार्य करने में सक्षम होना चाहिए और मुझसे पासवर्ड नहीं पूछा जाना चाहिए। वही उपयोगकर्ता खातों पर लागू हो सकता है, लेकिन वास्तव में उन्हें भौतिक रूप से एक्सेस नहीं किया जाएगा। इसलिए (कभी-कभी) स्थानीय पहुंच के लिए किसी सिस्टम पासवर्ड की आवश्यकता नहीं होती है।

सर्वर को दूरस्थ रूप से एक्सेस करते समय, प्रशासन के लिए, या उपयोगकर्ता खाते के लिए, मैं हमेशा SSH निजी कुंजी का उपयोग करने की अपेक्षा करता हूं। बस बनाए गए खाते के लिए SSH कुंजी सेट करना बहुत आसान है और इस प्रकार (नियमित) रिमोट एक्सेस के लिए किसी सिस्टम पासवर्ड की आवश्यकता नहीं होती है।

# user=...
# 
# useradd -m "$user"
# sudo -i -u "$user"

$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"

निष्कर्ष यह है कि, सिद्धांत रूप में, हम इस तरह के मामलों के उपयोग के लिए किसी भी सिस्टम पासवर्ड को कम नहीं करेंगे। तो सवाल यह है कि, हम सिस्टम और उपयोगकर्ता खातों को एक सुसंगत और सुरक्षित तरीके से कैसे कॉन्फ़िगर करते हैं।

स्थानीय पहुँच विवरण

हम यह सुनिश्चित कैसे कर सकते हैं कि रूट खाते को बिना पासवर्ड के स्थानीय रूप से एक्सेस किया जा सकता है? मुझे नहीं लगता कि हम का उपयोग कर सकते हैं passwd -dकि के रूप में रूट पहुँच भी अनुमोदक कर देगा और एक unpriviliged उपयोगकर्ता सकता स्विच मुक्त है, जो गलत है के लिए रूट करने के लिए। हम इसका उपयोग नहीं कर सकते passwd -lक्योंकि यह हमें लॉग इन करने से रोकता है।

ध्यान दें कि स्थानीय पहुंच विशेष रूप से स्थानीय कीबोर्ड का उपयोग करने के बारे में है। इसलिए एक वैध समाधान किसी भी उपयोगकर्ता को स्विच करने की अनुमति नहीं देना चाहिए (चाहे उपयोग कर रहा हो suया नहीं sudo)।

रिमोट एक्सेस विवरण

कुछ समय पहले तक उपरोक्त समाधान काम करेगा, लेकिन अब SSH ने लॉक किए गए उपयोगकर्ता खातों की जांच शुरू कर दी है। हम शायद passwd -dउन्हीं कारणों से उपयोग नहीं कर सकते । हम इसका उपयोग नहीं कर सकते passwd -uक्योंकि यह शिकायत करता है कि यह क्या passwd -dकरता है।

इस भाग के लिए डमी पासवर्ड के साथ वर्कअराउंड है।

user=...

echo -ne "$user:`pwgen 16`\n" | chpasswd

यह भी हो सकता है कि SSH में लॉक अकाउंट चेकिंग को पूरी तरह से बंद कर दिया जाए, लेकिन यह लॉक किए गए खातों के समर्थन को बनाए रखने के लिए अच्छा होगा और सिर्फ उन्हें अनलॉक करने में सक्षम होगा।

अंतिम नोट्स

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

एक स्वीकृत और सम्मानित जवाब व्यक्तिगत टूल के विस्तृत कॉन्फ़िगरेशन का वर्णन कर सकता है या नहीं कर सकता है लेकिन इसमें वर्णित लक्ष्यों तक पहुंचने के लिए प्रमुख बिंदु होने चाहिए। ध्यान दें कि यह शायद जैसे उपकरणों के पारंपरिक उपयोग के माध्यम से हल नहीं किया जा सकता है passwd, ssh, su, sudoऔर पसंद है।

पहले उत्तरों को पढ़ने के बाद अधिक विचार

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


पासवर्ड के बिना स्थानीय पहुंच के लिए एक अनुकूलित PAM कॉन्फ़िगरेशन का उपयोग करें और sudo और SSH लॉगऑन के लिए भी ऐसा ही करें।
0xC0000022L

जवाबों:


5

आवश्यकताएं जिसके लिए मैं बुलेट पॉइंट के रूप में समाधान प्रस्तुत करूंगा:

  1. पासवर्ड रहित रूट कंसोल लॉगिन
  2. पूर्व-अधिकृत उपयोगकर्ताओं से पासवर्ड रहित रूट रिमोट लॉगिन
  3. पूर्व-अधिकृत उपयोगकर्ताओं से निर्दिष्ट खातों के लिए पासवर्ड रहित दूरस्थ लॉगिन
  4. पूर्व-अधिकृत उपयोगकर्ताओं से किसी भी खाते के लिए पासवर्ड रहित दूरस्थ लॉगिन

निम्नलिखित उदाहरण डेबियन पर आधारित हैं, क्योंकि यही वह है जो मुझे यहां परीक्षण के लिए मिला है। हालाँकि, मुझे कोई कारण नहीं दिखता कि सिद्धांतों को किसी भी वितरण पर लागू नहीं किया जा सकता है (या वास्तव में कोई PAM- आधारित * ix व्युत्पन्न)।

पासवर्ड रहित रूट कंसोल लॉगिन

मुझे लगता है कि जिस तरह से मैं दृष्टिकोण करूंगा वह PAM और /etc/securettyकॉन्फ़िगरेशन फ़ाइल का लाभ उठाने के लिए होगा ।

पूर्व-आवश्यकता के रूप में, "पर्याप्त रूप से सुरक्षित" रूट पासवर्ड सेट किया जाना चाहिए। यह कंसोल लॉग इन के लिए आवश्यक नहीं है, लेकिन अवास्तविक को क्रैक करने के लिए क्रूर बल बनाने के लिए मौजूद है। खाता अन्यथा एक सामान्य रूट खाता है।

में /etc/pam.d/loginमैं प्रमाणीकरण के लिए लाइनें (उन कीवर्ड के साथ शुरुआत की निम्न मानक सेट है auth):

auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so

@include common-auth
auth       optional   pam_group.so

संदर्भित common-authफ़ाइल में निम्नलिखित प्रासंगिक लाइनें शामिल हैं:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
auth    optional                        pam_cap.so

common-authफ़ाइल का निर्देश पीएएम एक नियम (इनकार) अगर एक "यूनिक्स लॉगिन" सफल होता है छोड़ने के लिए। आमतौर पर इसका मतलब होता है मैच /etc/shadow

auth ... pam_securetty.soलाइन tty उपकरणों में निर्दिष्ट स्थान पर छोड़कर जड़ लॉगिन को रोकने के लिए कॉन्फ़िगर किया गया है /etc/securetty। (इस फ़ाइल में पहले से ही सभी कंसोल डिवाइस शामिल हैं।)

इस authपंक्ति को थोड़ा संशोधित करके एक नियम को परिभाषित करना संभव है जो किसी निर्दिष्ट पासवर्ड से रूट लॉगिन की अनुमति देता है, जिसमें निर्दिष्ट tty डिवाइस है /etc/securettysuccess=okपैरामीटर कि इतने में संशोधन किए जाने की आवश्यकता okकी संख्या से बदल दिया जाता है authलाइनों एक सफल मैच की स्थिति में छोड़ी जाने वाली। यहां दिखाई गई स्थिति में, वह संख्या है 3, जो auth ... pam_permit.soलाइन से नीचे कूदती है :

auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

पूर्व-अधिकृत उपयोगकर्ताओं से पासवर्ड रहित रूट रिमोट लॉगिन

यह उन अधिकृत उपयोगकर्ताओं के लिए ssh कीज़ का सीधा समावेश है जो रूट authorized_keysफ़ाइल में जोड़े जा रहे हैं ।

पूर्व-अधिकृत उपयोगकर्ताओं से निर्दिष्ट खातों के लिए पासवर्ड रहित दूरस्थ लॉगिन

यह उचित और संबंधित उपयोगकर्ता की .ssh/authorized_keysफ़ाइल में जोड़े जा रहे अधिकृत उपयोगकर्ताओं के लिए ssh कुंजियों का एक सीधा समावेश भी है । (विशिष्ट दूरस्थ उपयोगकर्ता क्रिस स्थानीय उपयोगकर्ता क्रिस परिदृश्य के लिए पासवर्ड रहित लॉगिन चाहता है।)

ध्यान दें कि खाते निर्माण के बाद डिफ़ॉल्ट लॉक अवस्था में रह सकते हैं (यानी सिर्फ !पासवर्ड के लिए फ़ील्ड में /etc/shadow) लेकिन SSH कुंजी आधारित लॉगिन की अनुमति दें। नए उपयोगकर्ता की .ssh/authorized_keysफ़ाइल में कुंजी को रखने के लिए इसके लिए रूट की आवश्यकता होती है । जो स्पष्ट नहीं है वह यह है कि यह दृष्टिकोण केवल तभी उपलब्ध होता UsePAM Yesहै जब इसमें सेट किया गया हो /etc/ssh/sshd_config। पीएएम !"पासवर्ड के लिए लॉक किया गया खाता" के रूप में भिन्न होता है लेकिन अन्य एक्सेस विधियों की अनुमति दी जा सकती है "और !..." लॉक किया गया अवधि। " (यदि UsePAM Noसेट किया गया है, तो ओपनएसएसएच !एक बंद खाते का प्रतिनिधित्व करने के लिए पासवर्ड फ़ील्ड शुरू करने की किसी भी उपस्थिति पर विचार करता है।)

पूर्व-अधिकृत उपयोगकर्ताओं से किसी भी खाते के लिए पासवर्ड रहित दूरस्थ लॉगिन

यह मेरे लिए पूरी तरह से स्पष्ट नहीं था कि आप यह सुविधा चाहते हैं या नहीं। अर्थात्, कुछ अधिकृत उपयोगकर्ता किसी भी हर स्थानीय खाते में पासवर्ड के बिना लॉगिन ssh कर सकेंगे।

मैं इस परिदृश्य का परीक्षण नहीं कर सकता, लेकिन मेरा मानना ​​है कि यह ओपनएसएसएच 5.9 या नए के साथ प्राप्त किया जा सकता है, जो कई authorized_keysफाइलों को परिभाषित करने की अनुमति देता है /etc/ssh/sshd_config। दूसरी फ़ाइल को शामिल करने के लिए कॉन्फ़िगरेशन फ़ाइल को संपादित करें /etc/ssh/authorized_keys। इस फ़ाइल में अपने चयनित अधिकृत उपयोगकर्ताओं की सार्वजनिक कुंजियाँ जोड़ें, यह सुनिश्चित करना अनुमतियाँ ऐसी हैं कि यह रूट के स्वामित्व में है और केवल रूट (0644) द्वारा लिखता है।


मुझे # 1 और ध्यान से जांच और परीक्षण करना होगा। यह बहुत दिलचस्प लग रहा है, भले ही इसके लिए अभी भी एक (मजबूत) पासवर्ड कॉन्फ़िगर होना चाहिए। # 3 पूर्ण नहीं है क्योंकि आजकल एक नया बनाया गया उपयोगकर्ता डिफ़ॉल्ट रूप से SSH लॉगिन से भी लॉक है। मैंने वास्तव में बिंदु # 4 के लिए नहीं पूछा, लेकिन यह वैसे भी बहुत दिलचस्प लगता है और मेरे पास इस तरह की विधि का उपयोग हो सकता है, वास्तव में।
पावेल Paमरदा

रूट के लिए मजबूत पासवर्ड की आवश्यकता है, लेकिन इसका उपयोग कभी नहीं किया जाता है। मुझे लगा कि आप जानते हैं कि # 3 को कैसे लागू किया जाए; यदि आपको अधिक विवरण की आवश्यकता हो तो मुझे बताएं। ऑन (डेबियन) सिस्टम पर एक नए खाते में ssh संभव है जिसे अभी तक कोई पासवर्ड परिभाषित नहीं किया गया है, बशर्ते कि .ssh/authorized_keysफाइल में संबंधित सार्वजनिक कुंजी हो। क्या यह मदद करता है?
रोइमा

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

अपने पिछले कमेंट में ssh स्टेटमेंट की पुष्टि करने के लिए मैंने जो टेस्ट यूजर अकाउंट बनाया है, उसके लिए मुझे !पासवर्ड फील्ड में सिंगल दिखाई देता है /etc/shadow। मैन पेज के अनुसार यह एक वैध खाते को इंगित करता है जिसके लिए कोई भी पासवर्ड मेल नहीं खा सकता है।
रोइमा

1
यह दिलचस्प है, यह वास्तव में कम से कम इतना स्पष्ट नहीं है , धन्यवाद।
पावेल Paमेरदा

1

ऐसा लगता है कि आप वास्तविक (गैर-रूट) उपयोगकर्ता खाते को ssh कीज़ और पूर्ण NOPASSWDपहुँच के साथ चाहते हैं sudo(जो इन दिनों अधिकांश लिनक्स डिस्ट्रो में डिफ़ॉल्ट रूप से उपलब्ध है और मैन्युअल रूप से इंस्टॉल करने के लिए भी तुच्छ है)। आपके पास प्रत्येक उपयोगकर्ता खाते के लिए खाली पासवर्ड हो सकता है (जो दूरस्थ रूप से काम नहीं करेगा), फिर उपयोगकर्ता या तो चलता है sudo -sया उपयोगकर्ता के पास ~/.bash_profileकेवल वह कमांड होता है।

sudo

प्रत्येक उपयोगकर्ता को sudoUNIX समूह में जोड़ें (जैसे usermod -a -G sudo USERNAME, हालांकि पुराने सिस्टम में ऐसा करने के कम सहज तरीके होंगे; सबसे खराब स्थिति, आप /etc/groupsसीधे संपादित करते हैं)।

में /etc/sudoersया /etc/sudoers.d/localआप इस तरह की एक पंक्ति हैं:

%sudo    ALL=(ALL:ALL) NOPASSWD: ALL

यदि आप स्वचालित रूट एक्सेस चाहते हैं, तो इसे उपयोगकर्ता की प्रोफ़ाइल में जोड़ें। इसके लिए bash, यह होगा ~/.bash_profile:

sudo -s

इससे आपको यह देखने के लिए जो में लॉग ऑन है (कोशिश की अनुमति देगा whoया last) और में लॉग छोड़ देंगे /var/log/auth.log

पासवर्ड रहित लॉगिन

बहुत पुराने सिस्टम पर, आप बस /etc/passwd(या थोड़े पुराने सिस्टम पर /etc/shadow) एडिट कर सकते हैं और हैश को हटा सकते हैं, इसलिए जैसे bob:$1$salt$hash:12345:0:99999:7:::बस हो जाता है bob::12345:0:99999:7:::। यह आप सभी की जरूरत थी। आधुनिक प्रणालियों को यह पसंद नहीं है। ऐसा करने के लिए अन्य तरीके होने की संभावना है, लेकिन जिस तरह से मैंने अभी सत्यापित किया है वह इस प्रकार है (स्रोत: लियो के रैंडम स्टफ ) :

/etc/shadowवास्तविक जानकारी के साथ खाता खोलें और देखें। इसमें डॉलर के संकेतों द्वारा सीमांकित तीन तत्व शामिल होंगे ( $)। ये हैशिंग तंत्र, फिर नमक , फिर हैश का प्रतिनिधित्व करते हैं । नमक पर ध्यान दें, फिर इसे चलाएं:

openssl passwd -1 -salt SALT

(यह एमडी 5 हैशिंग तंत्र के रूप में उपयोग करता है। यह एक खाली पासवर्ड है, इसलिए आपको कोई आपत्ति नहीं होनी चाहिए।) जब पासवर्ड के लिए कहा जाए, तो एंटर दबाएं। किसी भी अनुगामी डॉट्स सहित उस स्ट्रिंग को सहेजें, और उस उपयोगकर्ता की लाइन पर पहली कॉलन के बाद पेस्ट करें /etc/shadow(यह पहले और दूसरे कॉलोन के बीच किसी भी पूर्व-मौजूदा सामग्री को प्रतिस्थापित करना चाहिए)। (कृपया SALTअपने नमक के रूप में उपयोग न करें !)

SSH

आपका sshडेमॉन विन्यास में या तो रहता है /etc/sshd_configया /etc/ssh/sshd_config। उचित सुरक्षा के लिए, मेरी सलाह है कि इसमें ये लाइनें शामिल हैं:

PermitRootLogin no
PermitEmptyPasswords no

अतिरिक्त सुरक्षा उपायों के लिए सिक्योर सिक्योर शेल राइटअप देखें जो आप परिष्कृत हमलावरों के खिलाफ बेहतर सख्त करने के लिए अपने ssh कॉन्फ़िगरेशन में जोड़ सकते हैं।

अब आपके उपयोगकर्ता खाली पासवर्ड होने के कारण लॉग इन नहीं कर सकतेssh (यह एक आवश्यक सुरक्षा उपाय है)। इसका मतलब है कि वे केवल ssh कीज से लॉग इन कर सकते हैं।

प्रत्येक उपयोगकर्ता, उनके प्रत्येक क्लाइंट सिस्टम के लिए, एक ssh की जोड़ी बनाना चाहिए, जैसे

ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -o -a 100 -C "Bob Roberts on his laptop"

यह एक निजी कुंजी पर $HOME/.ssh/id_rsaऔर एक सार्वजनिक कुंजी का उत्पादन करता है $HOME/.ssh/id_rsa.pub। क्या उपयोगकर्ता ने आपको अपनी सार्वजनिक कुंजी भेज दी है और उन्हें इस सर्वर पर भेज दिया है $HOME/.ssh/authorized_keys(ध्यान दें कि प्रत्येक उपयोगकर्ता $HOME/.sshको मोड 700, जैसे होना चाहिए mkdir -p ~user/.ssh && chmod 700 ~user/.ssh)।

जो उपयोगकर्ता ssh कीज नहीं चाहते हैं, उन्हें फिजिकल सिस्टम पर चलाया जा सकता है। वहां, उनका खाली पासवर्ड उन्हें लॉग इन करेगा, जिस बिंदु पर वे passwdशेल से टाइप कर सकते हैं और पासवर्ड सेट कर सकते हैं, इस प्रकार उन्हें रिमोट एक्सेस की अनुमति मिलती है।

(मैंने वास्तव में इस तकनीक का उपयोग लोगों को सिस्टम के संग्रह तक पहुंच प्रदान करने के लिए किया था जब मैंने एक आईटी विभाग चलाया था। इसने उपयोगकर्ताओं को ssh कुंजियों का उपयोग करने के लिए मजबूर किया और मुझे उन्हें पासवर्ड देने की आवश्यकता नहीं थी। उनके प्रारंभिक ~/.bash_profileमें नीचे दो लाइनें थीं: passwdऔर फिर mv ~/.bash_profile.real ~/.bash_profileताकि वे पहले लॉगिन पर एक नया पासवर्ड सेट करें।)

जोखिम

आप अपने उपयोगकर्ताओं पर पूरा भरोसा रख रहे हैं। किसी भी उपयोगकर्ता को किसी अन्य उपयोगकर्ता की ~/.ssh/authorized_keysफ़ाइल के साथ खिलवाड़ करने से रोकना नहीं है और इस प्रकार अपनी पहुंच को रद्द करने और ऑडिट करने की क्षमता में बदलाव करना है, लेकिन यदि आप पूर्ण रूट एक्सेस दे रहे हैं तो यह अपरिहार्य है।

निष्कर्ष

प्रत्येक उपयोगकर्ता अब sudo समूह का सदस्य है और रूट शेल में पूर्ण पासवर्ड रहित पहुँच रखता है। इन उपयोगकर्ताओं के पास अपने खातों के लिए कोई पासवर्ड नहीं है और ssh कुंजियों का उपयोग करके दूरस्थ रूप से लॉग इन कर सकते हैं।

यदि आप अपने किसी कर्मचारी को खो देते हैं, तो आप उसका खाता निकाल सकते हैं। यदि आपके किसी कर्मचारी का लैपटॉप चोरी हो गया है, तो आप उस उपयोगकर्ता की authorized_keysफ़ाइल से उस लैपटॉप की ssh कुंजी को हटा सकते हैं । यदि आपके पास एक सुरक्षा उल्लंघन है, तो आपके पास लॉग हैं जो दिखाते हैं कि किसने लॉग इन किया है।


सुडो के बारे में यह सवाल याद आता है क्योंकि यह विशेष रूप से नए लॉगिन के बारे में था, उपयोगकर्ताओं को स्विच करने के लिए नहीं। प्रश्न को स्पष्ट करने के लिए इसमें संशोधन किया। पासवर्ड रहित लॉगिन के बारे passwd -dमें सवाल के रूप में सटीक गलत व्यवहार प्रदर्शित करता है , suपासवर्ड के बिना उस उपयोगकर्ता पर स्विच करने की अनुमति देता है। जोखिम अनुभाग दो चीजों का वर्णन करता है (अन्य उपयोगकर्ताओं के डेटा के साथ खिलवाड़ करना और रूट एक्सेस प्राप्त करना) जिसका निष्कासन प्रश्न का बहुत महत्वपूर्ण बिंदु है। इसलिए, जबकि व्यक्तिगत खंड अच्छी तरह से लिखे गए हैं, यह प्रश्न का उत्तर नहीं है।
पावेल Paमिरदा

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