আমি কীভাবে ডকারের অভ্যন্তরে 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      -

দয়া করে নোট করুন কীভাবে কোনও পিআইডি বা প্রোগ্রামের নাম দেখানো হয় না netstatfuserকিছুটা বিভ্রান্তিকর আউটপুট দেয় এবং পিআইডিগুলি পাশাপাশি চিহ্নিত করতে অক্ষম।

কেউ কি এ বিষয়ে কোন আলোকপাত করতে পারে?

  • আমি কীভাবে বিকল্প করতে পারি 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, কারণ যে পরিসংখ্যান। আমার বিভ্রান্ত পর PIDs খালি তালিকা 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রিপোর্ট কি করে ? একই?
slm

@ এসএলএম: উজ্জ্বল তদন্ত! এটি খালি রাখে না। পরিবর্তে এটি সম্পূর্ণ হোস্টটি (এছাড়াও sshdসম্পর্কিত) লাইনগুলি দেখায় , যার মধ্যে কয়েকটি টিসিপি সকেট হতে পারে TYPE unknown। অদ্ভুত। আমার প্রশ্নের আউটপুট যুক্ত করা হচ্ছে।
0xC0000022L

আপনি যদি strace -s 2000 -o lsof.log lsof -iএটি চালনা করেন তবে সম্ভবত এটি কী অবরুদ্ধ হচ্ছে তাতে আপনাকে কিছু অতিরিক্ত অন্তর্দৃষ্টি দেবে।
slm

1
@ এসএলএম: ভালো কথা। আমাকে মনে করার জন্য ধন্যবাদ. আমি আগামীকাল এটি করব, যদিও। straceনিজেই ধারক মধ্যে সীমাবদ্ধ যে এছাড়াও ভাল সম্ভব । শিখতে আকর্ষণীয় নতুন স্টাফ। উদ্বিগ্ন ধারণা জন্য ধন্যবাদ। যদিও বিছানায় আঘাত করতে হবে।
0xC0000022L

এফওয়াইআই: এটি নেটস্ট্যাট-এলপিও ভেঙে দেয়। এটি স্পষ্টতই অ্যাপমর্ম দ্বারা সৃষ্ট।
অ্যালান রবার্টসন

উত্তর:


7

(দ্রষ্টব্য: প্রশ্নকর্তা ডকার পাত্রে কীভাবে প্রবেশ করছেন সে প্রশ্নটি এখনও পরিষ্কার নয় I'm আমি ধরে নিচ্ছি যে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

আরও সম্ভাবনা, এবার আরও সূক্ষ্ম সুরক্ষা সেটিং সহ: ডকারের ধারককে 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>

রেফারেন্স ইউআরএল: https://help.ubuntu.com/commune/appArmor


3
আপনি এই উত্তরে আরও ব্যাখ্যা যোগ করার বিষয়ে বিবেচনা করতে চাইতে পারেন (যেমন, কী aa-complainকরে বা কিছু ডকুমেন্টেশন যা এই সমাধানটিকে সমর্থন করে)।
হ্যালোগোস্ট

@ হ্যালসগোস্ট দুঃখিত, আমি এর সাথে তেমন পরিচিত নই apparmor, আমি কেবল এটি গুগল করেছিলাম এবং এটি অক্ষম করার উপায় খুঁজে পেয়েছি। অন্য কথায়, আমি জানি না কেন এটি কাজ করে বা কেন এটি কাজ করে না। আমার হোস্ট ওস উবুন্টু 14.04, সুতরাং আমি "উবুন্টু অ্যাপারর্মার" অনুসন্ধান করেছি এবং help.ubuntu.com/commune/appArmor খুঁজে পেয়েছি । আমি আশা করি এটি আপনার পক্ষে সহায়ক হবে।
মেংহান

2
আমার এই সমস্যা নেই; আমার উদ্বেগটি ছিল আপনার উত্তরের গুণমান এবং এটি ওপির পক্ষে কতটা সহায়ক (এবং তথ্যবহুল) হবে for
হ্যালোগোস্ট

@ হ্যালসগোস্ট আপনার সহায়তার জন্য ধন্যবাদ, আমি আমার উত্তরটি পুনরায় দিয়েছি।
মেঘন

উবুন্টু 14.04 এ কমান্ডটি ছিল sudo aa-complain /etc/apparmor.d/docker। মূলত এটি ডকার প্রক্রিয়াটির জন্য অ্যাপ্লিকেশন বর্মটি অক্ষম করে যার অর্থ ডক সিস্টেমের যে কোনও ফাইল পড়তে পারে। পূর্বে এটি কেবলমাত্র সেই ফাইলগুলির সাথেই কাজ করতে পারত যা প্রোফাইলগুলিতে অনুমোদিত ছিল। এর চেয়ে আরও ভাল সমাধান হতে পারে অ্যাপ্লিকেশন আর্মার নিয়মগুলিকে পরিবর্তন করা যা / proc / pid / fd ফাইলগুলিতে অ্যাক্সেসের অনুমতি দেয়।
মার্টিনস বালোডিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.