ब्लॉग

मल्टी-टेनेंट होस्टिंग के लिए डॉकर कंटेनरों को सख्त बनाना: एक चरण-दर-चरण पृथक्करण गाइड

जानें कि कैसे मल्टी-टेनेंट वातावरण के लिए डॉकर कंटेनरों को व्यावहारिक सुरक्षा उपायों जैसे नॉन-रूट उपयोगकर्ता, हटाई गई क्षमताएं, केवल-पढ़ने के लिए फाइलसिस्टम और नेटवर्क आइसोलेशन के साथ सुरक्षित किया जाए।

सारांश

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

मल्टी-टेनेंट कंटेनरों के साथ वास्तविक दुनिया की समस्या

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

यह लेख आपको व्यावहारिक उदाहरणों और चेतावनियों के साथ प्रत्येक सख्तीकरण चरण के माध्यम से ले जाता है। अंत तक, आपके पास सुरक्षित मल्टी-टेनेंट कंटेनर तैनात करने के लिए एक दोहराने योग्य प्रक्रिया होगी।

चरण 1: कंटेनरों को नॉन-रूट के रूप में चलाएं

डिफ़ॉल्ट रूप से, डॉकर कंटेनर रूट के रूप में चलते हैं। यदि कोई कंटेनर समझौता किया जाता है, तो हमलावर को कंटेनर के अंदर रूट विशेषाधिकार मिल जाते हैं और वह कंटेनर एस्केप का प्रयास कर सकता है। पहले, अपने Dockerfile में एक समर्पित उपयोगकर्ता बनाएं और उस पर स्विच करें:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

चेतावनी: कुछ प्रक्रियाओं (जैसे, पोर्ट < 1024 को बाइंड करना) के लिए रूट की आवश्यकता होती है। ऐसे मामलों में, केवल आवश्यक क्षमता प्रदान करने के लिए --cap-add फ्लैग का उपयोग करें, जैसे --cap-add=NET_BIND_SERVICE, और फिर भी प्रक्रिया को नॉन-रूट उपयोगकर्ता के अंतर्गत चलाएं।

मूलभूत आइसोलेशन के बारे में अधिक जानकारी के लिए, डॉकर में वास्तविक मल्टी-टेनेंट आइसोलेशन प्राप्त करना पर हमारी गाइड देखें।

चरण 2: सभी लिनक्स क्षमताओं को हटाएं और केवल अपनी आवश्यकता के अनुसार वापस जोड़ें

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

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app

टालने के लिए सामान्य क्षमताएं: SYS_ADMIN (कंटेनर एस्केप), NET_RAW (पैकेट सूँघना), SYS_PTRACE (प्रक्रिया डीबगिंग)। setuid बाइनरी के माध्यम से विशेषाधिकार वृद्धि को रोकने के लिए --security-opt no-new-privileges के साथ docker run का उपयोग करें।

चरण 3: रूट फाइलसिस्टम को केवल-पढ़ने के लिए माउंट करें

हमलावर अक्सर कंटेनर फाइलसिस्टम में दुर्भावनापूर्ण स्क्रिप्ट लिखते हैं। रूट फाइलसिस्टम को केवल-पढ़ने के लिए बनाकर, आप इसे रोकते हैं:

docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m my-app

--tmpfs /tmp और /var/run जैसे निर्देशिकाओं के लिए एक अस्थायी लिखने योग्य माउंट बनाता है। noexec फ्लैग उस माउंट से निष्पादन को रोकता है। यह दृष्टिकोण हमलावरों को लिखने योग्य निर्देशिकाओं के माध्यम से पिवट करने के लिए मजबूर करता है, जिसे आप मॉनिटर कर सकते हैं।

चरण 4: cgroups के साथ संसाधन सीमाएं लागू करें

असीमित कंटेनर होस्ट मेमोरी या CPU को समाप्त करके डिनायल-ऑफ-सर्विस हमले कर सकते हैं। डॉकर के रनटाइम बाधाओं का उपयोग करें:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • --memory और --memory-swap कठोर सीमाएं सेट करते हैं (कोई स्वैप नहीं)।
  • --cpus CPU को सीमित करता है।
  • --pids-limit प्रक्रियाओं की संख्या सीमित करके फोर्क बम को रोकता है।

चेतावनी: संसाधन सीमाएं cgroups द्वारा लागू की जाती हैं, लेकिन वे नेटवर्क के माध्यम से डेटा बहिर्गमन को नहीं रोकती हैं। नेटवर्क आइसोलेशन के साथ संयोजन करें (अगला चरण)।

