أعزل حاويات دوكر باستخدام نطاق المستخدم Docker User Namespace Remapping

السلام عليكم ورحمة الله

شرحت سابقا كيف تثبت Docker و Docker-Compose وكيفيه تشغيل دوكر بدون جذر

مشكله دوكر الاساسيه انه يعطي الحاويات صلاحيات حقيقية, وبما ان الحاويات معظمها تستخدم حساب root, فلها وصول كامل للنظام.
دوكر بدون جذر هو حل كامل لهذا. لكن هناك مشكله وهي الشبكات في دوكر بدون جذر محدودة. اما اداء جيد او انك ترى مصدر الاتصال. لا يمكن الاثنين مع بعض.

هنا يأتي Docker user namespaces remapping. حل يسبق دوكر بدون جذر بالكامل, يقوم بعزل الحاويات لكن تبقى خدمة(عفريت؟) docker daemon كجذر.

كيف يعمل دوكر في هذا الوضع ؟

يقوم دوكر في هذا الوضع استخدام نطاقات مستخدمين العاديين, بحيث يقوم بعزل الحاويات دخل احد نطاقات المستخدمين بحيث root = 0 داخل الجذر تصبح 166580 خارجه مثلا.

صورة توضح الفرق بين دوكر العادي, دوكر بستخدام نطاقات المستخدمين, دوكر بدون جذر


Tõnis Tiigi : المصدر

لاحظ كيف في وضع العزل بستخدام نطاقات المستخدمين (userNS كختصار)
خدمة Docker daemon(DockerD كختصار) نعمل كرووت, لكن الحاويات معزوله.
بينما دوكر بدون جذر, DockerD و الحاويات جميعها معزوله داخل نطاق المستخدم.

ال subuid هو نطاق المستخدم, في هذه الصوره النطاق يبدء من 10000 وينتهي ب 65536.
يعني root(وهو id 0) يساوي 10000 خارجها, و1000 داخل الحاويه يساوي 11000 وهكذا حتى تصل 65536.

الا يقلل هذا الامان مقابل دوكر بدون جذر ؟

نعم, لا يوجد نقاش في هذا, دوكر بدون جذر يعمل كله معزول داخل صلاحيات المستخدم.
لكن كما ذكرت في موضوع حول دوكر بدون جذر, الشبكة فيه محدودة اما لا تكشف مصدر الاتصال او تقلل اداء الشبكة بشكل كبير.
دوكر في وضع استخدام نطاق المستخدم يعطي حل وسط.
يعزل الحاويات ويبقي نفسه كرووت. ليعطيك نفس اداء الشبكة العادي بالاضافه لكشف مصدر الاتصالات.

متطلبات مسبقة

تاكد من تثبيت حزم newuidmap newgidmap وانه هناك 65,536 id فرعي.

id -u
1001
whoami
testuser
grep ^$(whoami): /etc/subuid
testuser:231072:65536
grep ^$(whoami): /etc/subgid
testuser:231072:65536

ثبت حزمة dbus-user-session و fuse-overlayfs

ينصح باستخدام كيرنل 5.11 او احدث، او كيرنل اوبونتو

التثبيت

ثبت دوكر بالطريقة العاديه, اتبع شرح تثبيت Docker و Docker-compose

تفعيل وضع نطاقات المستخدم

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

لتفعيل وضع نطاقات المستخدم عدل ملف /etc/docker/daemon.json واضف:

{
  "userns-remap": "$(USERNAME OR ID)"
}

ضع مكان $(USERNAME OR ID) اسم المستخدم او ال ID الخاص به.
اذا تريد ان تستخدم مستخدم dockermap ضع default

هذا سوف يحذف ملف /var/lib/docker

قم باعاده تشغيل دوكر عبر

sudo systemctl restart docker

اذا استخدمت مستخدم dockermap

تاكد ان المستخدم تم انشائة

id dockremap
uid=112(dockremap) gid=116(dockremap) groups=116(dockremap)

تاكد ان تم انشاء نطاق للمستخدم

grep dockremap /etc/subuid

dockremap:231072:65536

grep dockremap /etc/subgid

dockremap:231072:65536

وانتهى التثبيت. الان بامكانك اكمال استخدام دوكر بشكل طبيعي.
في حاله لديك ملفات خارج الحاويه, يجب عليك اصلاح الصلاحيات بحيث تغير id الخاص بالملفات حسب نطاق المستخدم.

المصادر

https://medium.com/@tonistiigi/experimenting-with-rootless-docker-416c9ad8c0d6

ترخيص

هذا الموضوع يتبع ترخيص جميع مواضيع أسس وهو CC-BY-SA 4.0

إعجابَين (2)

شكرا لك فارس، هل الحاويات بشكل افتراضي تكون صلاحيات الجذر؟

نعم, Docker بشكل افتراضي يمرر الصلاحيات الحقيقية للحاوية, وهي معظم الوقت تعمل كجذر(root)

إعجاب واحد (1)