الدرس 19 من 24

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

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

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

كشف وقت التشغيل وفرض السياسات والتحكم في القبول هي طبقات أساسية في أمان Kubernetes. أدوات مثل Falco وOPA/Gatekeeper وKyverno توفر الدفاع في العمق لأعباء العمل السحابية الأصلية.

كشف التهديدات في وقت التشغيل

Falco - أمان وقت التشغيل

Falco يكتشف السلوك الشاذ في وقت التشغيل بمراقبة استدعاءات النظام:

# تثبيت Falco عبر Helm
helm repo add falcosecurity https://falcosecurity.github.io/charts
helm install falco falcosecurity/falco \
  --set falco.grpc.enabled=true \
  --set falco.grpcOutput.enabled=true

قواعد الكشف الافتراضية:

# كشف shell تم تفريخه في الحاوية
- rule: Terminal shell in container
  desc: كشف تنفيذ shell في حاوية
  condition: >
    spawned_process and container and
    shell_procs and proc.tty != 0 and
    container_entrypoint
  output: >
    Shell spawned in container (user=%user.name container=%container.name
    shell=%proc.name parent=%proc.pname cmdline=%proc.cmdline)
  priority: NOTICE
  tags: [container, shell, mitre_execution]

# كشف الوصول لملفات حساسة
- rule: Read sensitive file in container
  desc: محاولة قراءة ملفات حساسة مثل /etc/shadow
  condition: >
    open_read and container and
    sensitive_files and not proc.name in (allowed_readers)
  output: >
    Sensitive file read in container (user=%user.name
    file=%fd.name container=%container.name)
  priority: WARNING
  tags: [container, filesystem, mitre_credential_access]

قواعد Falco مخصصة

# كشف تعدين العملات المشفرة
- rule: Detect crypto mining process
  desc: كشف العمليات المرتبطة بتعدين العملات
  condition: >
    spawned_process and container and
    proc.name in (xmrig, minerd, cpuminer, cgminer, bfgminer)
  output: >
    Crypto mining process detected (user=%user.name container=%container.name
    process=%proc.name cmdline=%proc.cmdline)
  priority: CRITICAL
  tags: [container, crypto, mitre_resource_hijacking]

# كشف اتصال صادر لمنافذ مشبوهة
- rule: Outbound connection to mining pool
  desc: كشف الاتصالات لمنافذ تجمعات التعدين الشائعة
  condition: >
    outbound and container and
    fd.sport in (3333, 4444, 5555, 7777, 8888, 9999)
  output: >
    Suspicious outbound connection (container=%container.name
    connection=%fd.name)
  priority: WARNING

فرض السياسات مع OPA Gatekeeper

معمارية Gatekeeper

┌─────────────────────────────────────────────────────┐
│                  Kubernetes API                      │
└──────────────────────┬──────────────────────────────┘
┌─────────────────────────────────────────────────────┐
│              Admission Webhook                       │
│  ┌─────────────────────────────────────────────┐   │
│  │            OPA Gatekeeper                    │   │
│  │  ┌──────────────┐  ┌──────────────────────┐ │   │
│  │  │ Constraint   │  │ ConstraintTemplate   │ │   │
│  │  │ (المثيل)     │  │ (تعريف السياسة)     │ │   │
│  │  └──────────────┘  └──────────────────────┘ │   │
│  └─────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────┘

تثبيت Gatekeeper

# تثبيت Gatekeeper
kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/v3.17.0/deploy/gatekeeper.yaml

# التحقق من التثبيت
kubectl get pods -n gatekeeper-system

قوالب القيود والقيود

طلب تسميات على جميع الموارد:

# ConstraintTemplate - يحدد مخطط السياسة
apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8srequiredlabels
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredLabels
      validation:
        openAPIV3Schema:
          type: object
          properties:
            labels:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredlabels

        violation[{"msg": msg}] {
          provided := {label | input.review.object.metadata.labels[label]}
          required := {label | label := input.parameters.labels[_]}
          missing := required - provided
          count(missing) > 0
          msg := sprintf("Missing required labels: %v", [missing])
        }
---
# Constraint - يطبق السياسة
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: require-team-label
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
  parameters:
    labels: ["team", "environment"]

حظر الحاويات ذات الصلاحيات:

apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8sblockprivileged
spec:
  crd:
    spec:
      names:
        kind: K8sBlockPrivileged
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8sblockprivileged

        violation[{"msg": msg}] {
          c := input.review.object.spec.containers[_]
          c.securityContext.privileged == true
          msg := sprintf("Privileged container not allowed: %v", [c.name])
        }
---
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sBlockPrivileged
metadata:
  name: block-privileged-containers
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]

Kyverno - محرك السياسات الأصلي لـ Kubernetes

مزايا Kyverno

الميزةKyvernoOPA Gatekeeper
اللغةYAML (K8s أصلي)Rego (منحنى تعلم)
التعديلمدمجقبول منفصل
التوليدإنشاء مواردغير مدعوم
التعقيدأقلأعلى

أمثلة سياسات Kyverno

طلب حدود الموارد:

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-resource-limits
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-resource-limits
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "حدود CPU والذاكرة مطلوبة"
      pattern:
        spec:
          containers:
          - resources:
              limits:
                memory: "?*"
                cpu: "?*"

إضافة تسميات تلقائياً (تعديل):

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: add-default-labels
spec:
  rules:
  - name: add-team-label
    match:
      any:
      - resources:
          kinds:
          - Pod
    mutate:
      patchStrategicMerge:
        metadata:
          labels:
            managed-by: kyverno
            +(team): platform

متحكمات القبول

متحكمات القبول المدمجة

# التحقق من متحكمات القبول الممكنة
kubectl api-versions | grep admission

# متحكمات القبول الرئيسية
# - PodSecurity (يستبدل PodSecurityPolicy)
# - ResourceQuota
# - LimitRanger
# - ValidatingAdmissionWebhook
# - MutatingAdmissionWebhook

مثال Validating Webhook

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: image-policy-webhook
webhooks:
  - name: validate.images.example.com
    admissionReviewVersions: ["v1"]
    sideEffects: None
    clientConfig:
      service:
        name: image-policy-service
        namespace: security
        path: "/validate"
    rules:
      - operations: ["CREATE", "UPDATE"]
        apiGroups: [""]
        apiVersions: ["v1"]
        resources: ["pods"]
    failurePolicy: Fail
    matchPolicy: Exact

مقارنة أدوات الأمان

القدرةFalcoGatekeeperKyverno
كشف وقت التشغيلنعملالا
التحكم في القبوللانعمنعم
لغة السياسةYAML/JSONRegoYAML
تعديل المواردلامحدودنعم
توليد المواردلالانعم
مراقبة استدعاءات النظامنعملالا

التالي، سنغطي أمان سلسلة التوريد بما في ذلك توقيع الصور وSBOM وإدارة الثغرات. :::

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

اختبار

الوحدة 5: أمان الحاويات و Kubernetes

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

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

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

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