
Container Snitch, Docker Engine के तहत चल रही प्रक्रियाओं की जाँच करता है और यदि कोई रूट के रूप में चल रही पाई जाती है तो सतर्क करता है।
cnitch (स्निच या कंटेनर स्निच) एक सरल फ्रेमवर्क और कमांड लाइन टूल है जो Docker कंटेनरों की निगरानी करके उन प्रक्रियाओं की पहचान करता है जो root के रूप में चल रही हैं।
यह बुरा क्यों है? यदि आप पहले से mhausenblas द्वारा लिखित can I haz non-privileged containers? पर नहीं गए हैं, तो मैं अनुशंसा करता हूँ कि आप अभी वहाँ जाएँ और सारी जानकारी प्राप्त करें।
जब मैं cnitch विकसित कर रहा था, तो मुझे एक ऐसी समस्या का सामना करना पड़ा जो मुझे एप्लिकेशन में एक बग लग रही थी – cnitch स्वयं को Docker कंटेनर में एक root प्रक्रिया के रूप में रिपोर्ट कर रहा था। मुझे समझ नहीं आ रहा था कि यह कैसे हो सकता है, क्योंकि Dockerfile में स्पष्ट रूप से लिखा था कि मैं एक उपयोगकर्ता बना रहा हूँ और root के रूप में नहीं चल रहा हूँ। बहुत डिबगिंग और सत्यापन के बाद मैंने Dockerfile की दोबारा जाँच करने का निर्णय लिया और यह पाया:
FROM alpine
RUN adduser -h /home/cnitch -D cnitch cnitch
COPY ./cmd/cnitch /home/cnitch/
RUN chmod +x /home/cnitch/cnitch
#USER cnitch
ENTRYPOINT ["/home/cnitch/cnitch"]
जब मैं Docker sock पर अनुमतियों की समस्या का पता लगाने के लिए एप्लिकेशन कंटेनर का परीक्षण कर रहा था, तो मैंने शायद USER कमांड को कमेंट कर दिया था। बहुत मेटा, cnitch ने cnitch में एक समस्या खोजने में मदद की – यह पूरी तरह से इंटीग्रेशन टेस्ट में शामिल होने वाला है।
cnitch Docker Engine से API के माध्यम से जुड़ता है और वर्तमान में चल रहे कंटेनरों की जानकारी प्राप्त करता है, फिर इस कंटेनर के अंदर चल रही प्रक्रियाओं का निरीक्षण करता है और उन प्रक्रियाओं की पहचान करता है जो root उपयोगकर्ता के रूप में चल रही हैं।
जब कोई root प्रक्रिया मिलती है, तो यह जानकारी कॉन्फ़िगर करने योग्य रिपोर्टिंग मॉड्यूल को भेजी जाती है, जिससे आप इस जानकारी का ऑडिट कर सकते हैं या उस पर कार्रवाई कर सकते हैं।
2017/07/29 16:04:27 Starting Cnitch: Monitoring Docker Processes at: tcp://172.16.255.128:2376
2017/07/29 16:04:27 Checking for root processes every: 10s
2017/07/29 16:05:08 Checking image: ubuntu, id: 7bd489560a310343c39186500daa680290289c27f7a730524a31355a3aaf0430
2017/07/29 16:05:08 >> WARNING: found process running as root: tail -f /dev/null pid: 365
वर्तमान में cnitch में StatsD और StdOut पर रिपोर्ट करने की क्षमता है। रिपोर्टिंग बैकएंड एक्सटेंसिबल हैं ताकि किसी भी बैकएंड को समर्थन देना आसान हो, उदाहरण के लिए, log stash या किसी अन्य लॉग फ़ाइल एग्रीगेशन टूल के लिए बैकएंड बनाना काफी सरल होगा।
अपवादों को statsD एंडपॉइंट पर एक काउंट के रूप में cnitch.exception.root_process मीट्रिक का उपयोग करके भेजा जाता है। मीट्रिक को cnitch इंस्टेंस के host नाम और container नाम से भी टैग किया जाता है।
StdOut लॉगर एक सरल आउटपुट लॉगर है जो रिपोर्ट किए गए अपवादों को StdOut पर भेजता है।
चाहे आप cnitch को Docker कंटेनर में चलाएँ या बाइनरी के रूप में, इसे Docker API तक पहुँचने की आवश्यकता है। यह सर्वर का URL या सॉकेट का पथ DOCKER_HOST पर्यावरण चर के माध्यम से सेट करता है।
--hostname=[hostname] – मीट्रिक एकत्रीकरण के लिए उपयोग किया जाने वाला नाम या IP पता--statsd-server=[hostname:port] – statsd कलेक्टर का URI; यदि इसे छोड़ दिया जाए, तो statsd रिपोर्टिंग अक्षम हो जाएगी--check=[duration उदा. 10s (10 सेकंड), 1m (1 मिनट)] – वह आवृत्ति जिस पर snitch root प्रक्रियाओं के लिए स्कैन करेगाDOCKER_HOST पर्यावरण चर को अपने Docker Engine API पर सेट करें, फिर आवश्यक फ़्लैग्स के साथ snitch चलाएँ।
$ cnitch --hostname=myhost --statsd-server=127.0.0.1:8125 --check=10s
cnitch एक गैर-विशेषाधिकार प्राप्त कंटेनर में चलता है, और यदि आप API तक पहुँचने के लिए Docker sock का उपयोग करना चाहते हैं, तो आपको cnitch उपयोगकर्ता को docker समूह में जोड़ना होगा। यह फ़्लैग --group-add के माध्यम से प्राप्त किया जा सकता है, इसे docker उपयोगकर्ता समूह के समूह आईडी पर सेट करें।
उदाहरण के लिए:
--group-add=$(stat -f "%g" /var/run/docker.sock)
API पहुँच के लिए Docker sock फ़ाइल का उपयोग करने का उदाहरण
$ docker run -i -t --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
--group-add=$(stat -f "%g" /var/run/docker.sock) \
-e "DOCKER_HOST:unix:///var/run/docker.sock" \
quay.io/nicholasjackson/cnitch [options]
यदि आप मैक पर हैं और Docker Machine का उपयोग कर रहे हैं, तो Docker sock VM के अंदर है, जिसका अर्थ है कि आप समूह आईडी खोजने के लिए stat कमांड का उपयोग नहीं कर सकते।
./example फ़ोल्डर के अंदर एक उदाहरण Docker Compose स्टैक है जो दिखाता है कि cnitch statsd में डेटा कैसे निर्यात करता है। इस उदाहरण को चलाने के लिए:
$ cd ./example
$ docker-compose up
एक बार सब कुछ चलने के बाद, अपने वेब ब्राउज़र में http://[docker host ip]:3000 खोलें, और आपको Grafana लॉगिन स्क्रीन दिखाई देनी चाहिए।

