الأمن السيبراني

Falco runtime security وaudit Kubernetes — كشف الهجمات CKS 2026

7 دقائق للقراءة

السلسلة: هذا الدرس جزء من سلسلة شهادة CKS. للحصول على نظرة شاملة، اقرأ المقال الرئيسي أولاً.

مقدمة

المجال 6 «Monitoring, Logging and Runtime Security» يزن 20% من امتحان CKS. يختبر قدرتك على كشف وحجب السلوكيات الخبيثة آنياً عند runtime — shell مفتوح في حاوية، وصول إلى /etc/shadow، mount ممتاز، تصعيد امتيازات. الأداة لا غنى عنها هي Falco، وكيل eBPF/kernel-module يفحص syscalls ويطابقها مع قواعد إعلانية. هذا الدرس يثبّت Falco على عنقود kind 1.34، يكتب قواعد مخصّصة، يدمج التنبيهات مع Falco Sidekick، ويحلّل audit logs Kubernetes للربط الزمني post-mortem.

المتطلبات

  • عنقود kind 1.34 شغّال
  • دروس CKS السابقة منتهية (OPA، Trivy)
  • 40 دقيقة

الخطوة 1 — تثبيت Falco عبر Helm

Falco يُثبَّت بسهولة عبر Helm. الـ chart الرسمي يضبط DaemonSet، RoleBindings، والإعدادات الأساسية. وضع driver يعتمد على kernel — لـ kind على Ubuntu 24.04، modern_ebpf يشتغل مباشرة بلا modules kernel.

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
bash get_helm.sh
helm version

helm repo add falcosecurity https://falcosecurity.github.io/charts
helm repo update

kubectl create namespace falco
helm install falco falcosecurity/falco \
  --namespace falco \
  --set driver.kind=modern_ebpf \
  --set falcosidekick.enabled=true \
  --set falcosidekick.webui.enabled=true

sleep 30
kubectl get pods -n falco
kubectl logs -n falco -l app.kubernetes.io/name=falco | head -20

Pods Falco يجب أن تنتقل إلى Running. السجلات الأولى تعرض «Falco initialized with configuration» وتدرج القواعد المحمَّلة افتراضياً (نحو 50 قاعدة preset). هذه القواعد تكشف السلوكيات المعروفة: shell في حاوية، إدارة حزم داخل حاوية، وصول إلى أسرار حساسة.

الخطوة 2 — تحريض كشف عبر shell في حاوية

اختبار أساسي: فتح shell تفاعلي في Pod. Falco يجب أن يكشف فوراً ويُسجّل تنبيهاً.

kubectl run target --image=nginx:1.27
sleep 5
kubectl exec -it target -- /bin/bash &
EXEC_PID=$!
sleep 3

# رؤية تنبيه Falco
kubectl logs -n falco -l app.kubernetes.io/name=falco --tail=20 | grep -i shell

kill $EXEC_PID 2>/dev/null

يجب أن ترى سطر «Notice A shell was spawned in a container with an attached terminal» مع تفاصيل Pod والصورة والمستخدم. هذا الكشف قاعدة كل تحقيقات أمن Kubernetes في الإنتاج.

الخطوة 3 — كتابة قاعدة Falco مخصّصة

القواعد المضمَّنة تغطي الحالات العامة. للكشف البزنس، نكتب قواعد مخصّصة — مُختبَرة في المجال 6 من المنهج.

cat > /tmp/falco-custom-rules.yaml <<'EOF'
customRules:
  custom-rules.yaml: |-
    - rule: Detect Curl/Wget in Container
      desc: An HTTP download tool was spawned in a container, possible reconnaissance
      condition: spawned_process and container and (proc.name in (curl, wget))
      output: HTTP tool spawned in container (user=%user.name container_id=%container.id image=%container.image.repository proc=%proc.name cmd=%proc.cmdline)
      priority: WARNING
      tags: [container, network]

    - rule: Detect Read Sensitive File
      desc: An attempt to read a sensitive file was made
      condition: open_read and container and fd.name in (/etc/shadow, /etc/sudoers, /root/.ssh/authorized_keys)
      output: Sensitive file read (user=%user.name container_id=%container.id file=%fd.name)
      priority: CRITICAL
      tags: [filesystem, sensitive]

    - rule: Detect Crypto Mining Pool Connection
      desc: Connection to a known crypto mining pool detected
      condition: outbound and (fd.sip.name endswith ".cryptopool.com" or fd.sip.name endswith ".pool.minexmr.com")
      output: Crypto mining detected (container=%container.id pool=%fd.sip.name)
      priority: CRITICAL
      tags: [crypto, network]
