Docker Security
Last updated
AWS हैकिंग सीखें और अभ्यास करें:HackTricks प्रशिक्षण AWS रेड टीम एक्सपर्ट (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks प्रशिक्षण GCP रेड टीम एक्सपर्ट (GRTE)
Trickest का उपयोग करें और आसानी से वर्कफ़्लो बनाएं और सक्रिय करें जो दुनिया के सबसे उन्नत समुदाय उपकरणों द्वारा संचालित है। आज ही पहुंच प्राप्त करें:
डॉकर इंजन ने लिनक्स कर्नेल के नेमस्पेस और सीग्रुप्स का उपयोग करके कंटेनरों को विभाजित करने के लिए एक मूल सुरक्षा स्तर प्रदान किया है। अतिरिक्त सुरक्षा क्षमताएँ छोड़ने, सेकॉम्प, और SELinux/AppArmor के माध्यम से प्रदान की जाती है, जो कंटेनर विभाजन को बढ़ाता है। एक ऑथ प्लगइन उपयोगकर्ता क्रियाओं को और अधिक प्रतिबंधित कर सकता है।
डॉकर इंजन को या तो स्थानीय रूप से यूनिक्स सॉकेट के माध्यम से या HTTP का उपयोग करके दूरस्थ से पहुंचा जा सकता है। दूरस्थ पहुंच के लिए, गोपनीयता, अखंडता, और प्रमाणीकरण सुनिश्चित करने के लिए HTTPS और TLS का उपयोग करना महत्वपूर्ण है।
डॉकर इंजन, डिफ़ॉल्ट रूप से, unix:///var/run/docker.sock
पर यूनिक्स सॉकेट पर सुनता है। यूबंटू सिस्टम पर, डॉकर की स्टार्टअप विकल्प /etc/default/docker
में परिभाषित होते हैं। डॉकर API और क्लाइंट के लिए दूरस्थ पहुंच सक्षम करने के लिए, निम्नलिखित सेटिंग्स जोड़कर डॉकर डेमन को एक HTTP सॉकेट पर उजागर करें:
हालांकि, HTTP के माध्यम से Docker डेमन को अनुसारित करना सुरक्षा संबंधित चिंताओं के कारण सिफारिश नहीं है। HTTPS का उपयोग करके कनेक्शन को सुरक्षित बनाना उत्तम है। कनेक्शन को सुरक्षित बनाने के दो मुख्य दृष्टिकोण हैं:
क्लाइंट सर्वर की पहचान सत्यापित करता है।
क्लाइंट और सर्वर एक-दूसरे की पहचान सत्यापित करते हैं।
प्रमाणपत्रों का उपयोग सर्वर की पहचान सत्यापित करने के लिए किया जाता है। दोनों विधियों के विस्तृत उदाहरणों के लिए, इस गाइड का संदर्भ दें।
कंटेनर इमेज को निजी या सार्वजनिक रिपॉजिटरी में संग्रहीत किया जा सकता है। Docker कंटेनर इमेजों के लिए कई संग्रहण विकल्प प्रदान करता है:
Docker Hub: Docker से एक सार्वजनिक रजिस्ट्री सेवा।
Docker Registry: एक ओपन-सोर्स परियोजना जो उपयोगकर्ताओं को अपनी रजिस्ट्री होस्ट करने की अनुमति देती है।
Docker Trusted Registry: Docker का व्यावसायिक रजिस्ट्री प्रस्ताव, जिसमें भूमिका-आधारित उपयोगकर्ता प्रमाणीकरण और LDAP निर्देशिका सेवाओं के साथ समावेश है।
कंटेनर में सुरक्षा दोष हो सकते हैं या तो आधार इमेज के कारण हो सकते हैं या आधार इमेज पर स्थापित सॉफ्टवेयर के कारण हो सकते हैं। Docker एक परियोजना पर काम कर रहा है जिसे नौटिलस कहा जाता है जो कंटेनरों की सुरक्षा स्कैन करता है और सुरक्षा खोजों को सूचीबद्ध करता है। नौटिलस यह काम करता है कि प्रत्येक कंटेनर इमेज लेयर को सुरक्षा दोष रिपॉजिटरी के साथ तुलना करके सुरक्षा खोजों को पहचानें।
अधिक जानकारी के लिए यह पढ़ें.
docker scan
docker scan
कमांड आपको विदित Docker इमेजों को स्कैन करने की अनुमति देता है उपयोगकर्ता नाम या आईडी का उपयोग करके। उदाहरण के लिए, hello-world इमेज को स्कैन करने के लिए निम्नलिखित कमांड चलाएं:
Docker छवि साइनिंग छवियों में उपयोग की जाने वाली सुरक्षा और अखंडता सुनिश्चित करती है। यहाँ एक संक्षिप्त स्पष्टीकरण है:
Docker सामग्री विश्वसनीयता को सक्रिय करने के लिए, export DOCKER_CONTENT_TRUST=1
सेट करें। यह सुविधा Docker संस्करण 1.10 और उसके बाद के लिए डिफ़ॉल्ट रूप से बंद है।
इस सुविधा को सक्षम करने के साथ, केवल साइन की गई छवियाँ डाउनलोड की जा सकती हैं। प्रारंभिक छवि पुश करने के लिए मूल और टैगिंग कुंजियों के लिए पासफ़्रेज सेट करने की आवश्यकता होती है, जिसके साथ Docker भी उन्नत सुरक्षा के लिए Yubikey का समर्थन करता है। अधिक विवरण यहाँ मिल सकते हैं।
सामग्री विश्वसनीयता सक्षम करने के साथ असाइन की गई छवि को डाउनलोड करने का प्रयास "नो ट्रस्ट डेटा फॉर लेटेस्ट" त्रुटि देता है।
पहले के बाद छवि पुश करने के लिए, Docker छवि को साइन करने के लिए रिपॉजिटरी कुंजी का पासफ़्रेज पूछता है।
अपनी निजी कुंजियों का बैकअप करने के लिए, निम्नलिखित कमांड का उपयोग करें:
Docker होस्ट बदलते समय, संचय और रिपॉजिटरी कुंजी को संचालन बनाए रखने के लिए आवश्यक है।
Trickest का उपयोग करें और आसानी से विश्व के सबसे उन्नत समुदाय उपकरणों द्वारा संचालित कार्यप्रवाह निर्मित करें। आज ही पहुंचें:
नेमस्पेस लिनक्स कर्नेल की एक विशेषता है जो कर्नेल संसाधनों को विभाजित करती है ताकि एक सेट की प्रक्रियाएँ एक सेट के संसाधनों को देखें जबकि दूसरे सेट की प्रक्रियाएँ एक विभिन्न सेट के संसाधनों को देखें। यह सुविधा एक सेट के संसाधनों और प्रक्रियाओं के लिए एक ही नेमस्पेस होने के बावजूद, वे नेमस्पेस विभिन्न संसाधनों को संदर्भित करते हैं। संसाधनों कई स्थानों पर मौजूद हो सकते हैं।
डॉकर निम्नलिखित लिनक्स कर्नेल नेमस्पेस का उपयोग करता है ताकि कंटेनर विलयन को प्राप्त कर सके:
pid नेमस्पेस
माउंट नेमस्पेस
नेटवर्क नेमस्पेस
ipc नेमस्पेस
UTS नेमस्पेस
नेमस्पेस के बारे में अधिक जानकारी के लिए निम्नलिखित पृष्ठ की जाँच करें:
Namespacesलिनक्स कर्नेल सुविधा cgroups प्रक्रियाओं के एक सेट के बीच संसाधनों जैसे cpu, मेमोरी, आईओ, नेटवर्क बैंडविड्थ को सीमित करने की क्षमता प्रदान करती है। डॉकर cgroup सुविधा का उपयोग करने देता है जिससे विशिष्ट कंटेनर के लिए संसाधन नियंत्रण संभव हो। निम्नलिखित एक कंटेनर है जिसे यूज़र स्पेस मेमोरी को 500m तक सीमित किया गया है, कर्नेल मेमोरी को 50m तक सीमित किया गया है, cpu शेयर को 512, blkioweight को 400 किया गया है। CPU शेयर एक अनुपात है जो कंटेनर का CPU उपयोग नियंत्रित करता है। इसका डिफ़ॉल्ट मान 1024 है और 0 और 1024 के बीच रेंज है। यदि तीन कंटेनर्स का CPU शेयर 1024 है, तो हर कंटेनर CPU संसाधन संघर्ष की स्थिति में 33% तक ले सकता है। blkio-weight एक अनुपात है जो कंटेनर का IO नियंत्रित करता है। इसका डिफ़ॉल्ट मान 500 है और 10 और 1000 के बीच रेंज है।
किसी कंटेनर का cgroup प्राप्त करने के लिए आप निम्नलिखित कर सकते हैं:
For more information check:
CGroupsयोग्यताएँ मूल उपयोगकर्ता के लिए जो योग्यताएँ अनुमत हो सकती हैं, उन पर अधिक नियंत्रण प्रदान करती हैं। Docker लिनक्स कर्नेल योग्यता सुविधा का उपयोग करता है कंटेनर के अंदर किए जा सकने वाले ऑपरेशनों को सीमित करने के लिए, चाहे वह किसी भी प्रकार के उपयोगकर्ता हो।
जब एक डॉकर कंटेनर चलाया जाता है, प्रक्रिया उसे छोड़ देती है जो संक्षेपण से बाहर निकलने के लिए प्रयोग कर सकती थी संवेदनशील योग्यताएँ। यह सुनिश्चित करने का प्रयास करता है कि प्रक्रिया संवेदनशील कार्रवाई करने और बाहर निकलने के लिए सक्षम न हो:
Linux Capabilitiesयह एक सुरक्षा सुविधा है जो डॉकर को यह सीमित करने की अनुमति देती है कि कंटेनर के अंदर उपयोग किए जा सकने वाले सिसकॉल्स को:
SeccompAppArmor एक कर्नेल एन्हांसमेंट है जो कंटेनरों को सीमित संसाधनों के सीमित सेट में प्रति-प्रोग्राम प्रोफाइल के साथ सीमित करने के लिए उपयोग किया जाता है।:
AppArmorलेबलिंग सिस्टम: SELinux प्रत्येक प्रक्रिया और फ़ाइल सिस्टम ऑब्जेक्ट को एक अद्वितीय लेबल सौंपता है।
नीति प्रवर्तन: यह सुनिश्चित करता है कि प्रक्रिया लेबल क्या कार्रवाई कर सकता है अन्य लेबलों पर सिस्टम के भीतर।
कंटेनर प्रक्रिया लेबल: जब कंटेनर इंजन कंटेनर प्रक्रियाएँ प्रारंभ करते हैं, तो उन्हें सामान्यत: एक सीमित SELinux लेबल दिया जाता है, सामान्यत: container_t
।
कंटेनर के भीतर फ़ाइल लेबलिंग: कंटेनर के भीतर फ़ाइलों को सामान्यत: container_file_t
लेबल दिया जाता है।
नीति नियम: SELinux नीति मुख्य रूप से सुनिश्चित करती है कि container_t
लेबल वाली प्रक्रियाएँ केवल उन फ़ाइलों के साथ व्यवहार (पढ़ना, लिखना, क्रियान्वयन) कर सकती हैं जिन्हें container_file_t
लेबल से लेबलित किया गया है।
यह तंत्र सुनिश्चित करता है कि यदि कंटेनर के भीतर कोई प्रक्रिया क्षतिग्रस्त होती है, तो उसे केवल उसी लेबल वाले वस्तुओं के साथ व्यवहार करने की सीमा लगाई जाती है, इस प्रकार ऐसी क्षति से होने वाली संभावित नुकसान को सीमित करते हैं।
SELinuxडॉकर में, एक अधिकृति प्लगइन सुरक्षा में महत्वपूर्ण भूमिका निभाता है जिसे यह निर्धारित करना होता है कि डॉकर डेमन को अनुमति देने या रोकने के लिए। यह निर्णय दो मुख्य संदर्भों की जांच करके लिया जाता है:
प्रमाणीकरण संदर्भ: इसमें उपयोगकर्ता के बारे में विस्तृत जानकारी शामिल है, जैसे कि वे कौन हैं और वे अपने आप को कैसे प्रमाणित कर रहे हैं।
कमांड संदर्भ: यह अनुरोध से संबंधित सभी महत्वपूर्ण डेटा को शामिल करता है।
ये संदर्भ सुनिश्चित करते हैं कि केवल प्रमाणित उपयोगकर्ताओं के से वैध अनुरोध प्रसंस्कृत किए जाते हैं, जिससे डॉकर कार्रवाईयों की सुरक्षा में सुधार होता है।
AuthZ& AuthN - Docker Access Authorization Pluginयदि आप सही ढंग से कंटेनर के उपयोग कर सकने वाले संसाधनों की सीमा नहीं लगा रहे हैं, तो एक क्षतिग्रस्त कंटेनर मेज़बान को डॉस कर सकता है जहाँ वह चल रहा है।
CPU डॉस
बैंडविड्थ डीओएस
निम्नलिखित पृष्ठ पर आप यह सीख सकते हैं कि --privileged
फ्लैग का क्या मतलब है:
यदि आप एक कंटेनर चला रहे हैं जहां एक हमलावर को कम विशेषाधिकार वाले उपयोगकर्ता के रूप में पहुंचने में सफलता मिलती है। यदि आपके पास एक गलत रूप से कॉन्फ़िगर किया गया suid बाइनरी है, तो हमलावर इसका दुरुपयोग कर सकता है और कंटेनर के अंदर विशेषाधिकारों को उन्नत कर सकता है। जिससे उसे इससे बाहर निकलने की अनुमति हो सकती है।
no-new-privileges
विकल्प सक्षम करके कंटेनर को चलाना इस प्रकार की विशेषाधिकारों की उन्नति को रोकेगा।
अधिक --security-opt
विकल्पों के लिए जांच करें: https://docs.docker.com/engine/reference/run/#security-configuration
डॉकर इमेज में सीधे रहस्यों को समाहित करने या पर्यावरण चरणों का उपयोग करने से बचना महत्वपूर्ण है, क्योंकि ये विधियाँ docker inspect
या exec
जैसे कमांडों के माध्यम से कंटेनर तक पहुंचने वाले किसी भी व्यक्ति को आपकी संवेदनशील जानकारी को उजागर करती हैं।
डॉकर वॉल्यूम्स एक अधिक सुरक्षित विकल्प हैं, जिन्हें संवेदनशील जानकारी तक पहुंचने के लिए सिफारिश की जाती है। ये एक अस्थायी फ़ाइल सिस्टम के रूप में उपयोग किए जा सकते हैं, docker inspect
और लॉगिंग के साथ जुड़े जोखिमों को कम करते हैं। हालांकि, रूट उपयोगकर्ताओं और उन लोगों तक जो कंटेनर में exec
पहुंच रखे हैं, रहस्यों तक पहुंच सकते हैं।
डॉकर सीक्रेट्स संवेदनशील जानकारी को संभालने के लिए एक और अधिक सुरक्षित विधि प्रदान करते हैं। इमेज निर्माण चरण के दौरान रहस्यों की आवश्यकता होने वाले मामलों के लिए, BuildKit एक कुशल समाधान प्रस्तुत करता है जिसमें निर्माण समय रहस्यों का समर्थन किया जाता है, निर्माण की गति को बढ़ाता है और अतिरिक्त सुविधाएँ प्रदान करता है।
BuildKit का उपयोग करने के लिए, इसे तीन तरीकों से सक्रिय किया जा सकता है:
एक पर्यावरण चरण के माध्यम से: export DOCKER_BUILDKIT=1
कमांडों को उपसर्ग लगाकर: DOCKER_BUILDKIT=1 docker build .
डॉकर कॉन्फ़िगरेशन में इसे डिफ़ॉल्ट रूप से सक्षम करना: { "features": { "buildkit": true } }
, इसके बाद डॉकर को पुनः आरंभ करें।
BuildKit रहस्यों का उपयोग करने के लिए --secret
विकल्प के साथ अनुमति देता है, यह सुनिश्चित करता है कि ये रहस्य इमेज निर्माण कैश या अंतिम इमेज में शामिल नहीं हैं, जैसे कि निम्नलिखित कमांड का उपयोग करके:
संचालन करने के लिए आवश्यक रहने वाले रहस्यों के लिए, Docker Compose और Kubernetes मजबूत समाधान प्रदान करते हैं। Docker Compose एक secrets
कुंजी का उपयोग सेवा परिभाषा में गोपनीय फ़ाइलों को निर्दिष्ट करने के लिए करता है, जैसा कि एक docker-compose.yml
उदाहरण में दिखाया गया है:
यह कॉन्फ़िगरेशन Docker Compose के साथ सेवाएं शुरू करते समय रहस्यों का उपयोग करने की अनुमति देता है।
कुबरनेट्स परिवेशों में, रहस्यों का प्राकृतिक रूप से समर्थन किया जाता है और Helm-Secrets जैसे उपकरणों के साथ और अधिक प्रबंधित किया जा सकता है। कुबरनेट्स का रोल आधारित पहुंच नियंत्रण (RBAC) रहस्य प्रबंधन सुरक्षा को बढ़ाता है, जैसे Docker Enterprise के समान।
gVisor एक एप्लिकेशन कर्नेल है, जो गो में लिखा गया है, जो लिनक्स सिस्टम सर्फेस का एक बड़ा हिस्सा कार्यान्वित करता है। इसमें एक Open Container Initiative (OCI) रनटाइम runsc
शामिल है जो एप्लिकेशन और होस्ट कर्नेल के बीच एक अलगाव सीमा प्रदान करता है। runsc
रनटाइम Docker और Kubernetes के साथ एकीकृत होता है, जिससे सैंडबॉक्स कंटेनर चलाना सरल हो जाता है।
Kata Containers एक ओपन सोर्स समुदाय है जो एक सुरक्षित कंटेनर रनटाइम बनाने के लिए काम कर रहा है जिसमें हल्के वर्चुअल मशीन्स का उपयोग करके कंटेनर की तरह अनुभव और कार्य करते हैं, लेकिन हार्डवेयर वर्चुअलाइजेशन प्रौद्योगिकी का उपयोग करके मजबूत कार्यभार अलगाव प्रदान करते हैं।
--privileged
फ्लैग का उपयोग न करें और कंटेनर के अंदर डॉकर सॉकेट माउंट न करें। डॉकर सॉकेट कंटेनर उत्पन्न करने की अनुमति देता है, इसलिए यह होस्ट के पूर्ण नियंत्रण में लेने का एक आसान तरीका है, उदाहरण के लिए, --privileged
फ्लैग के साथ एक और कंटेनर चलाने के द्वारा।
कंटेनर के अंदर रूट के रूप में न चलाएं। एक विभिन्न उपयोगकर्ता का उपयोग करें और उपयोगकर्ता नेमस्पेस** का उपयोग करें।** कंटेनर में रूट होस्ट के समान है जब तक उपयोगकर्ता नेमस्पेस के साथ पुनर्मार्पित नहीं किया जाता है। यह केवल, मुख्य रूप से, लिनक्स नेमस्पेस, क्षमताएँ, और सीग्रुप्स द्वारा हल्के से प्रतिबंधित है।
सभी क्षमताएँ छोड़ें (--cap-drop=all
) और केवल वही जो आवश्यक है उन्हें सक्षम करें (--cap-add=...
)। अधिकांश कार्यभारों को कोई भी क्षमताएँ नहीं चाहिए और उन्हें जोड़ने से एक संभावित हमले की दायरा बढ़ जाती है।
“no-new-privileges” सुरक्षा विकल्प का उपयोग करें जिससे प्रक्रियाएं अधिक विशेषाधिकार प्राप्त न करें, उदाहरण के लिए suid बाइनरी के माध्यम से।
कंटेनर के लिए उपलब्ध संसाधनों की सीमा निर्धारित करें। संसाधन सीमाएँ मशीन को डीनाइल ऑफ सर्विस हमलों से सुरक्षित रख सकती हैं।
सेक्कॉम्प, AppArmor (या SELinux) प्रोफाइल को संक्षेपित करने के लिए संयम लागू करें जो कंटेनर के लिए उपलब्ध क्रियाएँ और सिसकॉल्स को न्यूनतम आवश्यक करते हैं।
आधिकारिक डॉकर छवियाँ का उपयोग करें और हस्ताक्षर की आवश्यकता या उन पर आधारित अपनी छवियाँ बनाएं। बैकडोर छवियों को विरासत में न लें या उपयोग न करें। इसके अलावा, रूट कुंजी, पासफ्रेज को एक सुरक्षित स्थान में स्टोर करें। डॉकर के पास UCP के साथ कुंजियों का प्रबंधन करने की योजनाएं हैं।
अपनी छवियों को नियमित रूप से पुनः निर्माण करें ताकि होस्ट और छवियों में सुरक्षा पैच लागू किए जा सकें।
अपने रहस्यों का बुद्धिमानी से प्रबंधन करें ताकि उन्हें अधिकारी को पहुंचना कठिन हो।
यदि आप डॉकर डेमन को उजागर करते हैं तो HTTPS का उपयोग करें जिसमें क्लाइंट और सर्वर प्रमाणीकरण हो।
अपने Dockerfile में ADD की बजाय COPY का उपयोग करें। ADD स्वचालित रूप से ज़िप फ़ाइलों को निकालता है और यूआरएल से फ़ाइलें कॉपी कर सकता है। COPY के पास ये क्षमताएँ नहीं हैं। जितना संभव हो, ADD का उपयोग न करें ताकि आप दूरस्थ यूआरएल और ज़िप फ़ाइलों के माध्यम से हमलों के लिए संक्रमित न हों।
प्रत्येक माइक्रो सेवा के लिए अलग कंटेनर होना चाहिए
कंटेनर की छवियों को छोटा रखें
यदि आप एक डॉकर कंटेनर के अंदर हैं या आपके पास डॉकर समूह में उपयोगकर्ता तक पहुंच है, तो आप भागने और विशेषाधिकारों को बढ़ाने की कोशिश कर सकते हैं:
Docker Breakout / Privilege Escalationयदि आपके पास डॉकर सॉकेट तक पहुंच है या आपके पास डॉकर समूह में उपयोगकर्ता की पहुंच है लेकिन आपके कार्रवाई को एक डॉकर प्रमाणीकरण प्लगइन द्वारा सीमित किया जा रहा है, तो जांचें कि क्या आप इसे अनदेखा कर सकते हैं:
AuthZ& AuthN - Docker Access Authorization Pluginउपकरण docker-bench-security एक स्क्रिप्ट है जो उत्पादन में Docker कंटेनर डिप्लॉय करने के आस-पास की दर्जनों सामान्य श्रेष्ठ-प्रथाओं की जांच करता है। ये सभी टेस्ट स्वचालित हैं, और CIS Docker Benchmark v1.3.1 पर आधारित हैं। आपको उपकरण को डॉकर चलाने वाले होस्ट से या पर्याप्त विशेषाधिकारों वाले एक कंटेनर से चलाने की आवश्यकता है। README में इसे कैसे चलाने के बारे में जानें: https://github.com/docker/docker-bench-security.
[https://blog.trailofbits.com/2019/07/19/understanding-docker सीखें और प्रैक्टिस करें AWS हैकिंग: HackTricks प्रशिक्षण AWS रेड टीम एक्सपर्ट (ARTE) सीखें और प्रैक्टिस करें GCP हैकिंग: HackTricks प्रशिक्षण GCP रेड टीम एक्सपर्ट (GRTE)