उत्तर देने योग्य सुरक्षा सर्वोत्तम अभ्यास


37

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

प्रश्न 1: नियंत्रण मशीन

हम निश्चित रूप से एक नियंत्रण मशीन की जरूरत है। नियंत्रण मशीन में सार्वजनिक SSH कुंजियाँ होती हैं जो उस पर सहेजी जाती हैं। यदि किसी हमलावर के पास नियंत्रण मशीन तक पहुंच है, तो संभावित रूप से पूरे डेटा सेंटर तक पहुंच है (या Ansible द्वारा प्रबंधित सर्वर पर)। तो क्या डेटा सेंटर में एक समर्पित कंट्रोल मशीन या रिमोट कंट्रोल मशीन (जैसे मेरा लैपटॉप दूरस्थ रूप से डेटा सेंटर से जुड़ा है) होना बेहतर है?

यदि सबसे अच्छा अभ्यास मेरे लैपटॉप का उपयोग करना है (जो कि चुराया जा सकता है, तो निश्चित रूप से, लेकिन मेरे पास मेरी सार्वजनिक कुंजी सुरक्षित रूप से क्लाउड या ऑफलाइन में पोर्टेबल क्रिप्टेड डिवाइस पर ऑनलाइन सहेजी जा सकती है), क्या होगा अगर मुझे कुछ वेब इंटरफेस का उपयोग करने की आवश्यकता है Ansible, जैसे Ansible Tower, Semaphore, Rundeck या Foreman, जिसे एक केंद्रीकृत मशीन पर डेटासेंटर में स्थापित करने की आवश्यकता होती है? इसे कैसे सुरक्षित करें और "हमले का एक बिंदु" बनने से बचें?

प्रश्न 2: SSH कुंजियाँ

