Docker: أفضل ممارسات أمان الحاويات

آخر تحديث: 2026-08-26

أمان الحاويات ليس اختياريًا — كل طبقة، من الصورة إلى وقت التشغيل، تحتاج إلى تأمين.

1. ما ستتعلمه



2. قصة عن تدقيق أمني

(1) نقطة الألم: 28 تنبيه تدقيق أمني

تلقى فريق تشارلي تقرير تدقيق أمني: 28 تنبيهًا تضمنت "حاويات تعمل كـ root" (خطر عالٍ)، "الصورة تحتوي على 15 ثغرة CVE عالية الخطورة" (خطر عالٍ)، و"أسرار مخزنة في متغيرات البيئة" (خطر متوسط). كانت درجة التدقيق 45 فقط؛ يجب رفعها إلى 80 أو أعلى لتحقيق الامتثال.

(2) نهج منهجي لتأمين الأمان

قاد تشارلي فريقه في معالجة المشكلات واحدة تلو الأخرى: مستخدمون غير root، فحوصات Trivy لإصلاح CVEs، التحول إلى Docker Secrets، واستخدام seccomp لتقييد استدعاءات النظام.

BASH
# تأمين الأمان: غير root + صلاحيات دنيا
docker run -d \
  --user 1000:1000 \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  --security-opt no-new-privileges \
  --read-only \
  myapp:1.0

(3) النتائج: درجة التدقيق 45←92

بعد التأمين المنهجي، تحسنت درجة التدقيق من 45 إلى 92، وتم حل جميع المشكلات عالية الخطورة.



3. نموذج أمان الحاويات متعدد الطبقات

(1) الأمان متعدد الطبقات

100%
graph TB
    L6["6. إدارة الأسرار<br/>Docker Secret / Vault"] --> L5["5. الأمن السيبراني<br/>عزل الشبكة / TLS"]
    L5 --> L4["4. أمان وقت التشغيل<br/>seccomp / AppArmor / capabilities"]
    L4 --> L3["3. أمان الصور<br/>الفحص / التوقيع / التصغير"]
    L3 --> L2["2. أمان Docker Daemon<br/>TLS / صلاحيات المستخدم"]
    L2 --> L1["1. أمان المضيف<br/>تأمين نظام التشغيل / تحديث النواة"]

(1) مقارنة مستويات الأمان

المستوى إجراءات التأمين التأثير
0 التكوين الافتراضي تنبيهات عديدة
1 غير root + أحدث وسم أمان أساسي
2 + فحص الصور + إصدار ثابت أمان متوسط
3 + صلاحيات دنيا + seccomp أمان جيد
4 + DCT + إدارة الأسرار أمان عالٍ
5 + عزل الشبكة + سجلات التدقيق أمان أقصى


4. فحص ثغرات الصور

▶ مثال: فحص الصور باستخدام Trivy (الصعوبة: ⭐⭐)

BASH
# تثبيت Trivy (Linux)
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh

# فحص صورة بحثًا عن الثغرات
trivy image nginx:1.25-alpine

# فحص مع مرشح الخطورة
trivy image --severity HIGH,CRITICAL nginx:1.25-alpine

# فحص وإخراج JSON
trivy image --format json --output report.json myapp:1.0
💻 المخرجات (مقتطف):

TEXT 📖 للعرض فقط
nginx:1.25-alpine (alpine 3.19.0)
=========================
Total: 5 (HIGH: 2, CRITICAL: 0)

┌──────────┬────────────┬──────────┬──────────┬─────────────────┐
│ Library  │ Vulnerability│ Severity │ Version  │ Fixed Version   │
├──────────┼────────────┼──────────┼──────────┼─────────────────┤
│ libcurl  │ CVE-2023-xxxx│ HIGH     │ 8.4.0    │ 8.5.0           │
│ openssl  │ CVE-2023-yyyy│ HIGH     │ 3.1.3    │ 3.1.4           │
└──────────┴────────────┴──────────┴──────────┴─────────────────┘

▶ مثال: فحص Docker Scout (الصعوبة: ⭐⭐)

BASH
# Docker Scout (مدمج في Docker Desktop)
docker scout quickview nginx:latest

# تقرير CVE مفصل
docker scout cves nginx:latest

# مقارنة صورتين
docker scout compare --from nginx:1.24 --to nginx:1.25


5. مبدأ الحد الأدنى من الصلاحيات

(1) قدرات Linux (Capabilities)

