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