السلسلة: هذا الدرس جزء من سلسلة شهادة 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