EOF

helm upgrade falco falcosecurity/falco \
  --namespace falco \
  --set driver.kind=modern_ebpf \
  --set falcosidekick.enabled=true \
  -f /tmp/falco-custom-rules.yaml

sleep 30

القواعد المخصّصة تُعاد تحميلها ساخنة من Falco. اختبر: kubectl exec -it target -- curl -s ifconfig.io يجب أن يُطلق تنبيه «HTTP tool spawned in container».

الخطوة 4 — ضبط Falco Sidekick لـ Slack/Mattermost

Falco Sidekick يستقبل تنبيهات Falco ويوجّهها إلى وجهات متنوّعة: Slack، Mattermost، Mail، Loki، S3، webhook مخصّص. إعداد بسيط عبر Helm values.

cat > /tmp/sidekick-values.yaml <<'EOF'
falcosidekick:
  enabled: true
  config:
    slack:
      webhookurl: "https://hooks.slack.com/services/XXX/YYY/ZZZ"
      minimumpriority: warning
    mattermost:
      webhookurl: ""
    smtp:
      hostport: "smtp.example.com:587"
      from: "falco@example.com"
      to: "soc@example.com"
EOF

تنبيه يصل إلى Slack بشكل: 🚨 [WARNING] Notice A shell was spawned in container nginx (user=root). هذا ما تستخدمه SOC الحديثة للخط الأول للاستجابة للحوادث.

الخطوة 5 — Audit logs Kubernetes للربط

Falco يكشف على مستوى syscall؛ audit logs Kubernetes تتتبّع على مستوى API. الاثنان متكاملان: Falco يرى «shell مفتوح في Pod X»، audit log يرى «kubectl exec على Pod X من user Y». الربط = من فتح shell.

tail -50 /tmp/audit/audit.log 2>/dev/null | grep -E "exec|attach" | head -3

JSONL audit log يُظهر المستخدم، الفعل (exec)، المورد (pod/target)، الطابع الزمني. مقاطَعاً مع تنبيه Falco في نفس الطابع، نُحدّد المنفّذ. هذا workflow امتحاني شائع.

الخطوة 6 — كشف runtime — ملف حساس

اختبار القاعدة المخصّصة «Detect Read Sensitive File». نُطلق Pod ونحاول قراءة /etc/shadow.

kubectl run sensitive-test --image=busybox:1.37 --command -- sleep 3600
sleep 5
kubectl exec sensitive-test -- cat /etc/shadow 2>/dev/null || echo "قراءة مرفوضة"

# رؤية تنبيه Falco
kubectl logs -n falco -l app.kubernetes.io/name=falco --tail=10 | grep -i sensitive

Falco يكشف قراءة /etc/shadow ويُسجّل تنبيهاً CRITICAL. حتى لو كان الملف بسيطاً في busybox، استدعاء open_read على هذا المسار يُعترَض ويُطابَق مع القاعدة.

الخطوة 7 — ImmutableConfigMap وحاويات غير قابلة للتغيير

المجال 6c يختبر «ensure container immutability at runtime». عملياً: ConfigMap immutable + readOnlyRootFilesystem + drop capabilities.

cat > /tmp/immutable-cm.yaml <<'EOF'
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config-frozen
data:
  app.conf: |
    log_level=info
    api_url=https://api.example.com
immutable: true
EOF

kubectl apply -f /tmp/immutable-cm.yaml

# محاولة تعديل — يجب أن تفشل
kubectl edit configmap app-config-frozen
# أو: kubectl patch cm app-config-frozen -p '{"data":{"app.conf":"changed"}}'
# خطأ "field is immutable"

الراية immutable: true على ConfigMap تمنع أي تعديل — يجب حذفها وإعادة إنشائها. هذه الخاصية تحمي من تعديلات عرَضية أو خبيثة في الإنتاج.

