mTLS وأمان الشبكة الخدماتية
mTLS وأمان الشبكة الخدماتية
شبكات عدم الثقة داخل مجموعة Kubernetes ليست رفاهية، بل هي متطلب إنتاجي صارم في أي مؤسسة اجتازت مراجعة SOC 2 أو PCI، أو تشغّل أحمال عمل متعددة المستأجرين على بنية تحتية مشتركة. تفرض شبكة الخدمات الخاصة بها هذا الضمان بشكل شفاف: كل اتصال يُوثَّق بشكل متبادل ويُشفَّر، وتُعلَن صلاحيات الوصول كسياسات، وكل ذلك دون أن يتغير سطر واحد من كود التطبيق. يشرح هذا الدرس كيف ينفّذ Istio هذا الضمان وأين يتعطل تحت ضغط الإنتاج.
لماذا mTLS على طبقة الشبكة الخدماتية؟
بدون شبكة خدمات، يكون حركة المرور الداخلية شرق-غرب داخل المجموعة نصًا عاديًا. يستطيع حاوية مخترقة التنصت على أي خدمة تصل إليها، وتزوير عناوين IP المصدر، وانتحال هوية أحمال العمل الأخرى. يمكن لـ Kubernetes NetworkPolicy حجب تدفقات الطبقة الثالثة، لكنه لا يستطيع التحقق من الهوية على طبقة التطبيقات. يحل mTLS مشكلة الهوية: يقدم الطرفان شهادات X.509، ويُرفض الاتصال إذا عجز أحد الطرفين عن إثبات هويته، وتُشفَّر جميع البيانات باستخدام TLS 1.3.
يشفّر Istio هوية حمل العمل وفق معيار SPIFFE: تحصل كل حاوية على شهادة تتضمن اسم بديل للموضوع (SAN) بالصيغة spiffe://<trust-domain>/ns/<namespace>/sa/<service-account>. يعمل Istiod كمرجع اعتماد متوافق مع SPIFFE، يصدر شهادات قصيرة الأجل (افتراضيًا 24 ساعة، قابلة للتقليص إلى دقائق) تُجدَّد تلقائيًا بواسطة وكيل الجانب قبل انتهاء صلاحيتها.
PeerAuthentication: فرض mTLS
يعمل Istio افتراضيًا بوضع PERMISSIVE — يقبل حركة المرور العادية وكذلك mTLS لتمكين النشر التدريجي. للإنتاج، يجب التبديل إلى STRICT. يتحكم مورد PeerAuthentication في ذلك على مستوى الشبكة الكاملة، أو مساحة الأسماء، أو حمل العمل بشكل فردي.
istioctl x authz check <pod> وkubectl get peerauthentication -A بانتظام. إعداد PERMISSIVE على مستوى مساحة أسماء يتجاوز الإعداد الافتراضي للشبكة بصمت، ولن تكتشف ذلك إلا خلال تدقيق أو بعد اختراق.
سياسات التفويض: التحكم بالوصول على الطبقة السابعة
يعدّ AuthorizationPolicy جدار الحماية الخاص بـ Istio على طبقة التطبيقات. خلافًا لـ NetworkPolicy التي تعمل على L3/L4، يمكنه المطابقة على أسلوب HTTP والمسار والترويسات ومطالبات JWT والمُعرِّف SPIFFE للمُستدعي. ترتيب التقييم: تُقيَّم قواعد DENY أولًا، ثم قواعد ALLOW. يُرفض الطلب إذا طابقت أي قاعدة DENY، أو إذا لم تطابق أي قاعدة ALLOW في حال وجود سياسة ALLOW واحدة على الأقل.
مصادقة JWT مع RequestAuthentication
لحركة المرور شمال-جنوب (الدخول)، اجمع RequestAuthentication (يتحقق من توقيع JWT) مع AuthorizationPolicy (يفرض المطالبات المسموح بها). لا يرفض RequestAuthentication الطلبات الخالية من رمز مميز — يرفض فقط الطلبات التي تحمل رمزًا غير صالح. المنطق في AuthorizationPolicy هو ما يفرض وجود الرمز.
تناوب الشهادات وقابلية إضافة مراجع اعتماد خارجية
مرجع اعتماد Istiod المدمج كافٍ لبيئات التطوير أحادية المجموعة، لكن مجموعات الإنتاج الكبيرة تستخدم مرجع اعتماد خارجيًا. الخيارات:
- توقيع مرجع اعتماد وسيط: امنح Istiod شهادة وسيطة موقَّعة من شهادة المؤسسة؛ وهو يُصدر شهادات أحمال العمل مرتبطة بمرجع PKI الخاص بك. استخدم
istio-ca-secretفيistio-system. - تكامل cert-manager: استخدم وكيل
istio-csrلتحويل جميع طلبات CSR من Envoy إلى cert-manager، الذي يمكنه بدوره التواصل مع Vault أو AWS ACM PCA أو أي مرجع اعتماد متوافق مع RFC 5280. - SPIRE: للهوية متعددة المجموعات أو متعددة الأنظمة الأساسية، استبدل مرجع اعتماد Istiod بالكامل بخادم SPIRE. تُدار جميع نطاقات الثقة مركزيًا؛ وتحصل أحمال العمل على الأجهزة الافتراضية والمعدنية وKubernetes على معرّفات SPIFFE متسقة.
أنماط الفشل في الإنتاج
أكثر حوادث mTLS شيوعًا في الإنتاج:
- حاوية مُحقونة تستدعي حاوية غير مُحقونة: وضع mTLS STRICT على جانب المُستدعي، لكن الهدف بلا وكيل جانبي. يتوقف الاتصال أو يعيد خطأ TLS. الحل: حقن الحاوية الهدف، أو إضافة تجاوز PERMISSIVE لحمل العمل، أو استخدام
DestinationRuleمعtls.mode: DISABLEلذلك المضيف تحديدًا. - فحوصات الصحة على مستوى العقدة: يستدعي kubelet فحوصات liveness/readiness مباشرة دون وكيل جانبي. يُعفي Istio هذه الاستدعاءات تلقائيًا عبر webhook الخاص بـ
rewriteAppHTTPProbers. - السياسة لا تُطبَّق: محددات
AuthorizationPolicyتستخدم تسميات الحاوية؛ خطأ إملائي يجعل السياسة لا تطابق أي شيء بصمت. تحقق دائمًا باستخدامistioctl x authz check <pod-name> -n <namespace>. - انحراف الساعة يُعطّل التحقق من JWT: فحوصات
nbf/expفي JWT تتطلب مزامنة الساعات. انحراف NTP أكثر من 60 ثانية يُسبّب أخطاء 401 عشوائية.
PeerAuthentication بوضع PERMISSIVE على منافذ الجمع، أو أدرجها ضمن الشبكة الخدماتية أولًا.
التحقق من وضع الأمان
ثق لكن تحقق — تُنتج الشبكة الخدماتية البيانات اللازمة لمراجعة وضعها الأمني:
الوضع الأمني الناضج لشبكة الخدمات في الإنتاج يعني: وضع STRICT على مستوى الشبكة الكاملة، وسياسة deny-all افتراضية في كل مساحة أسماء، وسياسات ALLOW مُدارة بالنسخ في Git جنبًا إلى جنب مع ملفات التطبيق، وتناوب الشهادات في أقل من أربع ساعات، وتأكيد Kiali (أو استعلام Prometheus مخصص على istio_requests_total{connection_security_policy="mutual_tls"}) أن أكثر من 99.9% من الاستدعاءات الداخلية مُشفَّرة بـ mTLS في جميع الأوقات.