मैं प्रति होस्ट पासवर्ड के साथ सुरक्षित रूप से कैसे लागू कर सकता हूं?


108

मैं मौजूदा सर्वरों के समूह को प्रबंधित करने के लिए ansible का उपयोग करना चाहूंगा । मैंने एक ansible_hostsफ़ाइल बनाई है , और -Kकेवल एक होस्ट को लक्षित करने वाले आदेशों के साथ ( विकल्प के साथ) सफलतापूर्वक परीक्षण किया है

ansible -i ansible_hosts host1 --sudo -K # + commands ...

अब मेरी समस्या यह है कि प्रत्येक होस्ट पर उपयोगकर्ता के पासवर्ड अलग-अलग हैं, लेकिन मुझे इसे एंसेबल में संभालने का तरीका नहीं मिल रहा है।

का उपयोग करते हुए -K, मुझे केवल एक ही sudo पासवर्ड के लिए प्रेरित किया जाता है, जो तब बिना किसी संकेत के सभी बाद के मेजबानों के लिए आज़माया हुआ लगता है:

host1 | ...
host2 | FAILED => Incorrect sudo password
host3 | FAILED => Incorrect sudo password
host4 | FAILED => Incorrect sudo password
host5 | FAILED => Incorrect sudo password

अब तक के शोध:

  • एक गलत उत्तर के साथ एक StackOverflow प्रश्न ("उपयोग -K") और लेखक द्वारा एक प्रतिक्रिया यह कहते हुए कि "मुझे पता है कि मुझे पासवर्ड की आवश्यकता है"

  • Ansible डॉक्स , जो कहते हैं कि " पासवर्डलेस सूडो का उपयोग चीजों को स्वचालित करने में आसान बनाता है, लेकिन इसकी आवश्यकता नहीं है ।" (जोर मेरा)

  • यह सुरक्षा StackExchange प्रश्न जो इसे पढ़ता है NOPASSWDजो आवश्यक है

  • लेख "स्केलेबल और अंडरस्टैंडिंग प्रोविजनिंग ..." जो कहता है:

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

  • लेख "बेसिक अन्सिबल प्लेबुक" , जो कहता है

    "Ansible लक्ष्य सर्वर में रूट के रूप में लॉग इन कर सकता है और sudo की आवश्यकता को टाल सकता है, या asible उपयोगकर्ता को पासवर्ड के बिना sudo देता है, लेकिन ऐसा करने का विचार या तो मेरे तिल्ली को मेरे गुलाल को छलांग लगाने और अपने विंडपाइप को ब्लॉक करने की धमकी देता है, इसलिए मैं नहीं है "

    मेरे विचार बिल्कुल, लेकिन फिर एक सर्वर से आगे कैसे बढ़ा जाए?

  • ansible issue # 1227 , "Ansible को playbook में सभी उपयोगकर्ताओं के लिए sudo पासवर्ड मांगना चाहिए", जिसे एक वर्ष पहले mpdehaan ने टिप्पणी के साथ बंद कर दिया था "इसके लिए बहुत अधिक मांग नहीं देखी गई, मुझे लगता है कि ज्यादातर लोग केवल एक से sudo है उपयोगकर्ता खाता या कुंजियों का उपयोग ज्यादातर समय करता है। "

तो ... कैसे लोग इन जैसी स्थितियों में Ansible का उपयोग कर रहे हैं? स्थापना NOPASSWDमें /etc/sudoers, मेजबान भर में पासवर्ड पुन: उपयोग या रूट SSH लॉगिन सक्षम करने सभी सुरक्षा में नहीं बल्कि कठोर कटौती लगते हैं।


2
क्या कोई कारण है कि आप SSH कुंजी का उपयोग नहीं कर रहे हैं?
त्रोंध

22
मैं पहले से ही SSH कुंजियों का उपयोग कर रहा हूं; वे प्रभावित नहीं करते sudo(जिन्हें अभी भी पासवर्ड की आवश्यकता है)।
पर्यवेक्षणांग

