Apache APISIX يتكامل مع Open Policy Agent لإثراء نظامه البيئي

API7.ai

December 24, 2021

Ecosystem

Open Policy Agent (OPA) هو محرك سياسات عام خفيف الوزن مفتوح المصدر يمكنه استبدال وحدة وظيفة السياسة المدمجة في البرامج ومساعدة المستخدمين على فصل الخدمات عن محرك السياسات. بفضل النظام البيئي المتكامل لـ OPA، يمكن للمستخدمين بسهولة دمج OPA مع خدمات أخرى، مثل مكتبات البرامج، وواجهات برمجة التطبيقات HTTP، وغيرها.

كما هو موضح في الشكل أدناه، يصف OPA أولاً السياسة من خلال لغة السياسة Rego؛ ثم يقوم بتخزين بيانات السياسة من خلال JSON، بعد ذلك يمكن للمستخدم إرسال طلب استعلام. بعد استلام طلب الاستعلام، سيقوم OPA بدمج السياسة والبيانات وإدخال المستخدم لإنشاء قرار سياسة وإرسال القرار إلى الخدمة.

OPA Workflow

مقدمة عن الإضافة

يوفر Apache APISIX إضافة opa تسمح للمستخدمين بإدخال قدرات السياسة التي يوفرها OPA إلى Apache APISIX بسهولة لتمكين ميزات المصادقة والتحكم في الوصول المرنة.

بعد تكوين إضافة opa على مسار، يقوم Apache APISIX بتجميع معلومات الطلب، معلومات الاتصال، وما إلى ذلك في بيانات JSON وإرسالها إلى عنوان واجهة برمجة التطبيقات لاتخاذ قرار السياسة عند معالجة طلبات الاستجابة. طالما أن السياسة المطبقة في OPA تتوافق مع مواصفات البيانات التي يحددها Apache APISIX، يمكن تنفيذ وظائف مثل تمرير الطلب، رفض الطلب، رمز الحالة المخصص، رأس الاستجابة المخصص، رأس الاستجابة المخصص، وما إلى ذلك.

تأخذ هذه المقالة واجهة برمجة التطبيقات HTTP كمثال لتقديم إضافة opa وتفصيل كيفية دمج Apache APISIX مع OPA لفصل المصادقة والتفويض لخدمات الخلفية.

كيفية الاستخدام

بناء بيئة الاختبار

  1. استخدام Docker لبناء خدمات OPA.

    # تشغيل OPA باستخدام Docker
    docker run -d --name opa -p 8181:8181 openpolicyagent/opa:0.35.0 run -s
    
  2. إنشاء سياسة 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"]
    }'
    
  3. إنشاء بيانات 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 للتعبير عن أفكارك عبر البريد الإلكتروني.

Tags: