الدرس 24: المستخدمون غير الجذريون (Non-Root Users) وأفضل ممارسات أمان الحاويات
يجب أن يكون الأمان أولوية. بشكل افتراضي، تعمل العمليات داخل حاوية Docker كمستخدم root، وهو خطر أمني كبير.
مشكلة المستخدم الجذري (Root)
إذا سيطر فاعل خبيث على حاوية تعمل كمستخدم root، فقد يستغل ثغرة أمنية في خفي Docker أو نواة Linux للحصول على وصول root إلى الجهاز المضيف.
الحل: تعليمة USER
تقوم تعليمة USER في Dockerfile بتعيين المستخدم (بالاسم أو UID) الذي سينفذ جميع الأوامر اللاحقة (RUN, CMD, ENTRYPOINT).
مثال: إنشاء واستخدام مستخدم مخصص
-
إنشاء المستخدم والمجموعة: dockerfile FROM alpine:latest
إنشاء مجموعة ومستخدم غير جذري
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
التأكد من أن المستخدم الجديد يمتلك دليل التطبيق
RUN chown -R appuser:appgroup /app
التبديل إلى المستخدم غير الجذري
USER appuser
سيتم الآن تشغيل CMD كمستخدم 'appuser'
CMD ["node", "server.js"]
-
استخدام المستخدمين المجهزين مسبقاً: توفر العديد من الصور الأساسية (مثل Node.js، Python، أو Alpine) بالفعل مستخدمين غير جذريين يمكنك التبديل إليهم على الفور، مثل
nodeأوpython.dockerfile FROM node:20-slim
التبديل مباشرة إلى المستخدم الذي توفره الصورة الأساسية
USER node
WORKDIR /home/node/app COPY . .
CMD ["npm", "start"]
نصائح أمنية أخرى
- استخدم صوراً أساسية صغيرة: استخدم صور
alpineأوslimبدلاً من صور نظام التشغيل الكاملة (مثلubuntu) لتقليل سطح الهجوم. - استخدم البناء متعدد المراحل (الدرس 21): تخلص من أدوات البناء غير الضرورية من الصورة النهائية.
- تقييد الإمكانيات: استخدم العلامة
--cap-dropأثناءdocker runلإزالة إمكانيات النواة غير الضرورية من الحاوية.