ब्लॉग

मल्टी-टेनेंट होस्टिंग के लिए एक व्यावहारिक डॉकर आइसोलेशन सुरक्षा चेकलिस्ट

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

सारांश

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

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

1. कंटेनरों को नॉन-रूट उपयोगकर्ता के रूप में चलाएं

कंटेनर डिफ़ॉल्ट रूप से कंटेनर के अंदर रूट के रूप में चलते हैं। यदि कोई हमलावर कंटेनर में रूट प्राप्त करता है, तो उन्हें बचने में शुरुआती बढ़त मिलती है। अपने Dockerfile में हमेशा एक नॉन-रूट उपयोगकर्ता परिभाषित करें।

FROM alpine:3.18
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser

Compose में, आप सीधे उपयोगकर्ता भी सेट कर सकते हैं:

services:
  app:
    image: myapp
    user: "1000:1000"

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

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

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

services:
  app:
    image: myapp
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE  # if needed

चेतावनी: SYS_ADMIN या NET_RAW जैसी क्षमताएं शायद ही कभी आवश्यक होती हैं। न्यूनतम सेट निर्धारित करने के लिए अपने एप्लिकेशन का ऑडिट करें। सभी क्षमताओं को हटाने से कई एस्केप वैक्टर अवरुद्ध होते हैं।

3. एक Seccomp प्रोफ़ाइल लागू करें

Seccomp (सुरक्षित कंप्यूटिंग मोड) कंटेनर के लिए उपलब्ध सिस्टम कॉल को फ़िल्टर करता है। डॉकर एक डिफ़ॉल्ट seccomp प्रोफ़ाइल के साथ आता है जो कुछ फ़्लैग के साथ clone जैसे खतरनाक सिस्कॉल को ब्लॉक करता है। आप इसे और अनुकूलित कर सकते हैं।

services:
  app:
    image: myapp
    security_opt:
      - seccomp=/path/to/custom-profile.json

एक कड़ी प्रोफ़ाइल unshare, ptrace, और mount को ब्लॉक कर सकती है। डॉकर के डिफ़ॉल्ट से शुरू करें और अधिक प्रतिबंधित करें। चेतावनी: अत्यधिक सख्त प्रोफ़ाइल अनुप्रयोगों को तोड़ सकती हैं। स्टेजिंग वातावरण में अच्छी तरह से परीक्षण करें। कंटेनर एस्केप से बचाव के बारे में अधिक जानकारी के लिए, कंटेनर एस्केप से बचाव पढ़ें।

4. उपयोगकर्ता नामस्थान रीमैपिंग सक्षम करें

उपयोगकर्ता नामस्थान कंटेनर के रूट उपयोगकर्ता को एक अनप्रिविलेज्ड होस्ट उपयोगकर्ता से मैप करते हैं। इसका मतलब है कि भले ही कोई हमलावर कंटेनर के अंदर रूट प्राप्त कर ले, उनके पास होस्ट पर कोई विशेष विशेषाधिकार नहीं होते।

/etc/docker/daemon.json को संपादित करके इसे डॉकर डेमॉन पर सक्षम करें:

{
  "userns-remap": "default"
}

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

5. Cgroups के साथ संसाधन सीमाएँ निर्धारित करें

संसाधन सीमाएँ एक समझौता किए गए कंटेनर को होस्ट के खिलाफ सेवा से इनकार हमला शुरू करने से रोकती हैं। CPU, मेमोरी और डिस्क I/O को सीमित करने के लिए cgroups का उपयोग करें।

services:
  app:
    image: myapp
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

Docker Compose v3 के लिए, deploy अनुभाग का उपयोग करें (swarm या compose v2 के साथ काम करता है)। सादे डॉकर के लिए, --memory और --cpus का उपयोग करें। चेतावनी: सीमाएँ बहुत कम सेट करने से OOM किल हो सकते हैं। उपयोग की निगरानी करें और तदनुसार समायोजित करें।

6. केवल-पढ़ने के लिए रूट फ़ाइलसिस्टम का उपयोग करें

एक केवल-पढ़ने के लिए रूट फ़ाइलसिस्टम हमलावरों को कंटेनर के अंदर दुर्भावनापूर्ण बाइनरी लिखने या कॉन्फ़िगरेशन फ़ाइलों को संशोधित करने से रोकता है।

services:
  app:
    image: myapp
    read_only: true
    tmpfs:
      - /tmp:noexec,nosuid,size=64m

उन निर्देशिकाओं पर tmpfs माउंट करें जिन्हें लिखने की पहुँच की आवश्यकता है (जैसे /tmp)। यह सभी लिखने योग्य डेटा को अस्थायी बनाता है। चेतावनी: कुछ अनुप्रयोगों को स्थायी भंडारण की आवश्यकता होती है; इसके लिए नामित वॉल्यूम का उपयोग करें।

सामान्य नुकसान

  • कर्नेल संगतता: उपयोगकर्ता नामस्थान रीमैपिंग और कुछ seccomp नियमों के लिए हालिया लिनक्स कर्नेल (4.14+) की आवश्यकता होती है। अपने कर्नेल संस्करण की जाँच करें।
  • प्रदर्शन प्रभाव: Seccomp और उपयोगकर्ता नामस्थान थोड़ा ओवरहेड जोड़ते हैं, लेकिन अधिकांश कार्यभार के लिए यह नगण्य है। अपने विशिष्ट ऐप को बेंचमार्क करें।
  • जटिलता: एक साथ सभी छह उपाय जोड़ने से चीजें टूट सकती हैं। उन्हें एक-एक करके लागू करें, प्रत्येक परिवर्तन का परीक्षण करें।

ऑर्केस्ट्रेशन पैटर्न की व्यापक दृष्टि के लिए, मल्टी-टेनेंट डॉकर आर्किटेक्चर डिजाइन करना पर हमारी मार्गदर्शिका देखें।

निष्कर्ष

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

Sources (5)