निम्नलिखित क्रेडेंशियल्स का उपयोग करके Grafana में लॉग इन करें:
फिर cnitch डैशबोर्ड चुनें। यह डैशबोर्ड वर्तमान चल रही root प्रक्रियाओं को दर्शाता है।

यदि आप अपने Docker होस्ट के साथ संचार करने के लिए /var/run/docker.sock का उपयोग नहीं कर रहे हैं, तो आपको अपनी सेटिंग्स से मेल खाने के लिए ./example/docker-compose.yml फ़ाइल के अंदर कुछ सेटिंग्स बदलनी होंगी।
Docker Bench Security Script https://github.com/docker/docker-bench-security से सुविधाओं को लागू करें
[ ] 1.1 सुनिश्चित करें कि कंटेनरों के लिए एक अलग विभाजन बनाया गया है
[ ] 1.2 सुनिश्चित करें कि कंटेनर होस्ट को कठोर बनाया गया है
[ ] 1.3 सुनिश्चित करें कि Docker अद्यतित है
[ ] 1.4 सुनिश्चित करें कि केवल विश्वसनीय उपयोगकर्ताओं को Docker डेमॉन को नियंत्रित करने की अनुमति है
[ ] 1.5 सुनिश्चित करें कि Docker डेमॉन के लिए ऑडिटिंग कॉन्फ़िगर की गई है
[ ] 1.6 सुनिश्चित करें कि Docker फ़ाइलों और निर्देशिकाओं - /var/lib/docker के लिए ऑडिटिंग कॉन्फ़िगर की गई है
[ ] 1.7 सुनिश्चित करें कि Docker फ़ाइलों और निर्देशिकाओं - /etc/docker के लिए ऑडिटिंग कॉन्फ़िगर की गई है
[ ] 1.8 सुनिश्चित करें कि Docker फ़ाइलों और निर्देशिकाओं - docker.service के लिए ऑडिटिंग कॉन्फ़िगर की गई है
[ ] 1.9 सुनिश्चित करें कि Docker फ़ाइलों और निर्देशिकाओं - docker.socket के लिए ऑडिटिंग कॉन्फ़िगर की गई है
[ ] 1.10 सुनिश्चित करें कि Docker फ़ाइलों और निर्देशिकाओं - /etc/default/docker के लिए ऑडिटिंग कॉन्फ़िगर की गई है
[ ] 1.11 सुनिश्चित करें कि Docker फ़ाइलों और निर्देशिकाओं - /etc/docker/daemon.json के लिए ऑडिटिंग कॉन्फ़िगर की गई है
[ ] 1.12 सुनिश्चित करें कि Docker फ़ाइलों और निर्देशिकाओं - /usr/bin/docker-containerd के लिए ऑडिटिंग कॉन्फ़िगर की गई है
[ ] 1.13 सुनिश्चित करें कि Docker फ़ाइलों और निर्देशिकाओं - /usr/bin/docker-runc के लिए ऑडिटिंग कॉन्फ़िगर की गई है
[ ] 2.1 सुनिश्चित करें कि डिफ़ॉल्ट ब्रिज पर कंटेनरों के बीच नेटवर्क ट्रैफ़िक प्रतिबंधित है
[ ] 2.2 सुनिश्चित करें कि लॉगिंग स्तर 'info' पर सेट है
[ ] 2.3 सुनिश्चित करें कि Docker को iptables में बदलाव करने की अनुमति है
[ ] 2.4 सुनिश्चित करें कि असुरक्षित रजिस्ट्रियों का उपयोग नहीं किया गया है
[ ] 2.5 सुनिश्चित करें कि aufs स्टोरेज ड्राइवर का उपयोग नहीं किया गया है
[ ] 2.6 सुनिश्चित करें कि Docker डेमॉन के लिए TLS प्रमाणीकरण कॉन्फ़िगर किया गया है
[ ] 2.7 सुनिश्चित करें कि डिफ़ॉल्ट ulimit उपयुक्त रूप से कॉन्फ़िगर किया गया है
[ ] 2.8 उपयोगकर्ता नेमस्पेस समर्थन सक्षम करें
[ ] 2.9 सुनिश्चित करें कि डिफ़ॉल्ट cgroup उपयोग की पुष्टि की गई है
[ ] 2.10 सुनिश्चित करें कि बेस डिवाइस का आकार आवश्यकता होने तक नहीं बदला गया है
[ ] 2.11 सुनिश्चित करें कि Docker क्लाइंट कमांड के लिए प्राधिकरण सक्षम है
[ ] 2.12 सुनिश्चित करें कि केंद्रीकृत और दूरस्थ लॉगिंग कॉन्फ़िगर की गई है
[ ] 2.13 सुनिश्चित करें कि लीगेसी रजिस्ट्री (v1) पर संचालन अक्षम है
[ ] 2.14 सुनिश्चित करें कि लाइव रिस्टोर सक्षम है
[ ] 2.15 सुनिश्चित करें कि यूजरलैंड प्रॉक्सी अक्षम है
[ ] 2.16 सुनिश्चित करें कि डेमॉन-वाइड कस्टम seccomp प्रोफ़ाइल लागू की गई है, यदि आवश्यक हो
[ ] 2.17 सुनिश्चित करें कि प्रोडक्शन में प्रयोगात्मक सुविधाओं से बचा गया है
[ ] 2.18 सुनिश्चित करें कि कंटेनरों को नए विशेषाधिकार प्राप्त करने से प्रतिबंधित किया गया है
[ ] 3.x ...
[x] 4.1 सुनिश्चित करें कि कंटेनर के लिए एक उपयोगकर्ता बनाया गया है
[ ] 4.2 सुनिश्चित करें कि कंटेनर विश्वसनीय बेस इमेज का उपयोग करते हैं
[ ] 4.3 सुनिश्चित करें कि कंटेनर में अनावश्यक पैकेज स्थापित नहीं हैं
[ ] 4.4 सुनिश्चित करें कि इमेज को स्कैन किया गया है और सुरक्षा पैच शामिल करने के लिए पुनर्निर्मित किया गया है
[ ] 4.5 सुनिश्चित करें कि Docker के लिए कंटेंट ट्रस्ट सक्षम है
[ ] 4.6 सुनिश्चित करें कि कंटेनर इमेज में HEALTHCHECK निर्देश जोड़े गए हैं
[ ] 4.7 सुनिश्चित करें कि Dockerfile में अकेले अपडेट निर्देश का उपयोग नहीं किया गया है
[ ] 4.8 सुनिश्चित करें कि इमेज में setuid और setgid अनुमतियाँ हटा दी गई हैं
[ ] 4.9 सुनिश्चित करें कि Dockerfile में ADD के बजाय COPY का उपयोग किया गया है
[ ] 4.10 सुनिश्चित करें कि Dockerfiles में रहस्य संग्रहीत नहीं हैं
[ ] 4.11 सुनिश्चित करें कि केवल सत्यापित पैकेज स्थापित हैं
[ ] 5.x ...
[ ] 6.x ...
[ ] 7.x ...