أمان السحابة والبنية التحتية

أمان الحاويات و Kubernetes

4 دقيقة للقراءة

أمان الحاويات موضوع مقابلة ساخن. يغطي هذا الدرس تقوية Docker، RBAC في Kubernetes، وأنماط أمان المجموعة.

أساسيات أمان Docker

طبقات عزل الحاويات

┌────────────────────────────────────────────────────────────┐
│                      نواة المضيف                           │
├────────────────────────────────────────────────────────────┤
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐        │
│  │ الحاوية A   │  │ الحاوية B   │  │ الحاوية C   │        │
│  │             │  │             │  │             │        │
│  │ ├─ PID NS   │  │ ├─ PID NS   │  │ ├─ PID NS   │        │
│  │ ├─ NET NS   │  │ ├─ NET NS   │  │ ├─ NET NS   │        │
│  │ ├─ MNT NS   │  │ ├─ MNT NS   │  │ ├─ MNT NS   │        │
│  │ ├─ USER NS  │  │ ├─ USER NS  │  │ ├─ USER NS  │        │
│  │ └─ cgroups  │  │ └─ cgroups  │  │ └─ cgroups  │        │
│  └─────────────┘  └─────────────┘  └─────────────┘        │
└────────────────────────────────────────────────────────────┘

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

# بناء متعدد المراحل لتقليل سطح الهجوم
FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir --target=/app/deps -r requirements.txt

# استخدام distroless لوقت تشغيل أدنى
FROM gcr.io/distroless/python3-debian12

# نسخ فقط ما هو مطلوب
COPY --from=builder /app/deps /app/deps
COPY --chown=nonroot:nonroot app.py /app/

# لا تعمل أبداً كـ root
USER nonroot

# استخدام نقطة دخول محددة
ENTRYPOINT ["python", "/app/app.py"]

قائمة فحص أمان Docker

الممارسةلماذا تهم
مستخدم غير rootيحد من تأثير هروب الحاوية
نظام ملفات للقراءة فقطيمنع التعديلات في وقت التشغيل
لا وضع مميزيمنع الوصول للمضيف
حدود الموارديمنع DoS
صورة أساسية صغيرةسطح هجوم أصغر
لا أسرار في الصوريمنع كشف بيانات الاعتماد
توقيع الصوريضمن سلامة الصورة

سؤال المقابلة

س: "ما هو هروب الحاوية وكيف تمنعه؟"

الإجابة: هروب الحاوية هو عندما يكسر المهاجم عزل الحاوية للوصول لنظام المضيف.

الوقاية:

  • لا تشغل الحاويات كـ root أبداً
  • لا تستخدم علامة --privileged أبداً
  • أسقط كل القدرات: --cap-drop=ALL
  • استخدم نظام ملفات جذر للقراءة فقط
  • فعّل ملفات seccomp و AppArmor
  • حافظ على تحديث النواة ووقت تشغيل الحاوية
  • استخدم gVisor أو حاويات Kata للأحمال عالية الأمان

أمان Kubernetes

RBAC (التحكم في الوصول المستند للأدوار)

# الدور: ما هي الإجراءات المسموحة
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: production
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources: ["pods/log"]
  verbs: ["get"]

---
# ربط الدور: من يحصل على الدور
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: production
subjects:
- kind: ServiceAccount
  name: monitoring-sa
  namespace: production
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

معايير أمان Pod

المستوىالوصفحالة الاستخدام
Privilegedلا قيودأحمال النظام فقط
Baselineقيود أدنى، يمنع التصعيدات المعروفةمعظم الأحمال
Restrictedمقيد بشدة، أفضل ممارسات الأمانالأحمال الحساسة
# فرض الأمان المقيد على مستوى مساحة الاسم
apiVersion: v1
kind: Namespace
metadata:
  name: secure-apps
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/warn: restricted

مواصفات Pod آمنة

apiVersion: v1
kind: Pod
metadata:
  name: secure-app
spec:
  securityContext:
    runAsNonRoot: true
    runAsUser: 10000
    fsGroup: 10000
    seccompProfile:
      type: RuntimeDefault

  containers:
  - name: app
    image: myapp:v1.0.0@sha256:abc123...  # تثبيت بالملخص
    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
        drop: ["ALL"]

    resources:
      limits:
        cpu: "500m"
        memory: "256Mi"
      requests:
        cpu: "100m"
        memory: "128Mi"

    volumeMounts:
    - name: tmp
      mountPath: /tmp

  volumes:
  - name: tmp
    emptyDir: {}

  automountServiceAccountToken: false  # تعطيل إذا لم يكن مطلوباً

سياسات الشبكة

# رفض افتراضي لكل حركة الدخول
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: production
spec:
  podSelector: {}
  policyTypes:
  - Ingress

---
# السماح بحركة محددة فقط
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

إدارة الأسرار في Kubernetes

# سيء: السر في YAML عادي (base64 ليس تشفير!)
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
type: Opaque
data:
  password: cGFzc3dvcmQxMjM=  # مجرد ترميز base64!

---
# جيد: استخدام مشغل الأسرار الخارجية
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: db-credentials
spec:
  refreshInterval: 1h
  secretStoreRef:
    name: aws-secrets-manager
    kind: ClusterSecretStore
  target:
    name: db-credentials
  data:
  - secretKey: password
    remoteRef:
      key: production/database
      property: password

نصيحة المقابلة: عند مناقشة أمان Kubernetes، اذكر دائماً الـ 4C للأمان السحابي الأصلي: Code (الكود)، Container (الحاوية)، Cluster (المجموعة)، Cloud (السحابة). كل طبقة تضيف دفاعاً في العمق.

في الدرس التالي، سنغطي هندسة Zero Trust. :::

مراجعة سريعة: كيف تجد هذا الدرس؟

اختبار

الوحدة 4: أمان السحابة والبنية التحتية

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.