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

% docker run --rm -u nobody  alpine  nc -l 0.0.0.0 443
% docker exec -it b2b471d05398 sh
~ $ id
uid=65534(nobody) gid=65534(nobody)
~ $ ps
PID   USER     TIME  COMMAND
    1 nobody    0:00 nc -l 0.0.0.0 443
    8 nobody    0:00 sh
   15 nobody    0:00 ps
~ $ %

मैंने विभिन्न क्षमताओं को अक्षम करने का प्रयास किया है, लेकिन फिर भी, इनमें से कोई भी nc को सफलतापूर्वक चलने और पोर्ट के लिए बाध्य करने से नहीं रोकता है।

docker run --rm -u nobody --cap-drop=SETUID --cap-drop=NET_BIND_SERVICE --cap-drop=SETFCAP --cap-drop=NET_RAW  alpine  nc -l 0.0.0.0 443

डेविड मेज़ के जवाब के जवाब में, मैंने Debian GNU/Linux के साथ एक इमेज बनाई है।

यहाँ Dockerfile है:

FROM python:slim-buster
EXPOSE 80
USER nobody
CMD python -m http.server 80

डॉकर बिल्ड कमांड

docker build -t test .

गैर-रूट उपयोगकर्ता द्वारा विशेषाधिकार प्राप्त पोर्ट पर अभी भी आबद्ध होने में सक्षम

docker run  --rm test

मैंने क्षमता छोड़ने के लिए भी यह कोशिश की:

docker run  --rm --cap-drop=SETUID --cap-drop=NET_BIND_SERVICE --cap-drop=SETFCAP --cap-drop=NET_RAW  test

किसी भी विचार क्षमता को हटाने और उस त्रुटि को ट्रिगर करने के लिए मुझे क्या करना चाहिए जिसे मैं पुन: उत्पन्न करने का प्रयास कर रहा हूं?

0
anish 3 सितंबर 2021, 13:20

2 जवाब

सबसे बढ़िया उत्तर

टीएल; डॉ: अपने आदेश में विकल्प --sysctl "net.ipv4.ip_unprivileged_port_start=1024" शामिल करें


लंबा उत्तर:

docker docs में कहा गया है कि

चेतावनी

डॉकर समूह रूट उपयोगकर्ता को समतुल्य विशेषाधिकार प्रदान करता है।

यह उस उपयोगकर्ता को संदर्भित नहीं करता है जिसे आप कंटेनर के अंदर उपयोग करना चाहते हैं बल्कि आपके ${USER} से संबंधित है। यह महत्वपूर्ण है क्योंकि इससे docker जो कुछ भी कर सकता है उसे सब प्रदान करेगा!

हालांकि, कोई भी उचित उपयोगकर्ता नहीं है जो यूआईडी को लॉगऑन कर सकता है और डॉकर उस यूआईडी के साथ प्रोग्राम चलाएगा। यहां देखें

मुझे अल्पाइन एनसी पर कोई उचित संसाधन नहीं मिला लेकिन परीक्षण करने से ऐसा लगा कि पोर्ट ठीक से नहीं खुल रहे हैं।

परीक्षण करते समय पायथन सर्वर अधिक अंतर्दृष्टि देता है।

आप अपने आस-पास देख सकते हैं कि पोर्ट खोलने की सीमा में डॉकटर ब्रिज इंटरफ़ेस शामिल नहीं है। कृपया देखें समस्या मर्ज

यदि आप निम्नलिखित का प्रयास करते हैं, तो आप देखेंगे कि मेजबान नेटवर्क के लिए सुरक्षा ठीक से काम कर रही है।

सही अनुमति अस्वीकृत:

docker run -u nobody --cap-drop=all --network host --rm python:slim-buster python -m http.server 80
docker run  --cap-drop=all --network host --rm python:slim-buster python -m http.server 80
docker run -u nobody --network host --rm python:slim-buster python -m http.server 80

काम कर रहे:

docker run --network host --rm python:slim-buster python -m http.server 80

पुलों के लिए काम करना

docker run -u nobody --cap-drop=all --rm python:slim-buster python -m http.server 80

और हमेशा की तरह उनके परीक्षणों को देखने पर आपको "उत्तर"< मिलेगा /strong> आपके अंतर्निहित प्रश्न के लिए।

फिर से सभी 3 स्वादों में अनुमति अस्वीकार कर दी गई

docker run -u nobody --cap-drop=all --sysctl "net.ipv4.ip_unprivileged_port_start=1024" --rm python:slim-buster  python -m http.server 80
docker run -u nobody --sysctl "net.ipv4.ip_unprivileged_port_start=1024" --rm python:slim-buster  python -m http.server 80
docker run --cap-drop=all --sysctl "net.ipv4.ip_unprivileged_port_start=1024" --rm python:slim-buster  python -m http.server 80

और यहाँ यह रूट के लिए सही ढंग से काम करता है

docker run --sysctl "net.ipv4.ip_unprivileged_port_start=1024" --rm python:slim-buster  python -m http.server 80
1
Summer-Sky 3 सितंबर 2021, 13:06

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

nc -l -p 443 0.0.0.0

जहां -l "सुनो" मोड सेट करता है और -p 443 लिसनिंग पोर्ट को इंगित करता है। (वास्तव में, -p विकल्प के बिना, मैं बिजीबॉक्स nc से तुरंत बाहर निकलें एक -l विकल्प और दो स्थितीय तर्कों के साथ, और फिर आप कंटेनर में docker exec नहीं जा सकेंगे।)

-p विकल्प के बिना, बिजीबॉक्स nc होगा एक मनमाना पोर्ट चुनें और इसे stderr पर प्रिंट करें। वह एक विशेषाधिकार प्राप्त बंदरगाह नहीं होगा, यही कारण है कि आपको वहां कोई त्रुटि नहीं मिल रही है। docker logs को पोर्ट नंबर दिखाना चाहिए, और कंटेनर के अंदर netstat श्रोता को वैकल्पिक पोर्ट पर दिखाना चाहिए।

0
David Maze 3 सितंबर 2021, 10:58