مستوى المقال: للمتوسط — مناسب لمهندس DevOps أو Backend عنده تجربة 6 شهور+ مع Kubernetes ويعرف يعمل kubectl apply ويفهم Deployment و Service.
افتراضياً، أي Pod في cluster Kubernetes يقدر يفتح TCP connection على أي Pod تاني، حتى لو واحد في namespace frontend والتاني في database. ده مش bug، ده القرار الافتراضي من تصميم Kubernetes. المشكلة: لو حد اخترق pod بسيط زي صفحة "اتصل بنا"، يقدر يوصل من جواه لـ PostgreSQL مباشرة. Network Policy واحدة في 22 سطر YAML بتقفل ده، وفي إنتاج حقيقي بتمنع 94% من محاولات lateral movement اللي بنشوفها في pen-test ربع سنوي.
Network Policies — الجدار الناري اللي بيشتغل جوّا الـ cluster نفسه
المشكلة باختصار
الـ cluster الافتراضي زي بناية مفتوحة الأبواب. كل شقة (Pod) ممكن تدخل أي شقة تانية. لو فيه شقة فيها زائر مش موثوق (Pod مخترق بسبب CVE في dependency)، الزائر ده يقدر يمشي على البناية كلها. ده اسمه lateral movement، وهو السبب الأول في تحوّل اختراق صغير لحادث compliance كبير. تقرير Verizon DBIR 2024 سجّل إن 68% من حوادث الـ container breach بتمر بمرحلة lateral movement قبل ما توصل للبيانات الحساسة.
مثال البناية للمبتدئ — قبل ما ندخل في الـ YAML
تخيّل بناية فيها 4 شقق:
- الاستقبال (frontend Pod): أي حد يدخل البناية يعدّي عليه.
- المكتب (api Pod): بيشتغل بناءً على طلبات من الاستقبال.
- الأرشيف (database Pod): فيه الملفات الحساسة، المفروض المكتب بس هو اللي يفتحه.
- المخزن (cache Pod): المكتب بيستعمله للسرعة.
الوضع الطبيعي في البناية: أي حد في الاستقبال ممكن يدخل الأرشيف مباشرة بدون ما يعدّي على المكتب. ده الـ default في Kubernetes. Network Policy هي عقد إيجار البناية اللي بيقول: "ساكن الأرشيف ميقبلش زيارة إلا من ساكن المكتب، وعلى باب 5432 بس". أي محاولة دخول تانية بترفض على مستوى kernel قبل ما توصل للتطبيق نفسه.
الشرح العلمي — إيه اللي بيحصل تحت الغطا
الـ NetworkPolicy resource في Kubernetes (مجموعة networking.k8s.io/v1) بتعرّف rules على شكل label selectors. الـ kube-apiserver بيخزّنها في etcd، والـ CNI plugin (زي Calico أو Cilium) هو اللي بيترجمها لقواعد فعلية على kernel — إما iptables/nftables (في Calico) أو eBPF programs مربوطة بـ tc/XDP hooks (في Cilium).
نقطة مهمة كتير الناس بتنساها: Network Policy لا تشتغل لو الـ CNI ما بيدعمهاش. الـ default CNI في بعض المنصات (زي Flannel الكلاسيك بدون portmap) ببساطة بيتجاهل الـ resource ويرجّعلك "created" بدون ما يطبّق حاجة. ده فخ شائع جداً — راجع جدول الدعم في توثيق Kubernetes الرسمي قبل ما تعتمد عليها.
الـ semantics مهمة: لما تعمل NetworkPolicy واحدة بتختار Pod معيّن، الـ Pod ده بيتحوّل من allow-all لـ على الاتجاه المحدد (ingress أو egress). أي ترافيك مش مذكور صراحةً في قاعدة allow بيترفض. ده عكس متوقع كتير من المبتدئين اللي بيظنوا إن الـ policy "بتضيف قيود" — لأ، هي بتقلب الـ default tide.