مستوى المقال: مبتدئ. الشرح يفترض إنك تعرف Pod و Service و Namespace في Kubernetes، ومش محتاج خبرة سابقة بـ NetworkPolicy.
لو attacker وصل لـ pod الـ frontend بتاعك، بشكل افتراضي يقدر يفتح TCP connection مباشر على pod الـ database. الـ pod-to-pod traffic داخل الـ cluster مفتوح بالكامل في Kubernetes، ومحدش بيمنعه إلا لو حطيت NetworkPolicy. المقال ده بيشرحلك إزاي قاعدة واحدة بـ 14 سطر YAML بتقفل ده فعلياً.
NetworkPolicy في Kubernetes للمبتدئ: امنع أي Pod من التكلم مع Pod تاني بدون إذن
المشكلة باختصار
Kubernetes في الـ default بيخلّي كل pod يقدر يفتح اتصال شبكة على كل pod تاني في نفس الـ cluster، حتى لو في namespace مختلف. ده اللي بيتسمى "flat network". معناها لو الـ frontend اتعرض لـ Remote Code Execution، الـ attacker يكتب nc database-service 5432 ويتعامل مع PostgreSQL مباشرة بدون ما يعدّي على كود محمي.
تقرير CNCF Cloud Native Security Survey 2024 بيقول إن 71% من الـ clusters في الإنتاج بدون NetworkPolicy واحدة مفعّلة. ومن آخر 4 حوادث lateral movement اللي اتنشرت في تقارير Mandiant و CrowdStrike، تلاتة منهم استغلوا غياب الـ policy ده.
مثال يخليك تفهم الفكرة في 30 ثانية
تخيّل عمارة فيها 14 شقة، وكل شقة بابها بدون قفل. أي حد دخل من المدخل الرئيسي يقدر يفتح أي باب ويدخل أي شقة. ده الـ default network في Kubernetes بالظبط. الـ NetworkPolicy هي القفل اللي بتحطه على باب شقة معيّنة، وبتقول للقفل: "اسمح بدخول ساكن الشقة رقم 3 بس، أي حد تاني ارفضه".
طبعاً في الحقيقة الـ pod مش بيتعامل بأسماء، بيتعامل بـ labels. الـ NetworkPolicy بتختار pods معيّنة بـ podSelector، وبتحدد مين عنده إذن يكلمهم بـ ingress rules. الباقي كله بيتقفل تلقائياً.
التعريف الدقيق: NetworkPolicy ايه بالظبط
الـ NetworkPolicy هي Kubernetes resource من نوع networking.k8s.io/v1 بتشتغل على Layer 3 و Layer 4 من الـ OSI model. يعني بتتحكم في IP و TCP/UDP ports، ومش بتشوف HTTP headers ولا URL paths. التحكم على مستوى الـ HTTP path شغل Service Mesh (Istio، Linkerd)، مش NetworkPolicy.
اللي بيطبّق الـ policy فعلياً مش الـ Kubernetes core. الـ API server بيخزّن الـ object، لكن اللي بينفّذ على مستوى الـ packet هو الـ CNI plugin (Container Network Interface). محتاج CNI بيدعم NetworkPolicy زي Calico أو Cilium أو Weave Net. لو الـ cluster بتاعك على Flannel وحده، الـ policies هتتقبل من الـ API بدون ما يطبّق منها حاجة فعلية — وده مصدر صداع شائع.
اكتب أول NetworkPolicy في 14 سطر
سيناريو عملي: عندنا 3 components في namespace اسمه shop:
frontendpods (label:app=frontend)backendpods (label: )