मान लें कि मुझे कुछ कार्यों को करने के लिए Ansible का उपयोग करने की आवश्यकता है जिन्हें रूट द्वारा निष्पादित करने की आवश्यकता है (जैसे सॉफ्टवेयर पैकेज स्थापित करना या ऐसा कुछ)। मुझे लगता है कि नियंत्रित सर्वर पर रूट उपयोगकर्ता का उपयोग करने के लिए सबसे अच्छा अभ्यास नहीं है, लेकिन सुडोल अनुमतियों के साथ एंसिबल के लिए एक सामान्य उपयोगकर्ता को जोड़ना है। लेकिन, अगर आंसिबल को लगभग हर कार्य करने की आवश्यकता है, तो उसे सूडो के माध्यम से हर कमांड तक पहुंच की आवश्यकता है। तो, सबसे अच्छा विकल्प क्या है:

  • बता दें कि एंसिबल ने रूट यूजर का इस्तेमाल किया है (इसकी पब्लिक की में सेव है ~/.ssh/authorized_keys
  • सुडोल पहुँच के साथ Ansible के लिए समर्पित एक अप्रभावी उपयोगकर्ता बनाएँ
  • प्रत्येक उपयोगकर्ता को एक पासवर्ड निर्दिष्ट करने के लिए sudo के माध्यम से चलाने के लिए Ansible उपयोगकर्ता को जाने दें (जो कि प्रत्येक sysadmin द्वारा ज्ञात होने की आवश्यकता है जो उस सर्वर को नियंत्रित करने के लिए Ansible का उपयोग करता है)
  • किसी भी पासवर्ड को निर्दिष्ट किए बिना sudo के माध्यम से हर कमांड को चलाने के लिए Ansible उपयोगकर्ता को जाने दें
  • कोई और संकेत?

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

1
Ansible नियंत्रण होस्ट आंतरिक LAN में होगा और बाहर से पहुंच योग्य नहीं होगा, लेकिन मुझे लगता है कि यह पर्याप्त नहीं है।
Mat

जवाबों:


15

गढ़ मेजबान (ansible नियंत्रण केंद्र) एक अलग सबनेट के अंतर्गत आता है। यह बाहर से सीधे पहुंच योग्य नहीं होना चाहिए, यह प्रबंधित सर्वर से सीधे पहुंच योग्य नहीं होना चाहिए !

आपका लैपटॉप सभी का कम से कम सुरक्षित उपकरण है। एक बेवकूफ मेल, एक बेवकूफ फ़्लैश भेद्यता, एक बेवकूफ अतिथि वाईफ़ाई और यह pwned हो जाता है।

सर्वर के लिए, ssh के माध्यम से रूट एक्सेस की अनुमति न दें। कई ऑडिट इस बात की खिल्ली उड़ाते हैं।

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

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

एक साइड नोट: पासवर्ड रखने पर कुछ शब्द (जैसे "ansible" या "व्यवस्थापक" या "क्लस्टर" या "प्रबंधन" या "ऑपरेटर") बनाने की कोशिश न करें। पासवर्ड के लिए एकमात्र अच्छा नाम एक इंसान का नाम है, जैसे "jkowalski"। खाते के माध्यम से किए गए कार्यों के लिए केवल एक इंसान जिम्मेदार हो सकता है और अपने पासवर्ड को अनुचित रूप से सुरक्षित करने के लिए जिम्मेदार, "ansible" नहीं कर सकता।


धन्यवाद, आपने मुझे डेटा सेंटर में एक अलग सबनेट में एक केंद्रीकृत गढ़ होस्ट का उपयोग करने के बारे में आश्वस्त किया। मुझे यह भी पता है कि हर एक व्यक्ति के लिए हर sysadmin का उपयोग करना सबसे अच्छा है, लेकिन अब मेरे पास एक और सवाल है (शायद यह एक अलग सर्वरफॉल्ट प्रश्न पर बेहतर होगा): बिना एनआईएस, एनएफएस का उपयोग किए बिना लिनक्स होस्ट पर उपयोगकर्ताओं और SSH कुंजी को केंद्रीकृत कैसे करें शेयर या ऐसा कुछ? कृपया ध्यान दें कि मेरे पास पहले से ही विंडोज सर्वर के लिए सक्रिय निर्देशिका है।
Mat

ठीक है, मेरे प्रश्न के लिए बेहतर सोच मेरे पास दो संभावित उत्तर हैं: LDAP कुंजी संग्रहण या उपयोगकर्ता का उपयोग करें (नीचे दो उत्तर देखें)। लेकिन ... क्या मुझे वास्तव में इसकी आवश्यकता है? नहीं, यदि मैं अपने स्वयं के उपयोगकर्ता का उपयोग नए उपयोगकर्ताओं और चाबियों को अंसिबल के माध्यम से तैनात करने के लिए करता हूं! :-)
मैट

@ मट, पूरी तरह से सहमत है - जैसा कि मैंने नीचे कहा, आपको वास्तव में तब तक Userify या इसी तरह के किसी भी टूल की आवश्यकता नहीं है, जब तक कि आपकी टीम बड़ी न हो जाए। (हालांकि यह इसे बहुत अच्छा बनाता है।) LDAP स्थापित करने के लिए एक तरह का दर्द है (शोध pam_ldap और nss_ldap), लेकिन हमने इसे उपकरण में बनाया है ताकि यह सेकंड के लिए Ansible, शेफ, कठपुतली आदि के साथ एकीकृत हो सके। इसके अलावा, यह मुफ़्त है। <20 सर्वर।
जेमिसन बेकर

16

> प्रश्न 1: नियंत्रण मशीन

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

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

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

तो क्या डेटा सेंटर में एक समर्पित कंट्रोल मशीन या रिमोट कंट्रोल मशीन (जैसे मेरा लैपटॉप दूरस्थ रूप से डेटा सेंटर से जुड़ा है) होना बेहतर है?

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