चरण 5: डॉकर कस्टम नेटवर्क के साथ नेटवर्क को विभाजित करें

डिफ़ॉल्ट रूप से, डॉकर कंटेनर एक ब्रिज नेटवर्क साझा करते हैं। मल्टी-टेनेंट सेटअप में, आपको प्रत्येक टेनेंट के नेटवर्क स्टैक को अलग करना होगा। प्रति टेनेंट एक समर्पित नेटवर्क बनाएं:

docker network create tenant-alpha --internal
docker run --network tenant-alpha my-app

आउटबाउंड इंटरनेट एक्सेस को ब्लॉक करने के लिए --internal फ्लैग का उपयोग करें, फिर -p के माध्यम से केवल आवश्यक पोर्ट उजागर करें। अधिक उन्नत नेटवर्क विभाजन के लिए, डॉकर आइसोलेशन के साथ वेब ऐप्स को सुरक्षित करना पर विचार करें।

चेतावनी: आंतरिक नेटवर्क टेनेंट के बीच सीधे कंटेनर-से-कंटेनर संचार को रोकते हैं, लेकिन यदि आप होस्ट नेटवर्किंग का उपयोग करते हैं तो DNS लीक अभी भी हो सकते हैं। ब्रिज या ओवरले नेटवर्क पर टिके रहें।

चरण 6: Seccomp और AppArmor प्रोफाइल लागू करें

Seccomp सिस्टम कॉल को फ़िल्टर करता है, और AppArmor (या SELinux) अनिवार्य एक्सेस नियंत्रण लागू करता है। डॉकर एक डिफ़ॉल्ट seccomp प्रोफ़ाइल प्रदान करता है जो कुछ फ़्लैग्स के साथ clone जैसी खतरनाक syscalls को ब्लॉक करता है। कठोर आइसोलेशन के लिए, एक कस्टम प्रोफ़ाइल बनाएं:

docker run --security-opt seccomp=./custom.json --security-opt apparmor=docker-default my-app

आप docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time के साथ एक आधार प्रोफ़ाइल उत्पन्न कर सकते हैं और फिर ट्रिम कर सकते हैं। चेतावनी: अत्यधिक प्रतिबंधात्मक प्रोफ़ाइल वैध कार्यक्षमता को तोड़ सकती हैं। स्टेजिंग में अच्छी तरह से परीक्षण करें।

चरण 7: वर्चुअल मशीनों के साथ हाइब्रिड आइसोलेशन पर विचार करें

यदि आपके टेनेंट को पूर्ण आइसोलेशन की आवश्यकता है (उदा., विनियमित उद्योग), तो कंटेनरों को एक हल्के VM के अंदर चलाएं। Sysbox या Kata Containers जैसे उपकरण कंटेनर की गति का त्याग किए बिना हार्डवेयर-स्तरीय पृथक्करण प्रदान करते हैं। यह डॉकर के एन्हांस्ड कंटेनर आइसोलेशन (ECI) द्वारा उपयोग किया जाने वाला दृष्टिकोण है। जबकि ओवरहेड बेयर कंटेनरों की तुलना में अधिक है, यह प्रति वर्कलोड पूर्ण VMs की तुलना में कहीं कम है।

सही आइसोलेशन स्तर चुनने के बारे में अधिक जानकारी के लिए, मल्टी-टेनेंट डॉकर आर्किटेक्चर डिज़ाइन करना पढ़ें।

सब कुछ एक साथ रखना: एक सख्तीकरण चेकलिस्ट

  1. कंटेनरों को नॉन-रूट उपयोगकर्ता के साथ बनाएं।
  2. सभी क्षमताओं को हटाएं, केवल आवश्यक जोड़ें।
  3. फाइलसिस्टम को अस्थायी लिखने योग्य माउंट के साथ केवल-पढ़ने के लिए माउंट करें।
  4. मेमोरी, CPU और PID सीमाएं सेट करें।
  5. प्रति टेनेंट पृथक डॉकर नेटवर्क बनाएं।
  6. कस्टम seccomp और AppArmor प्रोफाइल लागू करें।
  7. उच्च सुरक्षा आवश्यकताओं के लिए हाइब्रिड VM कंटेनरों का मूल्यांकन करें।

निष्कर्ष

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

Sources (5)