Apache APISIX يتكامل مع Open Policy Agent لإثراء نظامه البيئي
API7.ai
December 24, 2021
Open Policy Agent (OPA) هو محرك سياسات عام خفيف الوزن مفتوح المصدر يمكنه استبدال وحدة وظيفة السياسة المدمجة في البرامج ومساعدة المستخدمين على فصل الخدمات عن محرك السياسات. بفضل النظام البيئي المتكامل لـ OPA، يمكن للمستخدمين بسهولة دمج OPA مع خدمات أخرى، مثل مكتبات البرامج، وواجهات برمجة التطبيقات HTTP، وغيرها.
كما هو موضح في الشكل أدناه، يصف OPA أولاً السياسة من خلال لغة السياسة Rego؛ ثم يقوم بتخزين بيانات السياسة من خلال JSON، بعد ذلك يمكن للمستخدم إرسال طلب استعلام. بعد استلام طلب الاستعلام، سيقوم OPA بدمج السياسة والبيانات وإدخال المستخدم لإنشاء قرار سياسة وإرسال القرار إلى الخدمة.
مقدمة عن الإضافة
يوفر Apache APISIX إضافة opa
تسمح للمستخدمين بإدخال قدرات السياسة التي يوفرها OPA إلى Apache APISIX بسهولة لتمكين ميزات المصادقة والتحكم في الوصول المرنة.
بعد تكوين إضافة opa
على مسار، يقوم Apache APISIX بتجميع معلومات الطلب، معلومات الاتصال، وما إلى ذلك في بيانات JSON وإرسالها إلى عنوان واجهة برمجة التطبيقات لاتخاذ قرار السياسة عند معالجة طلبات الاستجابة. طالما أن السياسة المطبقة في OPA تتوافق مع مواصفات البيانات التي يحددها Apache APISIX، يمكن تنفيذ وظائف مثل تمرير الطلب، رفض الطلب، رمز الحالة المخصص، رأس الاستجابة المخصص، رأس الاستجابة المخصص، وما إلى ذلك.
تأخذ هذه المقالة واجهة برمجة التطبيقات HTTP كمثال لتقديم إضافة opa
وتفصيل كيفية دمج Apache APISIX مع OPA لفصل المصادقة والتفويض لخدمات الخلفية.
كيفية الاستخدام
بناء بيئة الاختبار
-
استخدام Docker لبناء خدمات OPA.
# تشغيل OPA باستخدام Docker docker run -d --name opa -p 8181:8181 openpolicyagent/opa:0.35.0 run -s
-
إنشاء سياسة
example
.# إنشاء سياسة curl -XPUT 'localhost:8181/v1/policies/example' \ --header 'Content-Type: text/plain' \ --data-raw 'package example import input.request import data.users default allow = false allow { # يحتوي على رأس الطلب test-header بقيمة only-for-test request.headers["test-header"] == "only-for-test" # طريقة الطلب هي GET request.method == "GET" # مسار الطلب يبدأ بـ /get startswith(request.path, "/get") # معلمة GET test موجودة ولا تساوي abcd request.query["test"] != "abcd" # معلمة GET user موجودة request.query["user"] } reason = users[request.query["user"]].reason { not allow request.query["user"] } headers = users[request.query["user"]].headers { not allow request.query["user"] } status_code = users[request.query["user"]].status_code { not allow request.query["user"] }'
-
إنشاء بيانات
users
.# إنشاء بيانات مستخدم اختبار curl -XPUT 'localhost:8181/v1/data/users' \ --header 'Content-Type: application/json' \ --data-raw '{ "alice": { "headers": { "Location": "http://example.com/auth" }, "status_code": 302 }, "bob": { "headers": { "test": "abcd", "abce": "test" } }, "carla": { "reason": "Give you a string reason" }, "dylon": { "headers": { "Content-Type": "application/json" }, "reason": { "code": 40001, "desc": "Give you a object reason" } } }'
إنشاء مسار وتمكين الإضافة
قم بتشغيل الأمر التالي لإنشاء المسار وتمكين إضافة opa
.
curl -XPUT 'http://127.0.0.1:9080/apisix/admin/routes/r1' \
--header 'X-API-KEY: <api-key>' \
--header 'Content-Type: application/json' \
--data-raw '{
"uri": "/*",
"methods": [
"GET",
"POST",
"PUT",
"DELETE"
],
"plugins": {
"opa": {
"host": "http://127.0.0.1:8181",
"policy": "example"
}
},
"upstream": {
"nodes": {
"httpbin.org:80": 1
},
"type": "roundrobin"
}
}'
اختبار الطلبات
بعد ذلك، قم بتشغيل الأمر التالي لإرسال طلب إلى إضافة opa
لاختبار حالة تشغيل الإضافة.
# السماح بالطلب
curl -XGET '127.0.0.1:9080/get?test=none&user=dylon' \
--header 'test-header: only-for-test'
{
"args": {
"test": "abcd1",
"user": "dylon"
},
"headers": {
"Test-Header": "only-for-test",
"with": "more"
},
"origin": "127.0.0.1",
"url": "http://127.0.0.1/get?test=abcd1&user=dylon"
}
# رفض الطلب وإعادة كتابة رمز الحالة ورؤوس الاستجابة
curl -XGET '127.0.0.1:9080/get?test=abcd&user=alice' \
--header 'test-header: only-for-test'
HTTP/1.1 302 Moved Temporarily
Date: Mon, 20 Dec 2021 09:37:35 GMT
Content-Type: text/html
Content-Length: 142
Connection: keep-alive
Location: http://example.com/auth
Server: APISIX/2.11.0
# رفض الطلب وإرجاع رأس استجابة مخصص
curl -XGET '127.0.0.1:9080/get?test=abcd&user=bob' \
--header 'test-header: only-for-test'
HTTP/1.1 403 Forbidden
Date: Mon, 20 Dec 2021 09:38:27 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 150
Connection: keep-alive
abce: test
test: abcd
Server: APISIX/2.11.0
# رفض الطلب وإرجاع استجابة مخصصة (سلسلة)
curl -XGET '127.0.0.1:9080/get?test=abcd&user=carla' \
--header 'test-header: only-for-test'
HTTP/1.1 403 Forbidden
Date: Mon, 20 Dec 2021 09:38:58 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.11.0
Give you a string reason
# رفض الطلب وإرجاع استجابة مخصصة (JSON)
curl -XGET '127.0.0.1:9080/get?test=abcd&user=dylon' \
--header 'test-header: only-for-test'
HTTP/1.1 403 Forbidden
Date: Mon, 20 Dec 2021 09:42:12 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Server: APISIX/2.11.0
{"code":40001,"desc":"Give you a object reason"}
تعطيل الإضافة
بفضل الطبيعة الديناميكية لـ Apache APISIX، يمكن تعطيل إضافة OPA على مسار ببساطة عن طريق إزالة تكوين إضافة opa
ذات الصلة من تكوين المسار وحفظه.
الخلاصة
تشرح هذه المقالة الخطوات التفصيلية للاتصال بين Apache APISIX و Open Policy Agent. نأمل أن تمنحك هذه المقالة فهمًا أوضح لاستخدام Open Policy Agent في Apache APISIX وتسهل عملية التنفيذ اللاحقة.
لا يلتزم Apache APISIX فقط بالحفاظ على أدائه العالي، ولكنه يولي أيضًا أهمية كبيرة لبناء النظام البيئي مفتوح المصدر. حاليًا، يحتوي Apache APISIX على أكثر من 10 إضافات متعلقة بالمصادقة والتفويض تدعم الاتصال مع خدمات المصادقة والتفويض الرئيسية في الصناعة.
إذا كانت لديك حاجة للاتصال مع سلطات مصادقة أخرى، قم بزيارة GitHub الخاص بـ Apache APISIX واترك اقتراحاتك عبر issue؛ أو اشترك في قائمة البريد الخاصة بـ Apache APISIX للتعبير عن أفكارك عبر البريد الإلكتروني.