Edge Functions सुरक्षा मॉडल
वे नियम जो आपके कार्यों, उनके कोड और उनके रहस्यों को निजी रखते हैं, और वे स्थान जहां आप जिम्मेदार रहते हैं।
1. कुंजी और भूमिकाएँ
| भूमिका | चाबी | कर सकता है |
|---|---|---|
anon | सार्वजनिक कुंजी, ब्राउज़र में सुरक्षित | किसी फ़ंक्शन का आह्वान करें |
authenticated | सार्वजनिक कुंजी और साइन-इन उपयोगकर्ता का JWT | उपयोगकर्ता की पहचान के साथ एक फ़ंक्शन शुरू करें |
service_role | गुप्त कुंजी, सर्वर केवल | सब कुछ: तैनात करें, कोड और रहस्य पढ़ें, नौकरियां, क्रॉन, अलर्ट |
admin | स्टूडियो में एक कंसोल सत्र | सब कुछ, स्टूडियो से |
भूमिका कुंजी और टोकन से आती है, जिसे प्लेटफ़ॉर्म मान्य करता है। कोई ग्राहक इसे नहीं चुन सकता: सार्वजनिक कुंजी और हेडर x-aura-role: service_role के साथ कॉल अभी भी आपके फ़ंक्शन तक anon के रूप में पहुंचती है।
प्रत्येक मार्ग और उसकी भूमिका HTTP API संदर्भ में सूचीबद्ध है।
2. केवल मंगलाचरण ही सार्वजनिक क्यों है?
आपके वेब या मोबाइल ऐप में एक सार्वजनिक कुंजी प्रकाशित की जाती है, ताकि कोई भी इसे पढ़ सके। जो कुछ भी अनुमति देता है, हर किसी को अनुमति है। किसी फ़ंक्शन को लागू करना उसके लिए डिज़ाइन किया गया एक ऑपरेशन है: आपका कोड तय करता है कि कॉल करने वाला क्या कर सकता है।
किसी फ़ंक्शन की परिभाषा को पढ़ना अलग है। इसमें स्रोत कोड और पर्यावरण चर शामिल हैं, जो अक्सर रहस्य रखते हैं। नौकरियों और अलर्ट को सूचीबद्ध करना आपका डेटा दिखाता है। किसी कार्य को कतारबद्ध करने से आपका कोड आपके कोटा पर चलता है। इनमें से कोई भी सार्वजनिक नहीं हो सकता है, और प्लेटफ़ॉर्म उन्हें किसी भी कुंजी के लिए 403 से मना कर देता है जो service_role नहीं है।
वही विभाजन अन्यत्र भी मौजूद है। Supabase किसी एज फ़ंक्शन के डिफ़ॉल्ट रूप से चलने से पहले उपयोगकर्ता के JWT को मान्य करता है (verify_jwt = true) और इसके CLI और प्लेटफ़ॉर्म (डॉक्स) के माध्यम से फ़ंक्शन को तैनात करता है। Firebase IAM अनुमति (डॉक्स) के साथ एडमिन SDK के माध्यम से एक विश्वसनीय सर्वर वातावरण से कार्यों को सूचीबद्ध करता है। Cloudflare केवल एक कार्यकर्ता को बाइंडिंग (दस्तावेज़) के माध्यम से कतार में भेजने की सुविधा देता है।
सेवा के पुराने संस्करणों ने किसी भी कुंजी का उत्तर 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और किसी आह्वान केheadersमें भेजे गए किसी भीx-aura-*हेडर को हटा देता है, चाहे उनका मामला कुछ भी हो। एक वास्तविक परीक्षण में,x-aura-role: service_roleऔर जालीauthorizationके साथ एक कॉलauthorizationके बिनाrole: "anon"के रूप में फ़ंक्शन तक पहुंची। - अन्य कस्टम हेडर अछूते रहते हैं। उन्हें उपयोगकर्ता इनपुट के रूप में मानें।
- जॉब्स और क्रॉन फायरिंग आपके फ़ंक्शन तक बिना पहचान हेडर के पहुंचते हैं। वे किसी उपयोगकर्ता द्वारा नहीं, बल्कि प्लेटफ़ॉर्म द्वारा ट्रिगर किए जाते हैं।
इसलिए 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 भी शामिल करें। सूची होने पर भी उपयोगकर्ता इनपुट से आए किसी भी URL को सत्यापित करें। - लॉग में आपके अपने रहस्यों की कोई सुरक्षा नहीं। आपका फ़ंक्शन
console.logके साथ जो कुछ भी लिखता है वह रनटाइम के लॉग में चला जाता है। - प्रति उपयोगकर्ता कोई सीमा नहीं। आमंत्रण दर सीमा प्रति ग्राहक आईपी है। यदि एक उपयोगकर्ता को किसी फ़ंक्शन को कुछ बार से अधिक कॉल नहीं करना चाहिए तो अपना स्वयं का चेक जोड़ें।
5. चेकलिस्ट
service_roleकुंजी केवल आपके सर्वर और आपके सीआई रहस्यों में मौजूद है।- ब्राउज़र बंडल में केवल सार्वजनिक कुंजी होती है। SDK डिफ़ॉल्ट रूप से ब्राउज़र में
service_roleकुंजी को अस्वीकार कर देता है। - प्रत्येक फ़ंक्शन कुछ भी संवेदनशील करने से पहले
x-aura-roleकी जांच करता है। - रहस्य फ़ंक्शन के चर हैं,
index.tsमें कभी नहीं। - बाहरी यूआरएल को कॉल करने वाले फ़ंक्शन गंतव्य को मान्य करते हैं।
- आप स्टूडियो में एक नई कुंजी बनाकर उसे घुमाते हैं, उसे एक रहस्य के रूप में तैनात करते हैं, फिर पुरानी कुंजी को निरस्त करते हैं।