أمان الحاويات و 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 /usr/local /usr/local
COPY . /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. :::