Edge Functions نموذج الأمان
القواعد التي تحافظ على خصوصية وظائفك ورمزها وأسرارها، والأماكن التي تظل مسؤولاً فيها.
1. المفاتيح والأدوار
| الدور | مفتاح | يمكن أن تفعل |
|---|---|---|
anon | المفتاح العام، آمن في المتصفح | استدعاء وظيفة |
authenticated | المفتاح العام بالإضافة إلى JWT الخاص بالمستخدم الذي قام بتسجيل الدخول | استدعاء وظيفة، مع هوية المستخدم |
service_role | المفتاح السري، خادم فقط | كل شيء: النشر، وقراءة التعليمات البرمجية والأسرار، والوظائف، والكرون، والتنبيهات |
admin | جلسة وحدة التحكم في الاستوديو | كل شيء، من الاستوديو |
ويأتي الدور من المفتاح والرمز المميز، اللذين تتحقق منهما المنصة. لا يمكن للعميل اختياره: لا تزال المكالمة باستخدام المفتاح العام والرأس x-aura-role: service_role تصل إلى وظيفتك كـ anon.
يتم إدراج كل مسار ودوره في مرجع HTTP API.
2. لماذا يكون الدعاء علنيا فقط؟
يتم نشر المفتاح العام في تطبيق الويب أو الهاتف المحمول الخاص بك، حتى يتمكن أي شخص من قراءته. كل ما يسمح به، فهو مسموح للجميع. إن استدعاء وظيفة هو العملية الوحيدة المصممة لذلك: يقرر الكود الخاص بك ما قد يفعله المتصل.
تختلف قراءة تعريف للدالة. فهو يحتوي على الكود المصدري ومتغيرات البيئة، والتي غالبًا ما تحتوي على أسرار. قائمة الوظائف والتنبيهات تظهر بياناتك. يؤدي إدراج مهمة إلى تشغيل التعليمات البرمجية الخاصة بك على حصتك. لا يمكن أن يكون أي منها عامًا، وترفضها المنصة باستخدام 403 لأي مفتاح ليس service_role.
والانقسام نفسه موجود في أماكن أخرى. Supabase يتحقق من صحة JWT للمستخدم قبل تشغيل وظيفة Edge افتراضيًا (verify_jwt = true) وينشر الوظائف من خلال واجهة سطر الأوامر والنظام الأساسي (docs). يقوم Firebase بإدراج المهام من بيئة خادم موثوق بها من خلال Admin SDK، مع إذن IAM (docs). Cloudflare يتيح فقط للعامل الإرسال إلى قائمة الانتظار، من خلال الربط (docs).
أجابت الإصدارات السابقة من الخدمة على GET /v1/functions وGET /v1/functions/{name} على أي مفتاح. إذا تم تشغيل مشروعك على عملية نشر تسبق هذا الإصلاح، فتعامل مع التعليمات البرمجية والمتغيرات الخاصة بوظائفك على أنها مكشوفة وقم بتدوير الأسرار التي تحتوي عليها. راجع الترقية إلى 0.6.
3. لا يجوز تزوير الهوية
تقوم وظيفتك بقراءة المتصل من x-aura-role و x-aura-user-id و x-aura-project-id. تقوم المنصة بتعيينها بعد التحقق من صحة المفتاح والرمز المميز.
- لا يمكن للمتصل تزويدهم. تتجاهل المنصة
authorizationوapikeyوx-request-idوأي رأسx-aura-*مرسل فيheadersلاستدعاء، مهما كانت حالتهم. في اختبار حقيقي، وصلت مكالمة باستخدامx-aura-role: service_roleوauthorizationمزورة إلى الوظيفة كـrole: "anon"بدونauthorization. - تمر الرؤوس المخصصة الأخرى دون تغيير. التعامل معها كمدخلات المستخدم.
- تصل الوظائف وعمليات إطلاق cron إلى وظيفتك بدون رؤوس الهوية. ويتم تشغيلها بواسطة النظام الأساسي، وليس بواسطة المستخدم.
لذا، قم بالتفويض على x-aura-role و x-aura-user-id، وليس على قيمة من النص أبدًا:
4. صندوق الرمل
ما تقدمه لك المنصة:
- يتم تشغيل كل مكالمة في محرك V8 المعزول الخاص بها، مع حد الذاكرة الخاص بها ومهلة ساعة الحائط الخاصة بها. لا يؤثر التعطل أو التكرار اللانهائي في مكالمة واحدة على مكالمة أخرى.
- متغيرات بيئة المضيف غير مرئية:
Deno.env.get('PATH')أعادundefinedفي التشغيل الحقيقي. فقط متغيرات وظيفتك ومتغيرات النظام الأساسيAURABASE_*موجودة. - لا يمكن قراءة كود أحد المشاريع بواسطة مشروع آخر: الخدمة التي تخدمه تتطلب رمزًا داخليًا.
- يتم تقديم الاستجابات التي يمكنها تشغيل البرامج النصية من خلال سياسة أمان محتوى وضع الحماية، ويتم إسقاط رؤوس
Set-CookieوCORS من إحدى الوظائف. راجع ردود .
ما الذي يقدمه لك وليس:
- الشبكة الصادرة مفتوحة ما لم تقيّدها. عندما يسرد
permissions.allow_netمضيفًا واحدًا على الأقل، يرفض وقت التشغيل أيfetchإلى مضيف آخر (Requires net access to "host:443"). القائمة الفارغة، وهي الافتراضية، لا تقيّد شيئًا. اذكر كل مضيف تحتاجه الدالة، بما في ذلك عنوان مشروعك إذا كانت تستدعي المنصة. وحتى مع وجود قائمة، تحقق من أي عنوان URL قادم من مدخلات المستخدم. - لا توجد حماية لأسرارك الخاصة في السجلات. أي شيء تكتبه وظيفتك باستخدام
console.logيذهب إلى سجلات وقت التشغيل. - لا يوجد حد لكل مستخدم. حد معدل الاستدعاء هو لكل عنوان IP للعميل. أضف الشيك الخاص بك إذا لم يكن على أحد المستخدمين الاتصال بوظيفة أكثر من عدة مرات.
5. قائمة المراجعة
- المفتاح
service_roleموجود فقط على خوادمك وفي أسرار CI الخاصة بك. - تحتوي حزمة المتصفح على المفتاح العام فقط. يرفض SDK مفتاح
service_roleفي المتصفح بشكل افتراضي. - تتحقق كل وظيفة من
x-aura-roleقبل أن تفعل أي شيء حساس. - الأسرار هي متغيرات الدالة، ولا توجد أبدًا في
index.ts. - تعمل الوظائف التي تستدعي عناوين URL الخارجية على التحقق من صحة الوجهة.
- يمكنك تدوير مفتاح عن طريق إنشاء مفتاح جديد في الاستوديو، ونشره باعتباره سرًا، ثم إلغاء المفتاح القديم.