السلام عليكم ورحمة الله
شرحت سابقا كيف تثبت 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

