AuthZ& AuthN - Docker Access Authorization Plugin
Docker की आउट-ऑफ-द-बॉक्स अधिकारीकरण मॉडल सब कुछ या कुछ नहीं है। किसी भी उपयोगकर्ता को जो भी अनुमति है डॉकर डेमन तक पहुंचने की, वह किसी भी डॉकर क्लाइंट कमांड चला सकता है। यही बात कॉलर्स के लिए सही है जो इंजन API का उपयोग करके डेमन से संपर्क करते हैं। यदि आपको अधिक पहुंच नियंत्रण की आवश्यकता है, तो आप अधिकारीकरण प्लगइन बना सकते हैं और उन्हें अपने डॉकर डेमन कॉन्फ़िगरेशन में जोड़ सकते हैं। अधिकारीकरण प्लगइन का उपयोग करके, एक डॉकर प्रशासक डॉकर डेमन तक पहुंच को प्रबंधित करने के लिए विस्तार से पहुंच नीतियों को कॉन्फ़िगर कर सकता है।
मूल वास्तुकला
डॉकर ऑथ प्लगइन बाहरी प्लगइन हैं जिन्हें आप डॉकर डेमन को अनुरोधित क्रियाओं को अनुमति देने/मना करने के लिए उपयोग कर सकते हैं जो उपयोगकर्ता ने अनुरोध किया है और जिस क्रिया को अनुरोध किया गया है पर निर्भर करता है।
निम्नलिखित जानकारी दस्तावेज़ से है
जब डॉकर डेमन के माध्यम से CLI या इंजन API के माध्यम से एक HTTP अनुरोध किया जाता है, तो प्रमाणीकरण उपप्रणाली अनुरोध को स्थापित प्रमाणीकरण प्लगइन(s) को पारित करती है। अनुरोध में उपयोगकर्ता (कॉलर) और कमांड संदर्भ होता है। प्लगइन को यह निर्णय लेने के लिए जिम्मेदार होता है कि क्या अनुरोध को अनुमति देने या नकारने की जाए।
नीचे दिए गए क्रमचय आलोकन चित्रों में अनुमति देने और नकारने की अधिकारीकरण फ्लो दिखाया गया है:
प्लगइन को भेजे गए प्रत्येक अनुरोध में प्रमाणित उपयोगकर्ता, HTTP हेडर्स, और अनुरोध/प्रतिक्रिया शरीर शामिल होते हैं। केवल उपयोगकर्ता नाम और प्रमाणीकरण विधि प्लगइन को पारित किए जाते हैं। सबसे महत्वपूर्ण बात यह है कि कोई भी उपयोगकर्ता क्रेडेंशियल्स या टोकन पारित नहीं किए जाते हैं। अंत में, सभी अनुरोध/प्रतिक्रिया शरीर केवल उन अनुरोध/प्रतिक्रिया शरीरों को भेजे जाते हैं जिनमें Content-Type
या तो text/*
है या application/json
है।
जिन कमांडों में HTTP कनेक्शन को हाइजैक कर सकते हैं (HTTP Upgrade
) जैसे कि exec
, उनके लिए अधिकारीकरण प्लगइन को केवल प्रारंभिक HTTP अनुरोधों के लिए ही बुलाया जाता है। एक बार प्लगइन कमांड को मंजूर कर देता है, तो अधिकारीकरण को शेष फ्लो के लिए लागू नहीं किया जाता है। विशेष रूप से, स्ट्रीमिंग डेटा को अधिकारीकरण प्लगइन्स को पारित नहीं किया जाता है। logs
और events
जैसे चंक्ड HTTP प्रतिक्रिया वाले कमांडों के लिए केवल HTTP अनुरोध प्लगइन्स को भेजा जाता है।
अनुरोध/प्रतिक्रिया प्रसंस्करण के दौरान, कुछ अधिकारीकरण फ्लो को डॉकर डेमन के लिए अतिरिक्त क्वेरी करने की आवश्यकता हो सकती है। ऐसे फ्लो को पूरा करने के लिए, प्लगइन एक सामान्य उपयोगकर्ता की तरह डेमन API को कॉल कर सकते हैं। इन अतिरिक्त क्वेरियों को सक्षम करने के लिए, प्लगइन को एक प्रशासक को सही प्रमाणीकरण और सुरक्षा नीतियों को कॉन्फ़िगर करने के लिए साधन प्रदान करना चाहिए।
कई प्लगइन
आपको अपने प्लगइन को डॉकर डेमन स्टार्टअप के हिस्से के रूप में रजिस्टर करने की जिम्मेदारी है। आप कई प्लगइन स्थापित कर सकते हैं और उन्हें एक साथ जोड़ सकते हैं। यह श्रृंखला क्रमबद्ध हो सकती है। प्रत्येक अनुरोध डेमन के माध्यम से श्रृंखला में क्रमबद्ध रूप से पारित होता है। केवल जब सभी प्लगइन्स संसाधन के लिए अनुमति देते हैं, तब ही पहुंच दी जाती है।
प्लगइन उदाहरण
Twistlock AuthZ Broker
प्लगइन authz आपको एक सरल JSON फ़ाइल बनाने की अनुमति देता है जिसे प्लगइन अनुरोधों की अधिकृति के लिए पढ़ने के लिए उपयोग करेगा। इसलिए, यह आपको बहुत आसानी से नियंत्रित करने का अवसर देता है कि प्रत्येक उपयोगकर्ता किस API एंडपॉइंट तक पहुंच सकता है।
यह एक उदाहरण है जो एलिस और बॉब को नए कंटेनर बना सकते हैं: {"name":"policy_3","users":["alice","bob"],"actions":["container_create"]}
पृष्ठ route_parser.go में आप अनुरोधित URL और क्रिया के बीच संबंध पा सकते हैं। पृष्ठ types.go में आप क्रिया के नाम और क्रिया के बीच संबंध पा सकते हैं
सरल प्लगइन ट्यूटोरियल
आप एक सरल समझने योग्य प्लगइन जिसमें स्थापना और डीबगिंग के बारे में विस्तृत ज
कंटेनर चलाना और फिर एक विशेषाधिकार सत्र प्राप्त करना
इस मामले में सिस्टम प्रशासक ने उपयोगकर्ताओं को वॉल्यूम माउंट और --privileged
ध्वज के साथ कंटेनर चलाने या कंटेनर को कोई अतिरिक्त क्षमता न देने की अनुमति नहीं दी:
हालांकि, एक उपयोगकर्ता चल रहे कंटेनर के अंदर एक शैल बना सकता है और उसे अतिरिक्त विशेषाधिकार दे सकता है:
अब, उपयोगकर्ता किसी भी पहले चर्चित तकनीकों का उपयोग करके कंटेनर से बाहर निकल सकता है और मेज़बान में विशेषाधिकारों को बढ़ा सकता है।
माउंट करने योग्य फ़ोल्डर
इस मामले में सिस्टम प्रशासक ने उपयोगकर्ताओं को कंटेनर को --privileged
फ़्लैग के साथ चलाने से रोक दिया या कंटेनर को कोई अतिरिक्त क्षमता देने की अनुमति दी, और उसने केवल /tmp
फ़ोल्डर को माउंट करने की अनुमति दी:
ध्यान दें कि शायद आप /tmp
फ़ोल्डर को माउंट नहीं कर सकते हैं लेकिन आप एक अलग लिखने योग्य फ़ोल्डर माउंट कर सकते हैं। आप लिखने योग्य निर्देशिकाएँ खोज सकते हैं इस्तेमाल करके: find / -writable -type d 2>/dev/null
ध्यान दें कि एक लिनक्स मशीन में सभी निर्देशिकाएँ suid बिट का समर्थन नहीं करेंगी! सुयोग्यता बिट का समर्थन करने वाली निर्देशिकाओं को जांचने के लिए mount | grep -v "nosuid"
चलाएं। उदाहरण के लिए सामान्यत: /dev/shm
, /run
, /proc
, /sys/fs/cgroup
और /var/lib/lxcfs
suid बिट का समर्थन नहीं करते हैं।
ध्यान दें कि यदि आप /etc
को माउंट कर सकते हैं या किसी अन्य फ़ोल्डर को कॉन्फ़िगरेशन फ़ाइलें शामिल करते हैं, तो आप उन्हें डॉकर कंटेनर में रूट के रूप में बदल सकते हैं ताकि आप उन्हें होस्ट में दुरुपयोग करने और विशेषाधिकारों को उन्नत करने के लिए उपयोग कर सकें (शायद /etc/shadow
को संशोधित करके)
Unchecked API Endpoint
इस प्लगइन को कॉन्फ़िगर करने वाले सिसएडमिन की जिम्मेदारी यह होगी कि वह नियंत्रित करे कि प्रत्येक उपयोगकर्ता किस क्रिया को किस विशेषाधिकारों के साथ कर सकता है। इसलिए, यदि एडमिन एंडपॉइंट्स और गुणों के साथ काले सूची का उपयोग करता है तो वह शायद कुछ ऐसे भूल जाएंगे जो एक हमलावर को विशेषाधिकारों को उन्नत करने की अनुमति दें।
आप डॉकर API की जांच कर सकते हैं https://docs.docker.com/engine/api/v1.40/#
Unchecked JSON Structure
रूट में बाइंड
संभावना है कि जब सिसएडमिन ने डॉकर फ़ायरवॉल कॉन्फ़िगर किया तो उसने API के "Binds" जैसे कुछ महत्वपूर्ण पैरामीटर के बारे में भूल जाने की संभावना है। निम्नलिखित उदाहरण में इस गलत कॉन्फ़िगरेशन का दुरुपयोग करना संभव है ताकि एक कंटेनर बनाया और चलाया जा सके जो होस्ट का रूट (/) फ़ोल्डर माउंट करता है:
ध्यान दें कि इस उदाहरण में हम Binds
पैरामीटर का उपयोग JSON में एक रूट स्तर कुंजी के रूप में कर रहे हैं लेकिन API में यह HostConfig
कुंजी के तहत प्रकट होता है।
HostConfig में Binds
रूट में Binds के साथ समान निर्देशिका का पालन करें और इस अनुरोध को Docker API को करें:
रूट में माउंट
रूट में बाइंड्स के साथ एक ही निर्देशिका का पालन करें और इस अनुरोध को Docker API में करें:
HostConfig में माउंट
डॉकर API को इस अनुरोध को करते समय रूट में बाइंड के साथ एक ही निर्देश का पालन करें:
जाँच न किया गया JSON विशेषता
संभावना है कि जब सिस्टम प्रशासक ने डॉकर फ़ायरवॉल कॉन्फ़िगर किया तो उन्होंने API के "HostConfig" के अंदर "Capabilities" जैसी किसी महत्वपूर्ण विशेषता को भूल गए हों। निम्नलिखित उदाहरण में इस गलत कॉन्फ़िगरेशन का दुरुपयोग करके SYS_MODULE क्षमता के साथ एक कंटेनर बनाना और चलाना संभव है:
HostConfig
वह कुंजी है जिसमें आम तौर पर उन रोचक विशेषाधिकार होते हैं जिनसे कंटेनर से बाहर निकला जा सकता है। हालांकि, जैसा कि हम पहले ही चर्चा कर चुके हैं, ध्यान दें कि इसके बाहर Binds का उपयोग भी काम करता है और आपको प्रतिबंधों को छलकरने की अनुमति देता है।
प्लगइन को निषेधित करना
यदि सिस्टम प्रशासक ने भूलकर प्रतिबंध लगाने की क्षमता को निषेधित करने की क्षमता को भूल गए है, तो आप इसका पूरी तरह से निषेधित करने का लाभ उठा सकते हैं!
ध्यान दें कि उच्चतम स्तर पर चढ़ाई के बाद प्लगइन को पुनः सक्रिय करें, अन्यथा डॉकर सेवा को पुनः आरंभ करने से काम नहीं चलेगा!
ऑथ प्लगइन बायपास व्रिटअप्स
संदर्भ
Last updated