الخطوة 8 — Pod غير قابلة للتغيير end-to-end

دمج كل المبادئ لـ Pod immutable عند runtime.

cat > /tmp/pod-immutable.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: immutable-app
spec:
  containers:
    - name: app
      image: nginx:1.27-alpine
      ports:
        - containerPort: 80
      volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: cache
          mountPath: /var/cache/nginx
        - name: run
          mountPath: /var/run
      securityContext:
        readOnlyRootFilesystem: true
        allowPrivilegeEscalation: false
        runAsNonRoot: false
        capabilities:
          drop: ["ALL"]
  volumes:
    - name: tmp
      emptyDir: {}
    - name: cache
      emptyDir: {}
    - name: run
      emptyDir: {}
EOF

kubectl apply -f /tmp/pod-immutable.yaml
kubectl get pod immutable-app
kubectl exec immutable-app -- touch /test-write 2>&1 || echo "Filesystem read-only OK"

touch /test-write يفشل لأن filesystem الجذري read-only. volumes emptyDir مربوطة على /tmp، /var/cache/nginx، /var/run تسمح لـ nginx بالتشغيل (يحتاج كتابة pid file وcache). هذا تماماً نمط «container غير قابل للتغيير» المُختبَر في المجال 6c.

فهم الفرق eBPF وkernel module وuserspace لـ Falco

Falco يستطيع التشغيل بثلاثة drivers لفحص syscalls. kernel module (legacy) — module نواة كلاسيكي، أداء جيد لكن يطلب امتيازات وkernel متوافق. eBPF probes (CO-RE) — برامج eBPF مُحمَّلة في النواة، تشتغل على kernel 5.8+. modern_ebpf — تطبيق حديث مبني على hooks eBPF Tracepoints، الافتراضي الموصى به في 2026 لـ kernel 5.8+ مع دعم BTF.

لـ kind على Ubuntu 24.04، modern_ebpf يشتغل فوراً. لعقد إنتاج بـ kernel أقدم، البديل ebpf كلاسيكي. kernel module يبقى مستخدماً في بيئات محصورة جداً. لـ CKS v1.34، توقّع أسئلة إعداد على هذه الأوضاع الثلاثة.

أخطاء شائعة

الخطأ السبب الحل
Falco يرفض التشغيل Kernel غير متوافق مع modern_ebpf بدّل driver.kind=ebpf أو kernel-module وأعد Helm
لا تنبيه رغم shell مفتوح قاعدة «Terminal shell» معطّلة تحقّق kubectl exec falco -- falco --list لقائمة القواعد النشطة
Sidekick يستقبل التنبيهات لكن لا يوجّه Webhook URL غير صالح اختبر webhook يدوياً بـ curl قبل إعداد Falco
readOnlyRootFilesystem يكسر التطبيق التطبيق يحاول الكتابة في /var أو /tmp حدّد المسارات بـ strace ثم أضف emptyDir mounts
Audit logs فارغة Policy audit غير معدَّة تحقّق من manifest kube-apiserver لـ --audit-policy-file

دروس مرافقة

أسئلة شائعة

هل لـ Falco تكلفة على الأداء؟
مع modern_ebpf، الـ overhead نمطياً أقل من 5% CPU على عقد workers. مقبول لـ 99% من حالات الإنتاج.

هل يمكن حجب فعل بدل تسجيله فقط؟
Falco بحدّ ذاته كاشف. للحجب، أدمج Falco Talon (استجابة آلية) أو Tetragon (Cilium) الذي يستطيع قتل عملية متطابقة.

للتعمق

  • توثيق Falco: falco.org/docs
  • مكتبة قواعد المجتمع: github.com/falcosecurity/rules
  • Audit logging Kubernetes: kubernetes.io/docs/tasks/debug/debug-cluster/audit

مقالات ذات صلة

Sponsoriser ce contenu

Cet emplacement est à vous

Position premium en fin d'article — c'est l'instant où les lecteurs sont le plus engagés. Réservez cet espace pour votre marque, votre formation ou votre offre.

Recevoir nos tarifs
Publicité