الدرس 17 من 24

أمان الحاويات و Kubernetes

أساسيات أمان الحاويات

4 دقيقة للقراءة

الحاويات أحدثت ثورة في النشر لكنها قدمت تحديات أمنية جديدة. فهم عزل الحاويات وأمان الصور وحماية وقت التشغيل ضروري لأمان السحابة الأصلية.

مشهد تهديدات الحاويات

متجهات الهجوم الشائعة

متجه الهجوم الوصف التأثير
صور أساسية ضعيفة حزم قديمة مع CVEs معروفة اختراق الحاوية
أسرار في الصور بيانات اعتماد مشفرة في الطبقات كشف بيانات الاعتماد
حاويات ذات صلاحيات التشغيل كـ root مع وصول للمضيف الهروب للمضيف
سجلات غير آمنة السحب من مصادر غير موثوقة هجوم سلسلة التوريد
استغلال وقت التشغيل استغلال الذاكرة، حقن الكود كسر الحاوية

نموذج عزل الحاوية

┌────────────────────────────────────────────────┐
│                  نواة نظام المضيف               │
├────────────────────────────────────────────────┤
│  حاوية 1        │  حاوية 2        │  حاوية 3   │
│  ┌──────────┐   │  ┌──────────┐   │  ┌────────┐│
│  │ التطبيق  │   │  │ التطبيق  │   │  │ التطبيق││
│  │ المكتبات │   │  │ المكتبات │   │  │ المكتبات││
│  └──────────┘   │  └──────────┘   │  └────────┘│
│  Namespace      │  Namespace      │  Namespace │
│  cgroups        │  cgroups        │  cgroups   │
└────────────────────────────────────────────────┘

الحاويات تشارك نواة المضيف—العزل يعتمد على:

  • Namespaces: عزل العمليات، الشبكة، التثبيت، المستخدم
  • cgroups: حدود الموارد (CPU، الذاكرة)
  • seccomp: تصفية استدعاءات النظام
  • AppArmor/SELinux: التحكم الإلزامي في الوصول

تكوين Docker آمن

أفضل ممارسات Dockerfile

# استخدم صورة أساسية بسيطة مع إصدار محدد
FROM python:3.12-slim-bookworm AS builder

# إنشاء مستخدم غير root
RUN groupadd -r appuser && useradd -r -g appuser appuser

# تعيين دليل العمل
WORKDIR /app

# نسخ المتطلبات أولاً (تخزين مؤقت أفضل)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# مرحلة الإنتاج
FROM python:3.12-slim-bookworm

# نسخ الملفات الضرورية فقط من builder
COPY --from=builder /usr/local /usr/local
COPY --chown=appuser:appuser . /app

# لا تشغل أبداً كـ root
USER appuser

# استخدم ENTRYPOINT للأوامر الثابتة
ENTRYPOINT ["python", "app.py"]

المبادئ الرئيسية:

  • البناء متعدد المراحل لتقليل حجم الصورة
  • علامات إصدار محددة (أبداً latest)
  • تنفيذ مستخدم غير root
  • صور أساسية بسيطة (alpine، distroless، slim)

أمان Docker Daemon

# /etc/docker/daemon.json
{
  "userns-remap": "default",
  "no-new-privileges": true,
  "seccomp-profile": "/etc/docker/seccomp/default.json",
  "icc": false,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "live-restore": true
}
الإعداد الغرض
userns-remap يربط root الحاوية بمستخدم غير ذي صلاحيات على المضيف
no-new-privileges يمنع تصعيد الصلاحيات
icc: false يعطل الاتصال بين الحاويات
seccomp-profile يقيد استدعاءات النظام

أمان الصور

فحص الثغرات

Trivy - الماسح القياسي في الصناعة:

# فحص صورة محلية
trivy image myapp:latest

# فحص مع تصفية الخطورة
trivy image --severity HIGH,CRITICAL myapp:latest

# فحص وفشل خط CI إذا وجدت ثغرات
trivy image --exit-code 1 --severity CRITICAL myapp:latest

# فحص نظام الملفات (لأخطاء تكوين IaC)
trivy fs --security-checks vuln,config .

الفحص السحابي الأصلي:

# فحص AWS ECR
aws ecr start-image-scan \
    --repository-name myapp \
    --image-id imageTag=latest

# GCP Artifact Registry
gcloud artifacts docker images scan \
    gcr.io/project/myapp:latest

# Azure Container Registry
az acr repository show-manifests \
    --name myregistry \
    --repository myapp \
    --query "[].{tag:tags[0],vulnerabilities:changeableAttributes.vulnerabilityAssessment}"

توقيع الصور والتحقق

Cosign لتوقيع صور الحاويات:

# توليد زوج مفاتيح
cosign generate-key-pair

# توقيع الصورة
cosign sign --key cosign.key myregistry/myapp:latest

# التحقق من التوقيع قبل النشر
cosign verify --key cosign.pub myregistry/myapp:latest

أمان وقت التشغيل

أفضل ممارسات وقت تشغيل الحاوية

# تشغيل الحاوية مع خيارات الأمان
docker run \
    --read-only \
    --no-new-privileges \
    --cap-drop ALL \
    --cap-add NET_BIND_SERVICE \
    --security-opt="no-new-privileges:true" \
    --pids-limit 100 \
    --memory="512m" \
    --cpus="0.5" \
    myapp:latest
العلم الفائدة الأمنية
--read-only يمنع الكتابة على نظام الملفات
--cap-drop ALL يزيل جميع قدرات Linux
--cap-add يضيف فقط القدرات المطلوبة
--no-new-privileges يحظر تصعيد الصلاحيات
--pids-limit يمنع fork bombs
--memory/--cpus حدود الموارد

إدارة الأسرار

لا تضمن الأسرار في الصور أبداً:

# سيء - السر في متغير البيئة مرئي في طبقات الصورة
ENV API_KEY=secret123

# جيد - تثبيت الأسرار في وقت التشغيل
docker run -v /secrets/api_key:/run/secrets/api_key:ro myapp

# أفضل - استخدم أسرار Docker (Swarm) أو مدير أسرار خارجي
docker secret create api_key ./api_key.txt
docker service create --secret api_key myapp

قائمة تحقق أمان الحاويات

الفئة الضابط التنفيذ
الصور استخدم صور أساسية بسيطة distroless، alpine، slim
الصور افحص الثغرات Trivy، Snyk، سحابي أصلي
الصور وقع وتحقق Cosign، Notary
وقت التشغيل شغل كغير root توجيه USER
وقت التشغيل أسقط القدرات --cap-drop ALL
وقت التشغيل نظام ملفات للقراءة فقط --read-only
الأسرار إدارة خارجية Vault، أسرار السحابة
التسجيل تسجيل مركزي Fluentd، تسجيل السحابة

التالي، سنؤمن مجموعات Kubernetes مع RBAC وسياسات الشبكة وأمان الـ pods. :::

اختبار

الوحدة 5: أمان الحاويات و Kubernetes

خذ الاختبار