सबसे अच्छा अभ्यास अपने लैपटॉप का उपयोग करने के लिए है (जो निश्चित रूप से, चोरी किया जा सकता है, लेकिन मैं अपने सार्वजनिक कुंजी सुरक्षित रूप से बादल या एक पोर्टेबल crypted डिवाइस पर ऑफ़लाइन में ऑनलाइन सहेज हो सकता था), तो क्या हुआ अगर मैं कुछ वेब इंटरफेस उपयोग करने की आवश्यकता के साथ Ansible, जैसे Ansible Tower, Semaphore, Rundeck या Foreman, जिसे एक केंद्रीकृत मशीन पर डेटासेंटर में स्थापित करने की आवश्यकता होती है?

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

इसे कैसे सुरक्षित करें और "हमले का एक बिंदु" बनने से बचें?

ठीक है, बेशक चीजों को लॉक करने के लिए नेट पर सभी संसाधनों की जांच करें, लेकिन सबसे महत्वपूर्ण बात एक सुरक्षित नींव के साथ शुरू होती है:

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

2. आखिरकार, सब कुछ टूट जाता है। तब होने वाली क्षति को कम करें: जैसा कि आपने पहले ही बताया था, गुप्त सामग्री की हैंडलिंग को कम करने का प्रयास करें।

3. इसे सरल रखें। नवीनतम विदेशी सामान न करें जब तक कि आप निश्चित नहीं हैं कि यह औसत रूप से और आपकी सुरक्षा को बढ़ाएगा। उदाहरण के लिए, हमने अपनी एन्क्रिप्शन परत के लिए एईएस से अधिक X25519 / NaCl (लिबासोडियम) का चयन किया (हम सब कुछ एन्क्रिप्ट करते हैं, बाकी और गति में), क्योंकि यह मूल रूप से डिज़ाइन किया गया था और किसी ऐसे व्यक्ति द्वारा लिखा गया था जिस पर हम भरोसा करते थे (डीजेबी एट अल) और दुनिया भर में समीक्षा की गई थी -सनीयर और गूगल की सुरक्षा टीम जैसे प्रसिद्ध शोधकर्ता। यदि वे नए हैं तो सादगी की ओर जाने वाली चीजों का उपयोग करें, क्योंकि सादगी से गहरे कीड़े छिपाना कठिन हो जाता है।

4. सुरक्षा मानकों को पूरा करना। यहां तक ​​कि अगर आप पीसीआई या एचआईपीएए सुरक्षा नियम जैसे सुरक्षा व्यवस्था में नहीं आते हैं, तो उन मानकों के माध्यम से पढ़ें और पता करें कि उनसे कैसे मिलना चाहिए या कम से कम बहुत मजबूत क्षतिपूर्ति नियंत्रण। यह सुनिश्चित करने में मदद करेगा कि आप वास्तव में 'सर्वोत्तम प्रथाओं' को पूरा कर रहे हैं।

5. बाहर / स्वतंत्र पैठ परीक्षण में लाओ और यह सुनिश्चित करने के लिए बग बाउंटी चलाएं कि आप उन सर्वोत्तम प्रथाओं का पालन कर रहे हैं। सब कुछ बहुत अच्छा लग रहा है जब तक आप कुछ स्मार्ट और उच्च प्रेरित लोगों को इस पर पीटते हैं ... एक बार जब आप समाप्त हो जाते हैं, तो आपको अपने समाधान पर बहुत विश्वास होगा।


प्रश्न 2: SSH कुंजियाँ सबसे अच्छा विकल्प क्या है: Ansible को रूट उपयोक्ता का उपयोग करने दें (अपनी सार्वजनिक कुंजी को ~/.ssh/authorized_keys/ में सहेजे जाने वाले सार्वजनिक उपयोक्ता को sudo के माध्यम से प्रत्येक कमांड को एक पासवर्ड निर्दिष्ट करने के लिए चलाने दें) (जिसे प्रत्येक sysminmin द्वारा ज्ञात होने की आवश्यकता है जो उस सर्वर को नियंत्रित करने के लिए Ansible का उपयोग करता है)

