تثبيت Kubernetes مع K3s: تنسيق الحاويات الخفيف
إعداد كلاستر Kubernetes أحادي ومتعدد العقد مع K3s، استخدام kubectl، إنشاء deployments وservices، إدارة التطبيقات مع Helm. دليل Kubernetes لبيئات VPS.
أفضل ممارسات أمان Docker: مستخدم غير root، نظام ملفات للقراءة فقط، ملفات seccomp، فحص الصور، أمان Docker socket، عزل الشبكة وإدارة الأسرار.
يمكن أن تحتوي حاويات Docker في إعدادها الافتراضي على ثغرات أمنية عديدة. الحاويات التي تعمل بصلاحيات root والحاويات ذات الامتيازات المفرطة والصور غير الآمنة تشكّل مخاطر جدية. في هذا الدليل سنتناول أمان Docker طبقة بطبقة.
أهم إجراء أمني أساسي: تشغيل الحاويات بمستخدم غير root.
# ممارسة سيئة — التشغيل بـ 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
# التشغيل بنظام ملفات جذر للقراءة فقط
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
# إزالة جميع الـ 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
# التشغيل بملف seccomp الافتراضي (موصى به)
docker run -d --security-opt seccomp=default myapp:latest
# ملف seccomp مخصص
docker run -d \
--security-opt seccomp=/path/to/seccomp-profile.json \
myapp:latest
# صورة ضئيلة مع بناء متعدد المراحل
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
# ربط Docker socket للقراءة فقط (للمراقبة)
docker run -d \
--name monitoring \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
monitoring-app:latest
# لا تربط Docker socket في حاويات الإنتاج أبداً!
# استخدام Docker secrets (وضع Swarm)
echo "StrongPass123!" | docker secret create db_password -
docker service create \
--name myapp \
--secret db_password \
myapp:latest
# السر متاح في /run/secrets/db_password
# فتح المنافذ الضرورية فقط
docker run -d \
--name myapp \
-p 127.0.0.1:8080:8080 \
myapp:latest
# حدود CPU والذاكرة
docker run -d \
--name myapp \
--memory 512m \
--memory-swap 512m \
--cpus 1.0 \
--pids-limit 100 \
myapp:latest
// /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 يمكنك الحفاظ على أمان بنيتك التحتية للحاويات.
مستخدم root داخل الحاوية يمكنه الحصول على صلاحيات root على المضيف في حالة وجود ثغرة container escape. كذلك يمكن للحاوية التي تعمل بـ root تعديل ملفات النظام الحرجة عن طريق الخطأ. عرّف مستخدماً غير root في Dockerfile بتوجيه USER وشغّل بمعامل --user.
Trivy هو الأداة مفتوحة المصدر الأكثر شيوعاً: docker run --rm -v /var/run/docker.sock:/var/run/docker.sock aquasec/trivy:latest image IMAGE_NAME. ادمجه في CI/CD pipeline للفحص التلقائي عند كل بناء. Docker Scout هو الأداة الرسمية من Docker ويُستخدم بـ docker scout cves IMAGE_NAME.
تقريباً أبداً. --privileged يمنح الحاوية وصولاً شبه كامل للمضيف ويُلغي جميع عزل الأمان. إذا كان ضرورياً حقاً (مثل Docker-in-Docker) استخدمه في بيئة التطوير فقط. في الإنتاج استخدم --cap-add لإضافة الـ capabilities الضرورية فقط.
ثلاث طرق: 1) ملف .env (بسيط لكن يجب إضافته إلى .gitignore)، 2) Docker secrets (يتطلب وضع Swarm، متاح في /run/secrets/)، 3) أدوات إدارة الأسرار الخارجية مثل HashiCorp Vault. لا تضمّن الأسرار أبداً في Dockerfiles أو الصور.
no-new-privileges يمنع العمليات داخل الحاوية من اكتساب امتيازات جديدة عبر ملفات setuid/setgid الثنائية. هذه طبقة حماية مهمة ضد هجمات privilege escalation. يمكن تفعيله افتراضياً لجميع الحاويات بإضافته إلى /etc/docker/daemon.json.
إعداد كلاستر Kubernetes أحادي ومتعدد العقد مع K3s، استخدام kubectl، إنشاء deployments وservices، إدارة التطبيقات مع Helm. دليل Kubernetes لبيئات VPS.
أنواع Docker volume (named, bind mount, tmpfs)، إدارة الـ volumes، أوضاع شبكات Docker (bridge, host, overlay)، إنشاء شبكات مخصصة والتواصل بين الحاويات. دليل شامل.
مشغلات سجلات Docker، أمر docker logs، سجلات pods في Kubernetes، جمع السجلات المركزي (Loki, ELK Stack)، تدوير السجلات وأفضل ممارسات إدارة السجلات في بيئة الإنتاج.