1
यह ठीक वैसा नहीं हो सकता है जैसा आप खोज रहे हैं, लेकिन उबंटू बक्से पर मैं अभी भी कुंजियों का उपयोग करता हूं, अर्थात सीधे रूट के रूप में प्राप्त करने के लिए अपनी सार्वजनिक कुंजी / रूट / अधिकृत_कीट्स में डाल देता हूं। स्पष्ट दोष ssh पर रूट लॉगिन की अनुमति दे रहा है ... मैं भी ssh पर पासवर्ड लॉगिन को हटा देता हूं और अतिरिक्त सुरक्षा के लिए विफलता 2ban रन करता हूं।
20

27
प्रतिक्रिया के लिए @senorsmile धन्यवाद! क्या आप इसे एक जवाब देने के बजाय मन बनायेंगे ताकि मैं आपको सवाल न पढ़ने के लिए मना कर सकूँ?
सुपरवेकुओ

4
यानीansible_ssh_password सेटिंग केवल SSH पासवर्ड के लिए लागू होता है (सुराग के नाम पर है ...)। और मैं पहले से ही कुंजी-आधारित SSH लॉगिन का उपयोग कर रहा हूं।
सुपरवेकुओ

जवाबों:


53

आपने निश्चित रूप से अपना शोध किया है ...

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

इसलिए, मैं आपके द्वारा खोजे जा रहे सटीक समाधान की पेशकश नहीं कर सकता, लेकिन आपने पूछा ...

"तो ... कैसे लोग इन जैसी स्थितियों में Ansible का उपयोग कर रहे हैं? NOPASSWD इन / etc / sudoers; मेजबान पर पासवर्ड का पुन: उपयोग करना या रूट SSH लॉगिन सक्षम करना सभी सुरक्षा में भारी कमी लगती है।"

मैं आपको उस पर एक विचार दे सकता हूं। मेरा उपयोग मामला एक वैश्विक सास फर्म का समर्थन करने वाले कई डेटा केंद्रों में 1k नोड्स है जिसमें मुझे हमारे व्यवसाय की प्रकृति के कारण कुछ पागलपनपूर्ण सुरक्षा नियंत्रणों को डिजाइन / कार्यान्वित करना है। सुरक्षा हमेशा संतुलन अधिनियम, अधिक प्रयोज्य कम सुरक्षा है, यह प्रक्रिया अलग नहीं है यदि आप 10 सर्वर या 1,000 या 100,000 चला रहे हैं।

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

एक बड़े उद्यम में, पासवर्ड के पुन: उपयोग के बारे में बात करते हैं, क्या यह उचित है कि प्रत्येक नोड पर अलग-अलग पासवर्ड के लिए sysadmins से पूछें? कुछ नोड्स के लिए, शायद, लेकिन मेरे व्यवस्थापक / इंजीनियर अगर वे 1000 नोड्स पर अलग-अलग पासवर्ड रखना चाहते थे, तो वे बगावत करेंगे। इसे लागू करना असंभव होने के साथ-साथ, प्रत्येक उपयोगकर्ता को कहीं न कहीं अपने पासवर्ड को संग्रहीत करना होगा, उम्मीद है कि एक कीपास, स्प्रेडशीट नहीं। और जब भी आप किसी ऐसे स्थान पर पासवर्ड डालते हैं, जहाँ उसे सादे पाठ में निकाला जा सकता है, तो आपने अपनी सुरक्षा को बहुत कम कर दिया है। मैं बहुत अधिक उन्हें जानता हूं, दिल से, एक या दो वास्तव में मजबूत पासवर्ड की तुलना में एक keypass फ़ाइल हर बार जब वे एक मशीन पर sudo लॉग इन या आह्वान करने की जरूरत है।

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