القدرة الوظيفة المتطلبات الشائعة
NET_BIND_SERVICE الارتباط بمنافذ <1024 خدمات الويب (80/443)
NET_RAW حزم الشبكة الخام ping / تصحيح الشبكة
CHOWN تغيير مالك الملف إدارة الملفات
SETUID / SETGID تبديل المستخدم بعض أدوات النظام
ALL جميع القدرات ❌ لا تستخدم

▶ مثال: --cap-drop للحد الأدنى من الصلاحيات (الصعوبة: ⭐⭐⭐)

BASH
# إسقاط جميع القدرات، وإضافة الضرورية فقط
docker run -d \
  --name secure-app \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  --security-opt no-new-privileges \
  -p 80:8080 \
  myapp:1.0
المعامل الوظيفة
--cap-drop ALL إزالة جميع قدرات Linux
--cap-add NET_BIND_SERVICE إضافة القدرة على الارتباط بالمنافذ المنخفضة فقط
--security-opt no-new-privileges منع تصعيد الصلاحيات (setuid/setgid)
--read-only نظام ملفات للقراءة فقط (يتطلب tmpfs)
🔒 الأمان: --privileged يمنح الحاويات تقريبًا جميع صلاحيات المضيف — لا تستخدم هذا أبدًا في بيئة الإنتاج. استخدام --cap-drop ALL + --cap-add حسب الحاجة يجسد مبدأ الحد الأدنى من الصلاحيات.



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

▶ مثال: seccomp يقيد استدعاءات النظام (الصعوبة: ⭐⭐⭐)

BASH
# التشغيل بملف تعريف seccomp مخصص
docker run -d \
  --security-opt seccomp=chrome.json \
  --name browser \
  chromium:latest

(1) seccomp الافتراضي في Docker

يأتي Docker مع ملف تكوين seccomp افتراضي يعطل حوالي 44 استدعاء نظام خطيرًا (مثل mount و keyctl و add_key). تعمل معظم التطبيقات بشكل طبيعي مع التكوين الافتراضي.

▶ مثال: توقيع Docker Content Trust (الصعوبة: ⭐⭐)

BASH
# تمكين DCT للجلسة الحالية
export DOCKER_CONTENT_TRUST=1

# دفع صورة موقعة
docker push myorg/myapp:v1.0

# سحب: DCT يتحقق من التوقيع
docker pull myorg/myapp:v1.0

# سحب صورة غير موقعة: مرفوض (مع تمكين DCT)
docker pull myorg/myapp:unsigned
# Error: No trust data for unsigned


7. إدارة الأسرار الآمنة

(1) مقارنة ثلاث طرق لإدارة الأسرار

الطريقة مستوى الأمان الرؤية السيناريوهات المناسبة
متغيرات البيئة (-e) منخفض docker inspect مرئي بيئة التطوير
ملفات وحدات التخزين (-v) متوسط مرئي لملفات المضيف خطة انتقالية
Docker Secret عالٍ تخزين مشفر، تركيب وقت التشغيل بيئة إنتاج Swarm
Vault خارجي أقصى إدارة مركزية + تدقيق مستوى المؤسسات


8. معيار CIS Docker

▶ مثال: فحص خط أساس الأمان Docker Bench (الصعوبة: ⭐⭐)

BASH
# تشغيل فحص CIS Docker Benchmark
docker run --rm --net host --pid host \
  --userns host --cap-drop audit_control \
  -e DOCKER_CONTENT_TRUST=$DOCKER_CONTENT_TRUST \
  -v /etc:/etc:ro \
  -v /lib/systemd/system:/lib/systemd/system:ro \
  -v /usr/bin/containerd:/usr/bin/containerd:ro \
  -v /usr/bin/runc:/usr/bin/runc:ro \
  -v /usr/lib/systemd:/usr/lib/systemd:ro \
  -v /var/lib:/var/lib:ro \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  docker/docker-bench-security
💻 المخرجات (مقتطف):

TEXT 📖 للعرض فقط
[INFO] 1 - Host Configuration
[INFO] 1.1  - Ensure Docker is up to date
[PASS] 1.2  - Ensure only trusted users are allowed to control Docker daemon
[WARN] 1.4  - Ensure a separate partition for containers has been created

[INFO] 4 - Container Images
[PASS] 4.1  - Ensure a user for the container has been created
[WARN] 4.7  - Ensure HEALTHCHECK instructions have been added
[WARN] 4.9  - Ensure COPY is used instead of ADD


9. مثال كامل: تأمين كامل لحاويات الإنتاج

