الدرس 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.14.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

الميزة Kyverno OPA 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

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

القدرة Falco Gatekeeper Kyverno
كشف وقت التشغيل نعم لا لا
التحكم في القبول لا نعم نعم
لغة السياسة YAML/JSON Rego YAML
تعديل الموارد لا محدود نعم
توليد الموارد لا لا نعم
مراقبة استدعاءات النظام نعم لا لا

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

اختبار

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

خذ الاختبار