كيف يمكنني تركيب خاص / بروك داخل مساحة الاسم داخل حاوية عامل الميناء?

لدي حاجة لإنشاء مساحات أسماء داخل حاوية عامل ميناء. وكجزء من هذا ، وسوف تحتاج إلى جبل /proc خاص بمساحة الاسم الداخلية. أدرك أنه سيتعين علي تشغيل الحاوية بامتيازات معينة لتحقيق ذلك ، لكنني أفضل تمكين الحد الأدنى من المجموعة.

هذا يعمل:

$ sudo docker run --privileged --security-opt=seccomp=unconfined \ -it fedora:rawhide /usr/bin/unshare -Ufmp -r \ /bin/sh -c 'mount -t proc proc /proc'

هذا لا:

$ sudo docker run --cap-add=sys_admin --security-opt=seccomp=unconfined \  -it fedora:rawhide /usr/bin/unshare -Ufmp -r \   /bin/sh -c 'mount -t proc proc /proc'mount: /proc: cannot mount proc read-only.

لذلك ، مجرد إيقاف مرشحات سيكومب وإضافة CAP_SYS_ADMIN لا يكفي. ماذا هو يكفي?

تحديث: سيلينو هو جزء من المشكلة. إذا قمت بإيقاف تطبيق سيلينوكس على مستوى العالم ، فإنه يعمل. ولكن ، يمكنك أيضا إيقاف التنفيذ لحاوية معينة باستخدام --security-opt label:disable، وهذا موثق في قسم تكوين الأمان في دليل عامل الإرساء عبر الإنترنت:

sudo docker run --cap-add=sys_admin --security-opt label:disable \ -it fedora:rawhide /usr/bin/unshare -fmp /bin/sh -c \ 'mount --make-private / ; mount -t proc proc /proc'

ولكن هذا فشل إذا كان -U و -r تتم إضافة الأعلام مرة أخرى إلى unshare. وبطبيعة الحال ، مضيفا --privileged إلى الأمر تشغيل عامل الميناء يعمل على ما يرام حتى مع -U و -r الأعلام.

أحاول حاليا استخدام نواة تتبع الاشياء لمعرفة ما ، بالضبط ، هو إعطائي إبيرم. انها خطأ غير محدد غير مفيد جدا للحصول على.

يعمل هذا الأمر:

sudo docker run --cap-add=sys_admin --security-opt label:disable -it fedora:rawhide /bin/sh -c 'for dir in $(awk '"'"'/\/proc\// { print $5; }'"'"' /proc/1/mountinfo ); do umount "$dir"; done; /usr/bin/unshare -Ufmp -r /bin/sh -c '"'"'mount --make-private / ; mount -t proc proc /proc ; ls /proc'"'"

لم أقسمها على أسطر متعددة لأن الاقتباس مهم حقا. في الأساس ، فإنه يزيل مجموعة كاملة من الاشياء في /proc قبل تشغيل ونشار وتصاعد /proc في مساحة اسم المستخدم التابعة.

عامل الميناء يتصاعد على مجموعة من الدلائل والملفات في /proc مع الدلائل الخاصة بها التي هي الدلائل تمفس فارغة والملفات الفارغة. ملفات مختلفة في /proc تمثل القيم التي تنطبق على النظام بأكمله. في الواقع, /proc/kcore سوف تسمح لك لقراءة ذاكرة النواة داخل الحاوية إذا كنت الجذر ، والتي ، لأن الكثير من الناس يريدون أن يصدقوا أن الحاويات هي نوع من فم خفيفة الوزن أو شيء من هذا ، من شأنه أن يفاجئ الكثير من الناس.

النواة في (اعتبارا من الإصدار 4.14 على أي حال) fs/namespace.c:mnt_already_visible يتحقق لمعرفة ما إذا كنت تقوم بتركيب نظام ملفات مثبت بالفعل ، وإذا كان نظام الملفات هذا يحتوي على أشياء مثبتة كنظم ملفات فرعية وتلك الحوامل لها علامة منت_لوكيد ، فإنه يفشل. يبدو أن العلم منت_لوكيد ليتم تطبيقها (لم أكن مطاردة حيث هذا هو في النواة) لجميع يتصاعد كلما قمت بإنشاء مساحة اسم المستخدم من أجل منعك من فك الأشياء في مساحة الاسم (لأنك تحصل على امتيازات 'داخل' مساحة اسم المستخدم) وجعل الاشياء المخفية مرئية مرة أخرى.

الأمر نشرت لي يستخدم البرنامج النصي أوك على محتويات /proc/1/mountinfo لسحب كافة الدلائل والملفات في /proc وقد شنت أن عامل الميناء على, ويفك تحميل كل منهم. هذا يجعل /proc نظام الملفات قابل للتركيب في مساحات أسماء المستخدم المتداخلة مرة أخرى.

ساميابل على قناة # دوكر على فرينود كانت مفيدة جدا هنا ، وهذا قد يكون قضية سيغروبس. يبدو أن هناك مجموعة ‘الأجهزة’.

هذا لن يساعدك ، ولكن بأمانه: أنا * حقا * مندهش هذا ليس خيار جبل ' القياسية كما يبدو شرطا شائعا جدا بالنسبة لي. أنا في حاجة إليها:)... أنا تشغيل ثنائي واحد بما في ذلك جميع مكتباتها ، لذلك ليس هناك حاجة لقاعدة س/ق في الحاوية-لذلك ليس لدي واحد ، ولكن يبدو أنها تريد /بروكلبعض الميزات. والشيء نفسه سيحدث مع الثنائيات ثابتة ، مثل تلكالذهاب` - يمكن تثبيتها دون قاعدة س/ق في حاوية. حاولت '- ت / بروك: / بروك ’ وأنها لا تساعد لسبب كنت تعطي.

هل حاولت استخدام-ت / بروك: / بروك ?

@سي 4 إف 4 تي 0 آر-حسنا ، هذا لن يفعل ما أريد. أنا لا أريد /بروك من عامل ميناء مساحة الاسم قيد التشغيل في (يفترض مساحة اسم مستوى الجذر).

@سي 4 إف 4 تي 0 آر - باستخدام فتريس ومصادر النواة وبعض التفكير الإبداعي ، اكتشفت المشكلة. security - How do I mount a private /proc inside a namespace inside a docker container? - Server Fault