BASH
# ============================================
# شرح كامل: تأمين حاوية الإنتاج
# من درجة التدقيق 45 ← 92
# ============================================

# الخطوة 1: فحص الثغرات
trivy image --severity HIGH,CRITICAL myapp:1.0
# إصلاح: تحديث الصورة الأساسية، تثبيت الإصدارات

# الخطوة 2: التشغيل بأقصى قيود الأمان
docker run -d \
  --name hardened-app \
  --user 1000:1000 \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  --security-opt no-new-privileges \
  --security-opt seccomp=default.json \
  --read-only \
  --tmpfs /tmp:rw,noexec,nosuid \
  --tmpfs /run:rw,noexec,nosuid \
  -v app-logs:/app/logs \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  --health-cmd="curl -f http://localhost:8080/health || exit 1" \
  --health-interval=30s \
  --health-retries=3 \
  -p 8080:8080 \
  myapp:hardened

# الخطوة 3: التحقق من تكوين الأمان
docker inspect hardened-app --format='
User: {{.Config.User}}
ReadOnly: {{.HostConfig.ReadonlyRootfs}}
Capabilities: {{.HostConfig.CapAdd}}
NoNewPrivileges: {{.HostConfig.SecurityOpt}}
'

# الخطوة 4: تشغيل معيار CIS
docker run --rm ... docker/docker-bench-security

# الخطوة 5: إعادة الفحص بعد التأمين
trivy image myapp:hardened

❓ أسئلة شائعة

س هل يمكن عزل حاويات Docker بالكامل؟
ج لا. الحاويات تشارك نواة المضيف، وقد تؤدي ثغرات النواة إلى هروب الحاوية. ومع ذلك، توفر الحاويات عزلًا على مستوى العملية (namespace + cgroup + seccomp + AppArmor)، مما يقلل بشكل كبير من سطح الهجوم. نقاط رئيسية: لا تستخدم خيار --privileged، لا تشغل كـ root، وقم بتحديث النواة فورًا.
س ما هي مخاطر استخدام --privileged؟
ج --privileged يمنح الحاوية تقريبًا جميع صلاحيات المضيف: الوصول إلى جميع الأجهزة، القدرة على تعديل معلمات النواة، تحميل وحدات النواة، وتجاوز seccomp/AppArmor. هذا بشكل أساسي مثل تشغيل برنامج مباشرة على المضيف. لا تستخدم --privileged أبدًا في بيئة الإنتاج.
س ما الأدوات التي يجب استخدامها لفحص ثغرات الصور؟
ج Trivy (مفتوح المصدر، الأكثر شيوعًا) أو Docker Scout (مدمج في Docker Desktop). ادمج في CI/CD: إجراء فحوصات تلقائية بعد البناء ومنع النشر إذا تم اكتشاف ثغرات CRITICAL. نوصي بفحص صور الإنتاج يوميًا وإعادة بنائها فورًا بعد إصدار CVEs جديدة.
س ما المشكلة في تخزين الأسرار في متغيرات البيئة؟
ج هناك ثلاثة مخاطر: ① docker inspect متغيرات البيئة مرئية لأي شخص؛ ② العمليات الفرعية ترث متغيرات البيئة؛ ③ قد تُطبع متغيرات البيئة عن طريق الخطأ في السجلات. Docker Secrets (Swarm) تُخزن بشكل مشفر وتُركب كملفات مؤقتة في وقت التشغيل، وهو أكثر أمانًا. في البيئات غير Swarm، استخدم HashiCorp Vault.
س هل وضع rootless آمن؟
ج إنه آمن جدًا. Docker Rootless يشغل كامل Docker daemon كمستخدم عادي، لذا حتى إذا كان Docker نفسه به ثغرة، فلن يحصل المهاجم سوى على صلاحيات مستخدم عادي. ومع ذلك، وضع rootless له بعض القيود (لا خيار --privileged، تكوين شبكة مقيد). يوصى بوضع rootless لبيئات الإنتاج.

📖 ملخص


📝 تمارين

  1. تمرين أساسي (الصعوبة: ⭐): شغل فحص Docker Bench Security على جهازك المحلي وسجل أي تنبيهات من مستوى WARN.
  2. تحدٍ متقدم (الصعوبة: ⭐⭐): استخدم Trivy لفحص صورة موجودة وأصلح جميع ثغرات مستوى CRITICAL.
  3. تحدٍ (الصعوبة: ⭐⭐⭐): أنشئ حاوية بقيود seccomp وتحقق من أن القيود سارية (مثلاً، تعطيل استدعاء النظام mount).
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%