मैं डॉकर के अंदर lsof को कैसे प्रतिस्थापित कर सकता हूं (मूल, LXC- आधारित नहीं)


16

मैं कुछ परेशान हूँ कि डॉकटर कंटेनर के अंदर lsof -iकोई आउटपुट नहीं है।

उदाहरण (कंटेनर के अंदर से सभी कमांड / आउटपुट):

[1] root@ec016481cf5f:/# lsof -i
[1] root@ec016481cf5f:/# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -

कृपया यह भी ध्यान दें कि कोई PID या प्रोग्राम का नाम कैसे नहीं दिखाया गया है netstatfuserकुछ भ्रामक आउटपुट भी देता है और PID को भी इंगित नहीं कर पाता है।

क्या कोई इस पर प्रकाश डाला सकता है?

  • मैं विकल्प कैसे बना सकता हूं lsof -i( प्रक्रिया का नाम भी देख सकता हूं !)
  • क्यों उत्पादन के netstatरूप में अच्छी तरह से अपंग है?

नायब: कंटेनर के साथ चलता है "ExecDriver": "native-0.1", वह डॉकर की निष्पादन परत है, एलएक्ससी नहीं।


[1] root@ec016481cf5f:/# fuser -a4n tcp 22
Cannot stat file /proc/1/fd/0: Permission denied
Cannot stat file /proc/1/fd/1: Permission denied
Cannot stat file /proc/1/fd/2: Permission denied
Cannot stat file /proc/1/fd/3: Permission denied
Cannot stat file /proc/1/fd/255: Permission denied
Cannot stat file /proc/6377/fd/0: Permission denied
Cannot stat file /proc/6377/fd/1: Permission denied
Cannot stat file /proc/6377/fd/2: Permission denied
Cannot stat file /proc/6377/fd/3: Permission denied
Cannot stat file /proc/6377/fd/4: Permission denied
22/tcp:

(मैं उस पर आसक्त नहीं हूं Permission denied, क्योंकि वह आंकड़े हैं। जो मुझे भ्रमित करता है वह पीआईडी ​​की खाली सूची है 22/tcp।)


# lsof|awk '$1 ~ /^sshd/ && $3 ~ /root/ {print}'
sshd    6377      root  cwd   unknown                        /proc/6377/cwd (readlink: Permission denied)
sshd    6377      root  rtd   unknown                        /proc/6377/root (readlink: Permission denied)
sshd    6377      root  txt   unknown                        /proc/6377/exe (readlink: Permission denied)
sshd    6377      root    0   unknown                        /proc/6377/fd/0 (readlink: Permission denied)
sshd    6377      root    1   unknown                        /proc/6377/fd/1 (readlink: Permission denied)
sshd    6377      root    2   unknown                        /proc/6377/fd/2 (readlink: Permission denied)
sshd    6377      root    3   unknown                        /proc/6377/fd/3 (readlink: Permission denied)
sshd    6377      root    4   unknown                        /proc/6377/fd/4 (readlink: Permission denied)
sshd    6442      root  cwd   unknown                        /proc/6442/cwd (readlink: Permission denied)
sshd    6442      root  rtd   unknown                        /proc/6442/root (readlink: Permission denied)
sshd    6442      root  txt   unknown                        /proc/6442/exe (readlink: Permission denied)
sshd    6442      root    0   unknown                        /proc/6442/fd/0 (readlink: Permission denied)
sshd    6442      root    1   unknown                        /proc/6442/fd/1 (readlink: Permission denied)
sshd    6442      root    2   unknown                        /proc/6442/fd/2 (readlink: Permission denied)
sshd    6442      root    3   unknown                        /proc/6442/fd/3 (readlink: Permission denied)
sshd    6442      root    4   unknown                        /proc/6442/fd/4 (readlink: Permission denied)
sshd    6442      root    5   unknown                        /proc/6442/fd/5 (readlink: Permission denied)

जुड़े हुए उपयोगकर्ता के लिए कुछ और आउटपुट है, जो सही रूप में अच्छी तरह से पहचाना जाता है, लेकिन यह है। यह स्पष्ट रूप से असंभव है कि किस प्रकार ( lsof -iइंटरनेट सॉकेट की सीमाएं) एक निश्चित "वस्तु" है।


एक lsofरिपोर्ट क्या है ? जो उसी?
स्लम

@ एसएलएम: शानदार पूछताछ! यह इसे खाली नहीं रखता है। इसके बजाय यह (- sshd-रेल्टेड) ​​लाइनों की एक पूरी मेजबान को दिखाता है , जिनमें से कुछ टीसीपी सॉकेट हो सकते हैं, जैसा कि TYPE unknown। अजीब। मेरे सवाल पर आउटपुट लागू करना।
0xC0000022L

यदि आप strace -s 2000 -o lsof.log lsof -iइसे चलाते हैं तो संभवत: यह आपको कुछ अतिरिक्त जानकारी देगा जो अवरुद्ध हो रही है।
स्लम

1
@ एसएलएम: अच्छी बात है। मुझे याद दिलाने के लिये धन्यवाद। मैं यह कल करूँगा, हालाँकि। यह भी अच्छी तरह से संभव है कि straceकंटेनर में ही सीमित है। सीखने के लिए नया सामान रोमांचक। उछलते विचार के लिए धन्यवाद। बिस्तर मारा जाना चाहिए, यद्यपि।
0xC0000022L

