Open Policy Agent ولغة Rego
Open Policy Agent ولغة Rego
يُعدّ Open Policy Agent (OPA) المعيار الفعلي لتطبيق السياسات عبر المنظومة السحابية الأصيلة. بُني في الأصل بواسطة Styra ثم أُهدي إلى CNCF، وحقّق مستوى الجاهزية الإنتاجية عام 2021، وبات اليوم مدمجًا داخل وحدات تحكم استقبال Kubernetes (Gatekeeper)، وشبكات الخدمات (تكامل Istio AuthorizationPolicy)، وبوابات API (Kong وEnvoy ext_authz)، والتحقق من صحة خطط Terraform (Conftest)، وعشرات المنتجات التجارية. الفكرة المحورية هي السياسة المنفصلة: بدلًا من تضمين منطق الوصول في كل خدمة، تدفع جميع القرارات إلى محرك واحد قابل للنشر المستقل يتحدث لغة واحدة — Rego.
معمارية OPA
يعمل OPA كعملية مصاحبة (sidecar) أو خدمة مستقلة. يرسل المستهلكون استعلامًا JSON (ماذا تريد أن تعرف؟) مع مدخل JSON (الشيء الذي يُقيَّم). يُقيِّم OPA الاستعلام مقابل حزمة السياسات المحمّلة ووثيقة البيانات الاختيارية (السياق مثل أدوار المستخدمين أو القوائم المسموح بها)، ثم يُعيد قرارًا JSON. لا شيء في هذا التبادل خاص بـ Kubernetes.
ثلاثة أنماط نشر تغطي جميع حالات الاستخدام الإنتاجية تقريبًا:
- Sidecar: يعمل OPA كحاوية مصاحبة لكل pod تطبيق. كمون منخفض (loopback)، نطاق تأثير معزول، تكلفة موارد أعلى قليلًا. تستخدمه Envoy ext_authz وLinkerd وConsul.
- Admission webhook (Gatekeeper): يعمل OPA داخل مستوى التحكم في Kubernetes كـ
ValidatingAdmissionWebhook. تُقيَّم كل عملية كتابة إلى خادم API بشكل متزامن قبل استمرار المورد. هذه نقطة التطبيق الأساسية في Kubernetes. - Daemon / مستقل: خدمة OPA مركزية تُقيِّم استعلامات من مستدعين متعددين. مناسب عندما تريد سجل قرار واحد قابل للتدقيق. يجب التعامل معه كتبعية في المسار الحرج: إن توقف، يفشل كل مستدعٍ إما مفتوحًا أو مغلقًا وفقًا للتهيئة.
Rego: لغة السياسة
Rego لغة تصريحية قائمة على المنطق، مصممة خصيصًا للسياسات. ليست أمرية — لا تكتب أشجار if/else وتُغيِّر الحالة. بدلًا من ذلك، تكتب علاقات منطقية يحلّها مُقيِّم Rego إلى قيمة. النموذج أقرب إلى Datalog (مجموعة فرعية من Prolog)، مما يجعل Rego غريبًا على المهندسين الذين كتبوا كودًا إجرائيًا فحسب. العائد هو أن سياسات Rego متسقة قابلة للإثبات: نفس المدخل يُنتج دائمًا نفس المخرج، ويستطيع المُقيِّم أن يشرح بالضبط سبب الوصول إلى قرار.
أساسيات Rego: القواعد، المراجع، التحليلات
ملف Rego هو وحدة (module) بتصريح package. القواعد هي معادلات. جسم القاعدة مجموعة تعبيرات يجب أن تكون صحيحة جميعًا (منطق عطفي — AND). قواعد متعددة بنفس الرأس تمثّل بدائل (منطق فصلي — OR). تستعلم عن قيمة عبر النقطة على شجرة المستند (input.spec.containers[_]).
مصطلحات Rego الأساسية التي يجب أن يعرفها كل مهندس يعمل مع OPA:
- المُكرِّر الحرفي
[_]: يُكرِّر على جميع عناصر المصفوفة.input.spec.containers[_].imageصحيح لأي حاوية تستوفي بقية القاعدة. some x in collection: البديل الاصطلاحي الحديث (يتطلبimport future.keywords.in). يُفضَّل على[_]في السياسات الجديدة لوضوحه.- النفي
not: صحيح عندما يكون التعبير في الجسم غير محدد أو خاطئ.not input.metadata.labels.teamصحيح عندما يكون وسمteamغائبًا — لكن أيضًا عندما يُضبَط صراحةً علىnull. افهم هذا قبل كتابة قواعد أمنية. - القواعد الافتراضية: يوفر
default allow = falseقيمة احتياطية آمنة للقواعد الجزئية. أعلن دائمًا عن الافتراضيات في القواعد المتعلقة بالأمان. - القواعد الجزئية والتحليلات:
violation[msg] { ... }يبني مجموعة من جميع الرسائل المطابقة. نمط Gatekeeper يعتمد على هذا — يجمع كل المخالفات من مورد في استعلام واحد بدلًا من التوقف عند الأولى.
كتابة سياسة بجودة إنتاجية
تُطبِّق السياسة التالية ثلاثة ضوابط Kubernetes شائعة في وحدة واحدة: الوسوم المطلوبة، وسجلات الصور المحظورة، وغياب حاويات المستخدم الجذر. هذا مثل تمثيلي لما يشحنه فريق منصة حقيقي.
اختبار سياسات Rego بـ opa test
سياسة Rego دون اختبارات هي مسؤولية لا أصل. تشحن OPA مشغّل اختبار مدمجًا. تعيش ملفات الاختبار إلى جانب ملفات السياسة وتتبع اصطلاح التسمية *_test.rego. الاختبارات قواعد Rego عادية تبدأ أسماؤها بـ test_. أي اختبار يُقيَّم بـ false أو غير محدد يُعدّ فشلًا.
opa eval بشكل تفاعلي أثناء تطوير السياسة. استخدم opa eval -d policy/ -i input.json 'data.platform.admission.baseline.violation' لترى بالضبط ما تُعيده سياستك لمدخل معين قبل نشرها. الراية --explain full تطبع تتبع التقييم الكامل — لا غنى عنها عند تصحيح قاعدة تعمل بشكل غير متوقع أو لا تعمل أصلًا. على النطاق الواسع، تُضيف Styra DAS وإضافة OPA لـ VS Code تحليل تغطية على مستوى IDE.
توزيع حزم OPA
في الإنتاج، لا تُدمج السياسات في ثنائي OPA. بل تُوزَّع كـ حزم — أرشيفات tar.gz من ملفات .rego ووثائق data.json — تُدفع إلى سجل OCI أو نقطة نهاية HTTPS. يستطلع OPA نقطة نهاية الحزمة على فترة زمنية مُهيَّأة ويُعيد تحميل السياسات دون إعادة تشغيل. هذا ما يجعل تحديثات السياسة عملية CI: دمج إلى main، يبني CI الحزمة الجديدة ويدفعها، تلتقطها مجموعات OPA في غضون ثوانٍ.
false. المستدعون الذين يعاملون undefined كـ allow (شائع في التكاملات المكتوبة يدويًا) يخلقون ثغرة تجاوز: مدخل مشوّه يفشل في مطابقة أي قاعدة سيُسمح به بصمت. استخدم دائمًا default allow = false أو هيِّئ تكاملك ليعامل القرارات غير المحددة كرفض. تعالج Gatekeeper هذا بشكل صحيح؛ تحقق مضاعفًا من أي مستدعٍ لـ OPA REST API المخصص تكتبه.
OPA في مسار استقبال Kubernetes
عند نشر Gatekeeper (الدرس التالي)، يكون OPA محرك التقييم خلف الكواليس. فهم دورة الاستعلام/الاستجابة الخام لـ OPA أمر جوهري لتصحيح إخفاقات Gatekeeper، وكتابة قوالب قيود مخصصة، وتكامل OPA مع أنظمة غير Kubernetes. يُرسل خادم Kubernetes API كائن AdmissionReview JSON كـ input؛ يجب أن تُنتج السياسة مجموعة violation؛ تُعيّن Gatekeeper تلك المجموعة إلى استجابة قبول. كل استدعاء opa eval تُشغِّله محليًا مع تركيبة AdmissionReview حقيقية يُعيد إنتاج ما ستفعله Gatekeeper في الإنتاج تمامًا.