أمان Docker: تصليب بيئة الحاويات
أفضل ممارسات أمان Docker: مستخدم غير root، نظام ملفات للقراءة فقط، ملفات seccomp، فحص الصور، أمان Docker socket، عزل الشبكة وإدارة الأسرار.
جدول المحتويات
أمان Docker: تصليب بيئة الحاويات
يمكن أن تحتوي حاويات Docker في إعدادها الافتراضي على ثغرات أمنية عديدة. الحاويات التي تعمل بصلاحيات root والحاويات ذات الامتيازات المفرطة والصور غير الآمنة تشكّل مخاطر جدية. في هذا الدليل سنتناول أمان Docker طبقة بطبقة.
1. التشغيل بمستخدم غير root
أهم إجراء أمني أساسي: تشغيل الحاويات بمستخدم غير root.
تعريف المستخدم في 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"]
تحديد المستخدم عند التشغيل
# التشغيل بمستخدم محدد
docker run -d --user 1000:1000 myapp:latest
# التشغيل بالمستخدم الحالي
docker run -d --user $(id -u):$(id -g) myapp:latest
2. نظام الملفات للقراءة فقط
# التشغيل بنظام ملفات جذر للقراءة فقط
docker run -d \
--name myapp \
--read-only \
--tmpfs /tmp \
--tmpfs /var/run \
myapp:latest
# docker-compose.yml
services:
app:
image: myapp:latest
read_only: true
tmpfs:
- /tmp
- /var/run
volumes:
- app-logs:/app/logs
3. إدارة الـ Capabilities
# إزالة جميع الـ capabilities وإضافة الضرورية فقط
docker run -d \
--name myapp \
--cap-drop ALL \
--cap-add NET_BIND_SERVICE \
myapp:latest
# لا تستخدم الوضع المميز أبداً
# docker run --privileged myapp # ممارسة سيئة
services:
app:
image: myapp:latest
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
- CHOWN
4. ملفات Seccomp
# التشغيل بملف 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 الآمنة
# صورة ضئيلة مع بناء متعدد المراحل
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"]
فحص الصور
# الفحص بـ 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
# ربط Docker socket للقراءة فقط (للمراقبة)
docker run -d \
--name monitoring \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
monitoring-app:latest
# لا تربط Docker socket في حاويات الإنتاج أبداً!
7. إدارة الأسرار
# استخدام 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. أمان الشبكة
# فتح المنافذ الضرورية فقط
docker run -d \
--name myapp \
-p 127.0.0.1:8080:8080 \
myapp:latest
9. حدود الموارد
# حدود CPU والذاكرة
docker run -d \
--name myapp \
--memory 512m \
--memory-swap 512m \
--cpus 1.0 \
--pids-limit 100 \
myapp:latest
10. أمان Docker Daemon
// /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 يمكنك الحفاظ على أمان بنيتك التحتية للحاويات.
مقالات ذات صلة
تثبيت Kubernetes مع K3s: تنسيق الحاويات الخفيف
إعداد كلاستر Kubernetes أحادي ومتعدد العقد مع K3s، استخدام kubectl، إنشاء deployments وservices، إدارة التطبيقات مع Helm. دليل Kubernetes لبيئات VPS.
إدارة Docker Volume والشبكات: التخزين الدائم وتكوين الشبكة
أنواع Docker volume (named, bind mount, tmpfs)، إدارة الـ volumes، أوضاع شبكات Docker (bridge, host, overlay)، إنشاء شبكات مخصصة والتواصل بين الحاويات. دليل شامل.
تسجيل الحاويات: إدارة سجلات Docker و Kubernetes
مشغلات سجلات Docker، أمر docker logs، سجلات pods في Kubernetes، جمع السجلات المركزي (Loki, ELK Stack)، تدوير السجلات وأفضل ممارسات إدارة السجلات في بيئة الإنتاج.