انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

أمان Docker: تصليب بيئة الحاويات

أفضل ممارسات أمان Docker: مستخدم غير root، نظام ملفات للقراءة فقط، ملفات seccomp، فحص الصور، أمان Docker socket، عزل الشبكة وإدارة الأسرار.

وقت القراءة: 17 dk الحاويات والتنسيق
dockerأمانحاويةseccompapparmorفحص الصورأسرارتصليب

جدول المحتويات

أمان Docker: تصليب بيئة الحاويات

يمكن أن تحتوي حاويات Docker في إعدادها الافتراضي على ثغرات أمنية عديدة. الحاويات التي تعمل بصلاحيات root والحاويات ذات الامتيازات المفرطة والصور غير الآمنة تشكّل مخاطر جدية. في هذا الدليل سنتناول أمان Docker طبقة بطبقة.

1. التشغيل بمستخدم غير root

أهم إجراء أمني أساسي: تشغيل الحاويات بمستخدم غير root.

تعريف المستخدم في Dockerfile

hljs dockerfile
# ممارسة سيئة — التشغيل بـ root
FROM node:20
WORKDIR /app
COPY . .
RUN npm install
CMD ["node", "server.js"]

# ممارسة جيدة — مستخدم غير root
FROM node:20

# إنشاء مستخدم ومجموعة
RUN groupadd -r appgroup && useradd -r -g appgroup appuser

WORKDIR /app
COPY --chown=appuser:appgroup . .
RUN npm ci --only=production

# التبديل إلى مستخدم غير root
USER appuser

CMD ["node", "server.js"]

تحديد المستخدم عند التشغيل

hljs bash
# التشغيل بمستخدم محدد
docker run -d --user 1000:1000 myapp:latest

# التشغيل بالمستخدم الحالي
docker run -d --user $(id -u):$(id -g) myapp:latest

2. نظام الملفات للقراءة فقط

hljs bash
# التشغيل بنظام ملفات جذر للقراءة فقط
docker run -d \
  --name myapp \
  --read-only \
  --tmpfs /tmp \
  --tmpfs /var/run \
  myapp:latest
hljs yaml
# docker-compose.yml
services:
  app:
    image: myapp:latest
    read_only: true
    tmpfs:
      - /tmp
      - /var/run
    volumes:
      - app-logs:/app/logs

3. إدارة الـ Capabilities

hljs bash
# إزالة جميع الـ capabilities وإضافة الضرورية فقط
docker run -d \
  --name myapp \
  --cap-drop ALL \
  --cap-add NET_BIND_SERVICE \
  myapp:latest

# لا تستخدم الوضع المميز أبداً
# docker run --privileged myapp  # ممارسة سيئة
hljs yaml
services:
  app:
    image: myapp:latest
    cap_drop:
      - ALL
    cap_add:
      - NET_BIND_SERVICE
      - CHOWN

4. ملفات Seccomp

hljs bash
# التشغيل بملف seccomp الافتراضي (موصى به)
docker run -d --security-opt seccomp=default myapp:latest

# ملف seccomp مخصص
docker run -d \
  --security-opt seccomp=/path/to/seccomp-profile.json \
  myapp:latest

5. أمان صور Docker

ممارسات Dockerfile الآمنة

hljs dockerfile
# صورة ضئيلة مع بناء متعدد المراحل
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

# صورة الإنتاج — ضئيلة
FROM node:20-alpine

# تطبيق تحديثات الأمان
RUN apk update && apk upgrade && apk add --no-cache dumb-init

# مستخدم غير root
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

WORKDIR /app
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules

USER appuser

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget -qO- http://localhost:3000/health || exit 1

ENTRYPOINT ["dumb-init", "--"]
CMD ["node", "dist/server.js"]

فحص الصور

hljs bash
# الفحص بـ Trivy (موصى به)
docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  aquasec/trivy:latest image myapp:latest

# الثغرات الحرجة والعالية فقط
docker run --rm \
  -v /var/run/docker.sock:/var/run/docker.sock \
  aquasec/trivy:latest image \
  --severity CRITICAL,HIGH \
  myapp:latest

6. أمان Docker Socket

hljs bash
# ربط Docker socket للقراءة فقط (للمراقبة)
docker run -d \
  --name monitoring \
  -v /var/run/docker.sock:/var/run/docker.sock:ro \
  monitoring-app:latest

# لا تربط Docker socket في حاويات الإنتاج أبداً!

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

hljs bash
# استخدام Docker secrets (وضع Swarm)
echo "StrongPass123!" | docker secret create db_password -

docker service create \
  --name myapp \
  --secret db_password \
  myapp:latest
# السر متاح في /run/secrets/db_password

8. أمان الشبكة

hljs bash
# فتح المنافذ الضرورية فقط
docker run -d \
  --name myapp \
  -p 127.0.0.1:8080:8080 \
  myapp:latest

9. حدود الموارد

hljs bash
# حدود CPU والذاكرة
docker run -d \
  --name myapp \
  --memory 512m \
  --memory-swap 512m \
  --cpus 1.0 \
  --pids-limit 100 \
  myapp:latest

10. أمان Docker Daemon

hljs json
// /etc/docker/daemon.json
{
  "icc": false,
  "no-new-privileges": true,
  "userns-remap": "default",
  "live-restore": true,
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

الخلاصة

أمان Docker يتطلب نهجاً متعدد الطبقات. ابدأ بمستخدم غير root ونظام ملفات للقراءة فقط وحد أدنى من الـ capabilities وفحص الصور. لا تمرر الأسرار أبداً كمتغيرات بيئة، ولا تربط Docker socket دون ضرورة، واحمِ من هجمات DoS بحدود الموارد. بهذه الإجراءات الأمنية على خوادم REXE يمكنك الحفاظ على أمان بنيتك التحتية للحاويات.