सर्वर पर पासवर्ड का उपयोग करने से बचने की कोशिश करें, यहां तक ​​कि sudo के लिए भी। यह रहस्यों से निपट रहा है और अंततः आपकी सुरक्षा को कमजोर कर देगा (आप वास्तव में उस पासवर्ड को मशीनों के बीच बहुत आसानी से नहीं बदल सकते हैं, आपको इसे कहीं स्टोर करना होगा, पासवर्ड का मतलब है कि आप वास्तव में सर्वर-टू-सर्वर स्वचालन नहीं कर सकते हैं जो वास्तव में यह सब क्या है। इसके अलावा, यदि आप SSH को इसकी चूक पर छोड़ते हैं, तो उन पासवर्डों को मजबूर किया जा सकता है, जो कुंजी को कुछ हद तक अर्थहीन बना देता है। इसके अलावा, किसी भी उद्देश्य के लिए रूट उपयोगकर्ता के उपयोग से बचें, और विशेष रूप से दूरस्थ लॉगिन।

सूसिएल एक्सेस के साथ Ansible के लिए समर्पित एक अनपेक्षित उपयोगकर्ता बनाएँ / किसी भी पासवर्ड को निर्दिष्ट किए बिना sudo के माध्यम से हर कमांड को चलाने के लिए Ansible उपयोगकर्ता को जाने दें

ठीक ठीक। एक अनपेक्षित उपयोगकर्ता जिसे आप सूडो भूमिकाओं के साथ वापस आंसरशीट के लिए ऑडिट कर सकते हैं। आदर्श रूप में, एक मानक उपयोगकर्ता बनाएं जो सर्वर-से-सर्वर / सुडीओ एक्सेस (पासवर्ड के बिना) के साथ संचार करने के लिए समर्पित हो।

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

कोई और संकेत?

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


5

उत्तर 1: नियंत्रण मशीन

दोनों में से एक, आप अपने लैपटॉप का उपयोग सर्वरों से कनेक्ट करने के लिए कर सकते हैं VIA एक गढ़ होस्ट। कुछ इस तरह:

Host private1
  IdentityFile ~/.ssh/rsa_private_key
  ProxyCommand ssh user@bastion -W %h:%p

Host bastion
  IdentityFile ~/.ssh/bastion_rsa_key

गढ़ मेजबान पर अधिक

जहां आपके पास गढ़ सर्वर के लिए एक कुंजी है, और फिर इसके पीछे होस्ट के लिए एक अलग कुंजी है। (व्यक्तिगत रूप से मैं gpg-agent / ssh-agent का उपयोग करूंगा)

उत्तर 2: प्रमाणीकरण

मुझे यकीन नहीं है कि कैसे "ansible" विशिष्ट सर्वोत्तम अभ्यास किसी भी अन्य ssh कनेक्शन सर्वोत्तम प्रथाओं से अलग हैं, लेकिन नहीं, आप खुद के रूप में ansible चलाना चाहते हैं, सेवा खाता नहीं और रूट खाता नहीं।

निम्नलिखित प्रमाणों का एक संयोजन:

अन्य विचार:

  • हमेशा सीक्रेट / वॉल्ट में सीक्रेट / प्राइवेट जानकारी स्टोर करें।
  • Ansible को SUDO / रूट को चलाने की आवश्यकता नहीं है, जब तक कि आप जो कर रहे हैं उसमें sudo / root की आवश्यकता होती है।
  • स्वीकार्य कई अलग-अलग तरीकों से अनुमतियों को बढ़ा सकता है

अंत में, आपने खिड़कियों के बारे में कुछ नहीं बताया। इसलिए मैं केवल यह मान सकता हूं कि आप इसका उपयोग नहीं कर रहे हैं। हालांकि इस मामले में मैं प्रतिनिधि विकल्प का उपयोग आपके लैपटॉप bastion.hostname.fqdnको कैस्टेरोस टिकट के साथ गढ़ होस्ट ( डेलीगेट_टो:) और kerberos / winrm https का उपयोग करने के लिए करूंगा ।

यदि आपने इसे मिस कर दिया है, तो कंप्यूटिंग के लिए सबसे अच्छा अभ्यास, रूट के रूप में कभी भी कुछ न करें, हमेशा नामित खातों का उपयोग करें

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