Docker / Compose وعقود التشغيل الموثوقة / الدرس 10
هوية التشغيل وأقل الصلاحيات
خفف سلطة العملية المخترقة مع إبقاء الوصول الذي تحتاجه فعلاً.
في هذه الصفحة
أهداف الدرس
- راجع الهوية والقدرات ومسارات الكتابة والوصول للمحرك.
- ابن نموذجاً مقيداً دون اعتبار خيار واحد برهان أمان كامل.
ابدأ بالسلطة التي يحتاجها العمل
تحتاج API إلى مستمع مرتفع الرقم وقراءة ملفاتها، ولا تحتاج أجهزة المضيف أو نطاقاته أو مقبس Docker أو تعديل النظام. حدد ذلك قبل الخيارات. تقلل الصلاحيات آثار الاختراق لكن الحاويات تشارك النواة وتعتمد على المحرك والمضيف والتطبيق؛ فتقليل السلطة يكمل التحديث ونموذج التهديد.
يحتاج المستخدم غير الجذري إلى وصول صحيح
تختار الصورة الهوية 10001، وهو قرار تطبيق منفصل عن تشغيل المحرك rootless. يجب أن تسمح الملفات بالقراءة والكتابة المطلوبة فقط. لا يصلح اختيار مستخدم غير جذري وحدة محظورة، ويضعف رفعه إلى root لإخفاء المشكلة التصميم. راجع الخرائط والصلاحيات والتوسيم.
services:
api:
image: parcel-api:lab
user: "10001:10001"
read_only: true
tmpfs:
- /tmp
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
يحصل التطبيق على جذر للقراءة و /tmp مؤقت للكتابة. تناسبه إزالة القدرات ومنع التصعيد، وقد يحتاج غيره مجموعة مدروسة. لا يمنح النموذج مسار بيانات دائمًا ولا يدعي تطابق التنفيذ في كل المنصات.
تجنب مفاتيح التجاوز الواسعة
تقسم قدرات Linux بعض سلطة root، لكن إضافتها توسع الهجوم. ليست privileged علاجاً عادياً؛ فهي تعطل حمايات كثيرة. تغير شبكة المضيف ومشاركة PID والأجهزة والكتابة على المضيف حد الثقة. ويتيح المقبس طلب أفعال قوية؛ فلا يجعل تركيب ملفه للقراءة واجهة API للقراءة فقط.
افحص الإعداد الفعلي لا القصد وحده
يمكن تجاوز USER عند الإنشاء وتغيير الهوية والتركيبات بخيارات Compose أو المنصة. افحص حاوية موجودة مصرحاً بها وقارن بالنموذج المعتمد. لا تنشر مصفوفات البيئة أو مسارات المضيف؛ اجمع أدلة محجوبة محدودة وميّز القيود المضبوطة من السلوك المشاهد.
docker container inspect parcel-api --format '{{json .Config.User}}'
docker container inspect parcel-api --format '{{json .HostConfig.CapDrop}}'
docker container inspect parcel-api --format '{{json .HostConfig.ReadonlyRootfs}}'
تعرض القراءات إعدادات محددة دون كل البيئة. تعتمد النتيجة على الحاوية وقد تختلف عن الصورة. ولا تثبت كل تنفيذ النواة أو مناعة التطبيق؛ استخدمها جزءاً من مراجعة.
اجعل الأمان متوافقاً مع التشغيل
قد تزيل الصور المصغرة والجذر المقيد أدوات التشخيص والذاكرة القابلة للكتابة. خطط للسجلات والمؤقتات والفحوص والشهادات والأدلة قبل تقييدها. تجنب التثبيت التفاعلي كإصلاح غير موثق، وابن صورة مراجعة أو استخدم تشخيصاً معتمداً. اختبر الطلب والإغلاق والفشل بالهوية المقيدة النهائية.
الأخطاء الشائعة وإصلاحها
عولج Permission denied باستخدام privileged: true.
- لماذا يحدث؟
- مُنحت سلطة واسعة بدلاً من إصلاح التخزين.
- كيف تصلحه؟
- حدد المورد وارفع الحظر المطلوب فقط.
- كيف تتجنب تكراره؟
- عامل الوضع الاستثنائي كقرار معماري لا افتراض تشخيص.
Read-only file system.
- لماذا يحدث؟
- يكتب التطبيق مؤقتاً على الجذر المحمي.
- كيف تصلحه؟
- وفر مساراً ضيقاً يلائم عمر البيانات.
- كيف تتجنب تكراره؟
- احصر مسارات الكتابة واختبر التشغيل المقيد.
تتحكم حاوية غير جذرية بالمحرك.
- لماذا يحدث؟
- وصلت العملية إلى المقبس أو بيانات API قوية.
- كيف تصلحه؟
- أزل الوصول غير اللازم بتصميم النشر المعتمد.
- كيف تتجنب تكراره؟
- راجع قنوات التحكم الخارجية مع هوية الحاوية.
اختبر فهمك
1. لماذا لا يعني تركيب المقبس للقراءة API للقراءة؟
اعرض الحل المشروح
يتحكم نمط الملفات بتعديل المسار لا بنوع الطلبات المرسلة عبر مقبس مفتوح. قد تقبل الواجهة أفعالاً قوية. لا تمنح المقبس إلا لعمل موثوق صراحة وبمراجعة مستقلة للوصول.
2. كيف تحتفظ خدمة بالسجلات مع جذر للقراءة؟
اعرض الحل المشروح
فضل stdout/stderr منظماً عبر نظام السجلات أو موضعاً ضيقاً معتمداً عند لزوم الملفات. حدد الاحتفاظ وحماية الحقول خارج الطبقة المؤقتة، ولا تفتح الجذر كله لأن مسجل الملفات يفتقد مجلداً.
أهم ما تعلمته
- تشمل أقل الصلاحيات الهوية والتركيبات والقدرات وقنوات التحكم.
- افحص الإعداد الفعلي واختبر السلوك المطلوب ضمنه.