जब हम स्वचालित उपयोगकर्ताओं के लिए आगे बढ़ते हैं, तो ssh कीज़ आपको प्राप्त करने के लिए बहुत काम करते हैं, लेकिन आपको अभी भी sudo के माध्यम से प्राप्त करने की आवश्यकता है। आपकी पसंद स्वचालित उपयोगकर्ता के लिए एक मानकीकृत पासवर्ड है (जो कई मामलों में स्वीकार्य है) या NOPASSWD को सक्षम करने के लिए जैसा आपने बताया है। अधिकांश स्वचालित उपयोगकर्ता केवल कुछ कमांड निष्पादित करते हैं, इसलिए यह NOPASSWD को सक्षम करने के लिए काफी संभव और निश्चित रूप से वांछनीय है, लेकिन केवल पूर्व-अनुमोदित आदेशों के लिए। मेरा सुझाव है कि अपने sudoers फ़ाइल को प्रबंधित करने के लिए अपने कॉन्फ़िगरेशन प्रबंधन (इस मामले में ansible) का उपयोग करें ताकि आप पासवर्ड-कम कमांड सूची को आसानी से अपडेट कर सकें।

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

हम कठपुतली का उपयोग भी करते हैं, क्योंकि यह एक एनफोर्सिंग कॉन्फ़िगरेशन प्रबंधन उपकरण है, इसलिए सभी वातावरणों में अधिकांश परिवर्तन इसके माध्यम से बाहर हो जाएंगे।

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


धन्यवाद, @ ज़ेब - मैंने कल्पना की थी कि दर्जनों-से-हजारों सर्वर वाले उपयोगकर्ता NOPASSWDवैसे भी पवित्र कारणों के लिए उपयोग करेंगे (शायद तंग फ़ायरवॉल नियमों आदि द्वारा समर्थित ), लेकिन खतरे पर आपके उपयोग-मामले और विचारों को पढ़ना अच्छा है। आदर्श।
सुपरवुको

16
एक टिप्पणी, हालांकि, "पूर्व-अनुमोदित" sudoआदेशों को प्रतिबंधित करने के बारे में आपके सुझाव पर (जो मुझे पता चला जब मुझे पता चला कि NOPASSWDयह बहुत आवश्यक है)। दुर्भाग्य से, यह पूरी तरह से असमर्थित भी लगता है - ansible कॉल करने के बारे में कोई वादा नहीं करता है उदाहरण के लिए chown या mkdirबायनेरिज़ सीधे, और sudo /bin/shअधिकांश मॉड्यूल को काम करने में सक्षम होने की आवश्यकता होती है ।
13

मुझे लगता है कि मेरे एक इंजीनियर ने कुछ समय पहले शिकायत की थी कि मुझे गुस्सा आ रहा है।
ज़ेब

36

Ansible 1.5 पर, host_vars और अन्य चर के लिए एन्क्रिप्टेड वॉल्ट का उपयोग करना संभव है । यह आपको प्रति-होस्ट (या प्रति-समूह) ansible_sudo_passचर को सुरक्षित रूप से संग्रहीत करने में कम से कम सक्षम बनाता है । दुर्भाग्यवश, --ask-vault-passकेवल एकल वॉल्ट पासवर्ड के लिए अनसुनी इन्वोकेशन के लिए संकेत देगा, इसलिए आप अभी भी उन सभी मेजबानों के लिए सिंगल वॉल्ट पासवर्ड के लिए विवश हैं जिन्हें आप एक साथ उपयोग करेंगे।

फिर भी, कुछ उपयोगों के लिए यह कई होस्टों में एक एकल सूडो पासवर्ड होने में सुधार हो सकता है, क्योंकि आपके एन्क्रिप्टेड host_vars तक पहुंच के बिना एक हमलावर को अभी भी हर मशीन (या मशीन समूह) के लिए एक अलग sudo पासवर्ड की आवश्यकता होगी जो वह या वह हमला करता है।


3
ansible_sudo_passविकल्प भी नया लगता है - और मैं क्या के लिए पूछ रहा था करने के लिए लगता है। एक एकल वॉल्ट पासवर्ड मेरे उद्देश्यों के लिए आदर्श है, साथ ही साथ। धन्यवाद!
सुपरवुको

