بوابة كونغ هي بوابة API بوابة مفتوحة المصدر تتأكد من أن تسمح فقط بال solicitudes الصحيحة وتدير أمنها، وتوجيه المعدلات، والسجل، وما إلى ذلك. OPA (عميل السياسات المفتوحة المصدر) هو محرك سياسات مفتوح المصدر الذي يستخدم للسياسات وقرارات الوصول الخاصة بك. فكر فيه كما لو أنه العقل الذي يفصل تنفيذ السياسات عن تطبيقك، لذا لن تضطر خدماتك إلى التوتر حول تنفيذ القواعد. بدلاً من ذلك، يقوم OPA بالتفكير بوجهته مع لغة Rego، تقييم السياسات عبر APIs، وخدمات المجالات الصغيرة، أو حتى كوبرنتز. إنه مرن وآمن، ويجعل تحديث السياسات سهلًا. تعمل OPA بتقييم ثلاثة أشياء رئيسية: المعطيات (بيانات الوقت الحالي مثل ال solicitudes),البيانات (معلومات خارجية مثل أدوار المستخدمين),والسياسة (المنطق في Rego الذي يقرر ما إذا “سمح” أو “رفض”). مع هذه المكونات تسمح OPA بحفظ قوتك ال أمنية بينما تبقي الأمور بسيطة ومتوازنة.
ما هو الهدف الذي نحن نسعى لإنجازه أو نحن نحاول حله؟
غالباً، البيانات في OPA تشبه صديقاً قديماً وهادئاً — ساكنة أو تتغير ببطء. يستخدمت بجوار البيانات الدخولية التي تتغير باستمرار لإتخاذ قرارات ذكية. ولكن، تخيل نظامًا يحتوي على شبكة واسعة من الخدمات الصغيرة، العديد من المستخدمين، وقاعدة بيانات هائلة مثل PostgreSQL. يتعامل هذا النظام بحجم كبير من المعاملات في كل ثانية ويحتاج للمساهمة في السرعة ونسبة التدفق دون التعطيل.
الحصول على الحراسة الدقيقة في هذا النظام معقد، لكن مع OPA، يمكنك تحميل العبء الثقيل من خدماتك الصغيرة والتعامل معها عند مستوى المنفذ. من خلال التعاون مع منفذ API Kong وOPA، ستحصل على النسبة العالية والحراسة الدقيقة.
كيف يمكنك الحفاظ على بيانات المستخدمين الدقيقة دون تباطء الأمر؟ الضغط الدائم على قاعدة البيانات PostgreSQL لاسترداد ملايين السجلات كلها كلفية وبطيئة. تحقيق الدقة والسرعة يتطلب عادة توازناً بين الاثنين. دعونا نحاول إيجاد توازن عملي بتطوير ملحق مخصص (عند مستوى المنفذ) يحمل البيانات ويحفظها محلياً في الذاكرة لاستخدامها OPA في تقييم سياساتها.
ديمو
للتوامين، قمت بتأسيس بيانات مصادر في PostgreSQL، والتي تحتوي على معلومات المستخدمين مثل الاسم، البريد الإلكتروني ودور. عندما يحاول المستخدم تواصل مع خدمة عبر URL معينة، يقوم OPA بتقييم ما إذا كان الطلب مسموح به. السياسة Rego تفحص الURL المطلوب (المورد)، الطريقة ودور المستخدم، ومن ثم تعود بالصدق أو الخطأ وفقاً للقوانين. إذا كان الصدق، سيتم استخدام الطلب للمرور؛ إذا كان الخطأ، يتم رفض الوصول. إلى الآن ، هذه إعدادتها بسيطة. دعونا نغوص في الplugin الخاص. للفهم الواضح لتنفيذه ، يرجى مراجعة الdiagram أدناه.
حين يأتي طلب من خلفية Kong Proxy، يتم تنفيذ plugin الخاص بKong. سيحصل الplugin على البيانات المطلوبة وسيتم تقديمها إلى OPA مع التعامل/التساؤل. هذا الحصول على البيانات يتكون من قسمين: الأول سيكون بحث في Redis لإيجاد القيم المطلوبة، وإذا وجدت ، سيتم تقديمها إلى OPA؛ إليا إذا لم يجد، سيتم البحث إضافي في Postgres وتحصيل البيانات وتخزينها في Redis قبل تقديمها إلى OPA. نستطيع إعادة نظر إلى هذا حين نقوم بتشغيل الأوامر في القسم القادم ومشاهدة السجلات. OPA يتخذ قرار (وفقاً للسياسة والتعامل والبيانات) وإن كان مسموحًا به، سيتم استمرار Kong في إرسال الطلب إلى الAPI. وباستخدام هذه الطريقة يتخفيف عدد البحوث إلى Postgres بشكل كبير ، ويمكن أن يكون البيانات المتاحة لOPA دقيقة بشكل جيد بينما ي
لبدء ببناء ملحق بناءً خاص، نحتاج إلى handler.lua
حيث يتم تنفيذ المنطقة الأساسية للملحق وإلى schema.lua
الذي يحدد النموذج لإعدادات الملحق. إذا بدأت في تعلم كيفية كتابة ملحقات خاصة لكونغ، يرجى الإشارة إلى هذا الرابط لمعلومات أكثر. يشرح المستند أيضًا كيفية التعبئة وتثبيت الملحق. دعونا نتقدم ونفهم منطقة هذا الملحق.
أول خطوة للعرض التمارين سيكون تثبيت OPA وكونغ وPostgres وRedis على إعداداتك المحلية أو أي إعدادات السحابة. أرجأ تسجيل إلى هذه المستودعة.
أنظر إلى ملف اليامل الذي يحدد تكوينات لتوجيه جميع هذه الخدمات الأربع. ألقي نظرة على متغيرات بيئة Kong لرؤية كيف يتم تحميل الملحق الخاص.
أجراء أحد الأوامر التالية لتوجيه الخدمات:
docker-compose build
docker-compose up
حينما نتأكد من أن البحارة تعمل بشكل سلسل وكونغ مدير الكونغ و OPA متاحة على نقاط الاتصال المختلفة https://localhost:8002 و https://localhost:8181 كما يمكن رؤيته أدناه:
قم بإنشاء خدمة تجريبية ومسار وأضف ملحق الكونغ الخاص بنا إلى هذا المسار بواسطة أداة الأوامر التالية:
curl -X POST http://localhost:8001/config -F config=@config.yaml
سينشر السياسة OPA المعروفة في ملف authopa.rego ويتم تحديثها إلى خدمة OPA بواسطة أداة الأوامر التالية:
curl -X PUT http://localhost:8181/v1/policies/mypolicyId -H "Content-Type: application/json" --data-binary @authopa.rego
هذه السياسة العرضية تؤيد الوصول للمعاملات التي يقوم بها المستخدمون بالحصول فقط إذا استخدموا مسار /demo بواسطة طريقة GET
ولديهم دور "Moderator"
. يمكن إضافة قواعد إضافية وفقاً للحاجة لتخصيص السياسة الخاصة للوصول وفقاً للمعاملات المختلفة.
opa_policy = [
{
"path": "/demo",
"method": "GET",
"allowed_roles": ["Moderator"]
}
]
الآن تم إعداد الإعدادات، لكن قبل الاختبار، نحن بحاجة إلى بعض البيانات التي يتم إضافتها إلى Postgres. أضفت بعض البيانات التجريدية (الإسم، البريد الإلكتروني والدور) لبعض من الموظفين والتي تظهر أدناه (يرجى إشاهد الPostgresReadme).
هذه معاملة طلب فشل وموفقة مثالية:
الآن، لاختبار وظيفة البرنامج الخاص الجوهري من هذا الملحق الخاص، دعونا نقوم باقتاتين تتتاليتين ونرا المعاملات لمعرفة كيفية تحصيل البيانات.
هذه هي السجلات:
2024/09/13 14:05:05 [error] 2535#0: *10309 [kong] redis.lua:19 [authopa] No data found in Redis for key: [email protected], client: 192.168.96.1, server: kong, request: "GET /demo HTTP/1.1", host: "localhost:8000", request_id: "ebbb8b5b57ff4601ff194907e35a3002"
2024/09/13 14:05:05 [info] 2535#0: *10309 [kong] handler.lua:25 [authopa] Fetching roles from PostgreSQL for email: [email protected], client: 192.168.96.1, server: kong, request: "GET /demo HTTP/1.1", host: "localhost:8000", request_id: "ebbb8b5b57ff4601ff194907e35a3002"
2024/09/13 14:05:05 [info] 2535#0: *10309 [kong] postgres.lua:43 [authopa] Fetched roles: Moderator, client: 192.168.96.1, server: kong, request: "GET /demo HTTP/1.1", host: "localhost:8000", request_id: "ebbb8b5b57ff4601ff194907e35a3002"
2024/09/13 14:05:05 [info] 2535#0: *10309 [kong] handler.lua:29 [authopa] Caching user roles in Redis, client: 192.168.96.1, server: kong, request: "GET /demo HTTP/1.1", host: "localhost:8000", request_id: "ebbb8b5b57ff4601ff194907e35a3002"
2024/09/13 14:05:05 [info] 2535#0: *10309 [kong] redis.lua:46 [authopa] Data successfully cached in Redis, client: 192.168.96.1, server: kong, request: "GET /demo HTTP/1.1", host: "localhost:8000", request_id: "ebbb8b5b57ff4601ff194907e35a3002"
2024/09/13 14:05:05 [info] 2535#0: *10309 [kong] opa.lua:37 [authopa] Is Allowed by OPA: true, client: 192.168.96.1, server: kong, request: "GET /demo HTTP/1.1", host: "localhost:8000", request_id: "ebbb8b5b57ff4601ff194907e35a3002"
2024/09/13 14:05:05 [info] 2535#0: *10309 client 192.168.96.1 closed keepalive connection
------------------------------------------------------------------------------------------------------------------------
2024/09/13 14:05:07 [info] 2535#0: *10320 [kong] redis.lua:23 [authopa] Redis result: {"roles":["Moderator"],"email":"[email protected]"}, client: 192.168.96.1, server: kong, request: "GET /demo HTTP/1.1", host: "localhost:8000", request_id: "75bf7a4dbe686d0f95e14621b89aba12"
2024/09/13 14:05:07 [info] 2535#0: *10320 [kong] opa.lua:37 [authopa] Is Allowed by OPA: true, client: 192.168.96.1, server: kong, request: "GET /demo HTTP/1.1", host: "localhost:8000", request_id: "75bf7a4dbe686d0f95e14621b89aba12"
تظهر السجلات أنه في المعاملة الأولى عندما لا يوجد بيانات في Redis، ستتم جلب البيانات من Postgres وتم تخزينها في Redis قبل إرسالها إلى OPA للتقييم. في المعاملة التالية، لأن توفر البيانات في Redis، ستكون الردة الفعالة أسرع بكثير.
خلاصة
في الختام، من خلال الجمع بين بوابة Kong Gateway مع OPA وتنفيذ المكون الإضافي المخصص مع التخزين المؤقت لـ Redis، فإننا نوازن بشكل فعال بين الدقة والسرعة للتحكم في الوصول في البيئات عالية الإنتاجية. يقلل المكون الإضافي من عدد استعلامات Postgres المكلفة عن طريق التخزين المؤقت لأدوار المستخدم في Redis بعد الاستعلام الأولي. في الطلبات اللاحقة، يتم استرداد البيانات من Redis، مما يقلل بشكل كبير من زمن الاستجابة مع الحفاظ على معلومات المستخدم الدقيقة والمحدثة لتقييمات سياسة OPA. يضمن هذا النهج أن التحكم في الوصول الدقيق يتم التعامل معه بكفاءة على مستوى البوابة دون التضحية بالأداء أو الأمان، مما يجعله حلاً مثاليًا لتوسيع نطاق الخدمات المصغرة مع فرض سياسات وصول دقيقة.
Source:
https://dzone.com/articles/enhanced-api-security-fine-grained-access-control