الفرق بين الفلاتر والجدران
أنت تقوم ببناء وكيل ذكاء اصطناعي (AI agent) لديه صلاحية الوصول إلى بياناتك. لديك خياران للأمان: يمكنك تصفية البيانات (filter)، أو وضع جدار حولها (wall).
التصفية تعني أن استعلامك يعيد صفوفاً معينة فقط. وضع الجدار يعني أن الوكيل لا يمكنه الوصول إلى الصفوف المخفية على الإطلاق.
يبدو الأمران متشابهين حتى يحدث خطأ ما.
قمت مؤخراً ببناء نظام لتحويل 1.2 مليون كلمة إلى قاعدة معرفية. استخدمت Supabase لإدارة البيانات. أردت أن يرى وكلاء الذكاء الاصطناعي الخاصون بي المحتوى العام فقط.
استخدمت عرض Postgres (view) قياسياً لتصفية البيانات:
CREATE VIEW public_seeds AS
SELECT * FROM moments
WHERE visibility = 'public'
AND is_canonical = true;
يبدو هذا صحيحاً، لكنه يحتوي على خلل جسيم. افتراضياً، يتم تشغيل عرض Postgres بصلاحيات المالك، وليس الشخص الذي يستدعيه. غالباً ما يمتلك مالك العرض صلاحيات وصول كاملة. وهذا يعني أن سياسات أمان مستوى الصف (RLS) الخاصة بك لا تنطبق على العرض.
أنت لم تبنِ جداراً، بل بنيت فلتراً.
إذا فشل الفلتر، فلن يلاحظ وكيل الذكاء الاصطناعي ذلك. الإنسان يرى خطأً أو بيانات خاطئة، أما الوكيل فيقوم ببساطة بمعالجة أي شيء يتلقاه. إذا فشل الفلتر الخاص بك، سيبدأ الوكيل في استخدام البيانات الخاصة دون سابق إنذار.
حل Postgres 15 هذه المشكلة باستخدام خيار security_invoker.
عندما تضبط security_invoker على true ، يتم تشغيل العرض بصلاحيات الدور المستدعي (calling role). هذا يجبر العرض على الامتثال لسياسات RLS الخاصة بك، وبذلك يصبح العرض بوابة هيكلية.
الطريقة الصحيحة:
CREATE VIEW public_seeds
WITH (security_invoker = true)
AS
SELECT * FROM moments
WHERE visibility = 'public'
AND is_canonical = true;
الآن أصبح الجدار هيكلياً. حتى لو كتب مطور استعلاماً سيئاً أو عملية ربط (join)، فإن سياسة RLS ستحمي الجدول.
"هذا لا ينبغي أن يحدث" تعتمد على عمل كل شيء بشكل مثالي. "هذا لا يمكن أن يحدث" تعتمد على بنيتك التحتية.
عندما تبني من أجل الذكاء الاصطناعي، يجب أن تصمم لمنع ما "لا يمكن" أن يحدث.
ثلاثة أشياء يجب التحقق منها في إعداداتك:
- تأكد من عدم استخدام الـ
service roleللوكلاء. الـservice roleتتجاوز سياسات RLS تماماً. - تحقق من إصدار Postgres الخاص بك. أنت بحاجة إلى الإصدار 15 أو أعلى لاستخدام
security_invoker. - راجع العروض (views) الموجودة لديك. العروض القديمة لا تتبع سياسات RLS الجديدة تلقائياً.
مجتمع تعليمي اختياري: https://t.me/GyaanSetuAi