FYI करें: यह भी netstat -lp को तोड़ता है। यह निश्चित रूप से apparmor के कारण होता है।
एलन रॉबर्टसन

जवाबों:


7

(नोट: यह प्रश्न में स्पष्ट नहीं है कि पूछने वाला डॉकटर कंटेनर में कैसे प्रवेश कर रहा है। मेरा मानना ​​है कि docker exec -it CONTAINER bash इसका इस्तेमाल किया गया था।)

centos:7डॉक वर्जन के साथ डॉक इमेज का उपयोग करते समय 1.9.0और इसे दूर करने के लिए मुझे यह समस्या हुई , मैं बस भाग गया:

docker exec --privileged -it CONTAINER bash

के समावेश पर ध्यान दें --privileged

इस कारण की मेरी अनुभवहीन समझ की आवश्यकता है: ऐसा लगता है कि डॉकटर यहां " दस्तावेज " के रूप में कंटेनर को अधिक "सुरक्षित" होने का प्रयास करता है


4

हह, प्लॉट मोटा होता है। यदि किसी के पास बेहतर उत्तर है तो कृपया इसे लिखें और यदि स्वीकार्य हो तो मैं इसे स्वीकार करूंगा। लेकिन यहाँ स्पष्ट कारण है। मेजबान पर लॉग फ़ाइलों को अनदेखा करने के लिए मुझे कितना लापरवाही :

Jun 12 01:29:46 hostmachine kernel: [140235.718807] audit_printk_skb: 183 callbacks suppressed
Jun 12 01:29:46 hostmachine kernel: [140235.718810] type=1400 audit(1402536586.521:477): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="trace" denied_mask="trace" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718860] type=1400 audit(1402536586.521:478): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718886] type=1400 audit(1402536586.521:479): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718899] type=1400 audit(1402536586.521:480): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718921] type=1400 audit(1402536586.521:481): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718954] type=1400 audit(1402536586.521:482): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719001] type=1400 audit(1402536586.521:483): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719043] type=1400 audit(1402536586.521:484): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719086] type=1400 audit(1402536586.521:485): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719126] type=1400 audit(1402536586.521:486): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"

ऐसा प्रतीत होता है कि अपराधी अपराधी प्रतीत होता है, हालांकि मुझे यह पता लगाना होगा कि मेजबान / कंटेनर सुरक्षा से समझौता किए बिना इसे अनुमति देने के लिए इसे कैसे समझा जाए या यह देखने के लिए कि सुरक्षा से समझौता किए बिना यह सब संभव है।



3

एक और संभावना है, इस बार एक अधिक महीन सुरक्षा सेटिंग के साथ: doS कंटेनर को SYS_PTRACE विशेषाधिकार दें:

docker run --cap-add=SYS_PTRACE ...

1
मामले में किसी की सोच की lsofआवश्यकता क्यों है CAP_SYS_PTRACE: इसे पढ़ना आवश्यक है /proc/*/stat। देखें ptrace (2)
डेविड Röthlisberger

2

मुझे भी यह समस्या लगी है। मेरे द्वारा अक्षम apparmorकरने के बाद समस्या चली गई है docker:

$ sudo aa-complain <docker apparmor profile name, "docker-default" on ubuntu>

संदर्भ url: https://help.ubuntu.com/community/AppArmor


3
आप इस उत्तर में और अधिक स्पष्टीकरण जोड़ने पर विचार कर सकते हैं (जैसे, क्या aa-complainकरता है, या कुछ प्रलेखन जो इस समाधान का समर्थन करता है)।
HalosGhost

@HalosGhost क्षमा करें, मैं इससे बिल्कुल परिचित नहीं हूं apparmor, मैंने इसे अभी तक देखा और इसे अक्षम करने का तरीका पाया। दूसरे शब्दों में, मुझे नहीं पता कि यह क्यों काम करता है या यह क्यों काम नहीं करता है। मेरा होस्ट ओएस Ubuntu 14.04 है, इसलिए मैंने "ubuntu apparmor" की खोज की और help.ubuntu.com/community/AppArmor पाया । मुझे उम्मीद है कि यह आपके लिए मददगार होगा।
मेंगन

2
मेरे पास यह मुद्दा नहीं है; मेरी चिंता आपके जवाब की गुणवत्ता के लिए थी और यह ओपी के लिए कितना उपयोगी (और सूचनात्मक) होगा।
हालोसगॉस्ट

@ हेलोसहॉस्ट आपकी मदद के लिए धन्यवाद, मैंने अपना जवाब फिर से दिया।
मेंघन

Ubuntu 14.04 पर कमांड थी sudo aa-complain /etc/apparmor.d/docker। मूल रूप से यह docker प्रक्रिया के लिए ऐप कवच को निष्क्रिय करता है जिसका अर्थ है कि docker सिस्टम पर किसी भी फाइल को पढ़ सकता है। पहले यह केवल उन्हीं फाइलों के साथ काम कर सकता था जिनकी प्रोफाइल में अनुमति थी। ऐप कवच नियमों को बदलने के लिए एक बेहतर समाधान हो सकता है जो / proc / pid / fd फ़ाइलों तक पहुंच की अनुमति देगा।
मार्टिंस बालोदिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.