क्या इस पद्धति का उपयोग करके सभी को एन्क्रिप्ट करने से बचने का एक तरीका है host_vars? (एक संभावित सीमा एलेक्स
डप्यु

1
@supervacuo - सभी होस्ट संस्करणों को एन्क्रिप्ट करने से बचने के लिए, बस main.yml (unencrypted) और secret.yml (एन्क्रिप्टेड) ​​वाले होस्ट var निर्देशिका का उपयोग करें - इस डॉक्टर खंड के अंतिम भाग को देखें जहां यह "raleigh" समूह के बारे में बात करता है - समान तकनीक मेजबान संस्करण और समूह संस्करण के लिए काम करता है। मैं इसका बहुत उपयोग करता हूं, एकमात्र भिन्नता यह है कि यदि कुछ प्लेबुक के लिए केवल एक रहस्य की आवश्यकता होती है, तो इसे पूरी तरह से एक अलग पेड़ में संग्रहीत करने के लिए उपयोगी हो सकता है और इसमें एक पथ के माध्यम से शामिल हो सकता है जिसमें होस्ट या var नाम शामिल है।
रिचवेल

1
अगर मैंने तिजोरी में 'ansible_ssh_pass' मान एन्क्रिप्ट किया है, तो मुझे भी 'ansible_sudo_pass' मान को डुप्लिकेट करने की आवश्यकता है? क्या दूसरे sudo_pass मान के लिए पहला 'ssh_pass' मान को रिफाइन करने का कोई तरीका है?
पन्नाध्वज


22

Ansible 1.5 के साथ, का उपयोग करके ansible_sudo_pass चर सेट करना संभव है lookup('password', …):

ansible_sudo_pass: "{{ lookup('password', 'passwords/' + inventory_hostname) }}"

मुझे host_vars/कई कारणों से फ़ाइलों का उपयोग करने की तुलना में यह अधिक सुविधाजनक लगता है:

  • मैं वास्तव with_password: "passwords/{{ inventory_hostname}} encrypt=sha256_crypt" में तैनात दूरस्थ उपयोगकर्ता के लिए पासवर्ड को व्यवस्थित करने के लिए उपयोग करता हूं (जो तब sudo के लिए आवश्यक होता है ), इसलिए वे पहले से ही फाइलों में मौजूद हैं (हालांकि ये प्लेटेक्स्ट लुकअप फाइल में संग्रहीत नमक मूल्य खो देता है जब हैशेड मूल्य उत्पन्न होता है) ।

  • यह ansible_sudo_pass:क्रिप्टोग्राफ़िक सुरक्षा में कुछ एप्सिलॉन वृद्धि के लिए फ़ाइल में केवल पासवर्ड (कोई ज्ञात प्लेटेक्स्ट) नहीं रखता है । अधिक महत्वपूर्ण रूप से, इसका मतलब है कि आप अन्य सभी होस्ट-विशिष्ट चर को एन्क्रिप्ट नहीं कर रहे हैं, इसलिए उन्हें वॉल्ट पासवर्ड के बिना पढ़ा जा सकता है।

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

आप ansible_ssh_pass के साथ लुकअप फ़ंक्शन का उपयोग कर सकते हैं ; यह और भी नहीं है कि Ansible के पिछले संस्करणों के साथ संभव हो सकता है ansible_sudo_pass


2
मैं अंत में यह (धन्यवाद!) कोशिश करने के लिए चारों ओर हो गया, लेकिन यह नहीं देख सकता कि यह बिना कैसे काम करेगा git-crypt; जहा तक मै देख सकता हू। ऐसा लगता है कि एनसिबल के पास अभी तकlookup एक एन्क्रिप्टेड वॉल्ट पर उपयोग करने के लिए समर्थन नहीं हैpasswordमॉड्यूल डॉक्स कहना एन्क्रिप्टेड भंडारण के लिए कुछ रूप में अभी तक गैर-दस्तावेजी समर्थन है कि वहाँ है, लेकिन मैं अभी तक विवरण प्राप्त करने के लिए है। कोई सुराग?
सुपरवाचो

19

पास का उपयोग करना एक आसान तरीका है जो सूडो पासवर्ड के साथ ansible प्रदान करता है। पास प्रति फ़ाइल एक पासवर्ड संग्रहीत करता है जो गिट या अन्य तरीकों के माध्यम से पासवर्ड साझा करना आसान बनाता है। यह सुरक्षित भी है (GnuPG का उपयोग करके) और यदि आप gpg-Agent का उपयोग कर रहे हैं, तो यह आपको प्रत्येक उपयोग पर पासवर्ड डाले बिना ansible का उपयोग करने देता है।

servers/fooसर्वर के रूप में संग्रहीत पासवर्ड fooको ansible के लिए प्रदान करने के लिए , इसे इस तरह से एक इन्वेंट्री फ़ाइल में उपयोग करें:

[servers]
foo ansible_sudo=True \
    ansible_sudo_pass="{{ lookup('pipe', 'pass servers/foo') }}"

यह देखते हुए कि आपने पहले gpg-agent की कुंजी अनलॉक की थी, यह किसी भी पासवर्ड को दर्ज करने की आवश्यकता के बिना ansible चलेगा।


3

यह काफी पुराना धागा है, फिर भी:

  • हम घर में दो अलग-अलग प्रमाणीकरण प्रणालियों का उपयोग करते हैं, मशीनों का प्रबंधन मेरी टीम में स्थानीय कार्यस्थानों से किया जाता है।
  • मैंने vars_pluginAnsible के लिए लिखा ( https://gist.github.com/mfriedenhagen/e488235d732b7becda81 पर पूर्ण कार्यान्वयन पाया जा सकता है ) जो कई प्रमाणीकरण प्रणालियों को अलग करता है:
  • प्रमाणीकरण प्रणाली का नाम समूह विशिष्ट है।
  • इस्तेमाल किया लॉगिन / sudo उपयोगकर्ता समूह और व्यवस्थापक विशिष्ट है।
  • इसलिए मैं उपयोगकर्ता को व्यवस्थापक के वातावरण और उसी पासवर्ड से अजगर-कीरिंग लाइब्रेरी के माध्यम से एक पासवर्ड से सुरक्षित खींचता हूं (हम मैक ओएस एक्स के किचेन का उपयोग करते हैं, लेकिन प्रलेखन क्लेवलेट ग्नोम और _win_crypto से भी समर्थित है)।
  • मैंने मैक ओएस एक्स के किचेन में पासवर्डों के लिए मुझे इस तथ्य के बारे में सूचित करने की अनुमति दी, कि कमांड लाइन प्रोग्राम सुरक्षा मेजबानों द्वारा उपयोग किए जाने वाले हर प्रमाणीकरण प्रणाली के लिए एक पासवर्ड का उपयोग करता है, इसलिए मैं "ansible -s all -m ping" चलाता हूं और दो संकेत प्राप्त करें (प्रत्येक प्रमाणीकरण प्रणाली के लिए एक) जहां मैं स्पेस बार दबाता हूं और पासवर्ड को चुनता हूं।

यह बहुत साफ दिखता है, धन्यवाद - मुझे दो स्थानों में पासवर्ड स्टोर करने की आवश्यकता नहीं है। फिलहाल मैं KeepassX (क्योंकि गनोम कीरिंग बहुत पोर्टेबल नहीं लगती) का उपयोग करके फंस गया हूं, लेकिन शायद मैं python-keepassकाम कर सकता हूं ?
सुपरवाचू

जहां तक ​​मैं समझता हूं, अजगर-कीरिंग इसके लिए एक अमूर्त है, इसलिए आपके सहयोगी अन्य OSes का उपयोग कर सकते हैं। या क्या आप USB स्टिक पर अपने Keepassx db को स्टोर करते हैं और अलग-अलग OSes के साथ वर्कस्टेशन से प्रशासन करना है?
मिरको फ्रीडेनजेन

समझ लिया; मेरा मतलब था कि मुझे पहले से ही गैर-गनोम सिस्टम पर पासवर्ड तक पहुंच रखने के लिए KeepassX का उपयोग करना है, इसलिए उन्हें स्टोर करने का gnome-keyringमतलब डुप्लिकेट रिकॉर्ड के साथ होगा। फिर भी रास्ते का उपयोग करने से अच्छा है NOPASSWD, हालांकि ...
पर्यवेक्षण

0

ऐसा करने का एक संभावित तरीका पर्यावरण चर का उपयोग करना है।

जैसे

pass1=foo pass2=bar ansible-playbook -i production servers.xml

फिर नाटकों में, आप sudo पासवर्ड का उपयोग करके देख सकते हैं:

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