مستوى المقال: متوسط — يفترض إنك شغّلت Cluster Kubernetes قبل كده، وتعرف YAML و kubectl apply، ومحتاج تضيف طبقة عزل شبكي بين الـ pods.
افتراض Kubernetes الافتراضي إن أي pod في الـ cluster يقدر يكلّم أي pod تاني في أي namespace. لو حد اخترق pod بسيط زي الـ frontend، يقدر يطبع مباشرة سؤال على pod الـ database. Network Policy بتقفل الباب ده بسطر podSelector واحد، وبتمنع نسبة كبيرة من lateral movement في حادث أمني فعلي.
المشكلة باختصار
كل pod في Kubernetes بياخد IP من شبكة الـ cluster، والافتراض: الشبكة دي flat. ركّز هنا — الـ kube-proxy بيوصّل الـ TCP بين أي اتنين pods بدون ما يسأل. لو عندك microservice للـ users واتنين للتقارير وواحد للدفع، الأربعة بيكلموا بعض من غير قاعدة. Verizon Data Breach Investigations Report 2024 بيقول إن lateral movement بيظهر في حوالي 70% من الـ incidents بعد الـ initial access. يعني المشكلة مش الاختراق الأول، المشكلة المسافة اللي المهاجم يقدر يقطعها بعده.
Network Policy ببساطة قبل ما ندخل في التفاصيل
تخيّل عمارة سكنية فيها 30 شقة ومفيش أبواب بين الشقق ولا قفل على المدخل. أي حد دخل العمارة يقدر يدخل أي شقة. ده شكل الـ cluster بدون Network Policy. لما تطبّق الـ Policy ده، بتحوّل الموقف لعمارة عادية: كل شقة ليها قفل، وبتحدد بنفسها مين يدخل من خلال intercom بسيط. الفرق إن القفل مش بيتقفل تلقائي — إنت اللي بتقول للعمارة "من اليوم اقفلوا كل شقة افتراضياً، وعدّلوا قائمة المسموح لهم مع الوقت".
التعريف العلمي الدقيق: NetworkPolicy هي resource أصلية في Kubernetes API تحت networking.k8s.io/v1. بتحدد قائمة allow rules على مستوى podSelector لـ ingress (الطلبات الداخلة) و egress (الطلبات الخارجة). الافتراض implicit: لو في policy مطبقة على pod، أي طلب مش matching بيترفض. الـ policy نفسها بتنفّذها الـ CNI plugin (Calico, Cilium, Antrea). الـ kube-proxy لا بيشوف ولا بيطبّق الـ policies — ده شغل الـ CNI بالظبط.
ازاي تكتب أول NetworkPolicy
نبدأ بقاعدة شائعة جداً: السماح للـ frontend بس يكلّم الـ backend على بورت 8080، ومنع أي pod تاني. الـ frontend بـ label app=frontend والـ backend بـ app=backend.
# network-policy-backend.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-allow-frontend
namespace: production
spec:
podSelector:
matchLabels:
app: backend
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: frontend
ports:
- protocol: TCP
port: 8080
اعمل apply وافحص: