1. مبدأ أقل صلاحيات: لا تشغل كمستخدم root
# استخدام صورة أساسية موثوقة
FROM alpine:latest
# إنشاء مجموعة ومستخدم (مثلا: alomi بدلاً من root)
RUN addgroup -S alomigroup && adduser -S alomi -G alomigroup
# تحديد مجلد العمل
WORKDIR /app
# نسخ ملفات التطبيق
COPY . /app
# تغيير ملكية الملفات للمستخدم alomi
RUN chown -R alomi:alomigroup /app
# التبديل للمستخدم alomi قبل تشغيل التطبيق
USER alomi
# تشغيل التطبيق
CMD ["./your-app"]
2. بناء الصور الآمنة (Secure Image Building)
استخدام صور جاهزة من الإنترنت قد يضيف برمجيات غير ضرورية وثغرات أمنية.
أفضل الممارسات:
استخدم صورة أساسية موثوقة وبسيطة:
استخدم الصور الرسمية المحدثة
FROM alpine:3.18
# أو استخدم صور distroless للحماية القصوى
FROM gcr.io/distroless/java:11
لا تترك بيانات حساسة في الصورة:
# خطأ - لا تفعل هذا
ENV API_KEY=secret123
3. فحص الصور للثغرات الأمنية
قبل استخدام أي صورة، يجب فحصها للتأكد من عدم وجود ثغرات معروفة.
استخدام أدوات الفحص:
# فحص الصورة باستخدام Docker Scout
docker scout cves my-app:latest
# فحص باستخدام Trivy
trivy image my-app:latest
# فحص باستخدام Snyk
snyk container test my-app:latest
4. التحكم الدقيق بالصلاحيات عبر Linux Capabilities
لا تستخدم --privileged لأنه يمنح الحاوية صلاحيات كاملة مثل root. استخدم بدلاً منه التحكم الدقيق:
# إزالة جميع الصلاحيات ثم إضافة المطلوب فقط
docker run \
--cap-drop all \
--cap-add NET_BIND_SERVICE \
--cap-add CHOWN \
--security-opt no-new-privileges \
-u 1000:1000 \
my-app:latest
أمثلة على الصلاحيات الشائعة:
# للتطبيقات التي تحتاج تعديل الشبكة
--cap-add NET_ADMIN
# للتطبيقات التي تحتاج ربط المنافذ المحجوزة
--cap-add NET_BIND_SERVICE
# للتطبيقات التي تحتاج تغيير ملكية الملفات
--cap-add CHOWN
5. تشغيل الحاويات بوضع القراءة فقط (Read-Only)
شغّل الحاوية بوضع --read-only لمنع أي تعديل دائم على الملفات:
# تشغيل أساسي بوضع القراءة فقط
docker run --read-only -u alomi -it --rm image_id /bin/bash
إذا احتاج التطبيق لتخزين ملفات مؤقتة، استخدم --tmpfs:
docker run --read-only --tmpfs /var/log -u appuser -it --rm my_app_image /bin/bash
6. تقييد الموارد (Resource Limiting)
منع الحاويات من استنزاف موارد النظام:
docker run \
--memory 256m \
--memory-swap 256m \
--cpus 0.5 \
--pids-limit 100 \
--restart unless-stopped \
my-app:latest
7. العزل الشبكي المتقدم (Advanced Network Isolation)
إنشاء شبكات مخصصة:
# شبكة داخلية للخدمات الخلفية
docker network create \
--internal \
--subnet=172.20.0.0/16 \
backend-network
منع التواصل بين الحاويات:
# شبكة تمنع التواصل المباشر بين الحاويات
docker network create \
--opt "com.docker.bridge.enable_icc"="false" \
--subnet=172.22.0.0/16 \
isolated-network
8. أفضل الممارسات الإضافية
استخدام Docker Content Trust:
export DOCKER_CONTENT_TRUST=1
فحص دوري:
# مراجعة الحاويات النشطة
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
خلاصة
تأمين حاويات Docker يتطلب تطبيق مبادئ متعددة: التشغيل بصلاحيات منخفضة، بناء صور آمنة، فحص الثغرات، التحكم الدقيق بالصلاحيات، أنظمة الملفات للقراءة فقط، العزل الشبكي، تقييد الموارد، والمراقبة المستمرة. عبر تطبيق هذه الممارسات، يمكنك تقليل المخاطر بشكل كبير وتحقيق أمان فعّال لتطبيقاتك.
