Edge Functions beveiligingsmodel
De regels die uw functies, hun code en hun geheimen privé houden, en de plaatsen waar u verantwoordelijk blijft.
1. Sleutels en rollen
| Rol | Sleutel | Kan doen |
|---|---|---|
anon | Publieke sleutel, veilig in een browser | Roep een functie aan |
authenticated | Openbare sleutel plus JWT van een ingelogde gebruiker | Roep een functie aan, met de identiteit van de gebruiker |
service_role | Geheime sleutel, alleen server | Alles: implementeren, code en geheimen lezen, taken, cron, waarschuwingen |
admin | Een consolesessie in de Studio | Alles, van de Studio |
De rol komt voort uit de sleutel en het token, die het platform valideert. Een client kan er niet voor kiezen: een oproep met de publieke sleutel en een header x-aura-role: service_role bereikt nog steeds jouw functie als anon.
Elke route en zijn rol worden vermeld in de HTTP API-referentie.
2. Waarom alleen de aanroep openbaar is
Er wordt een openbare sleutel gepubliceerd in uw web- of mobiele app, zodat iedereen deze kan lezen. Wat het ook toelaat, iedereen mag. Het aanroepen van een functie is de enige handeling die daarvoor is ontworpen: uw code bepaalt wat een beller mag doen.
Het lezen van de definitie van een functie is anders. Het bevat de broncode en de omgevingsvariabelen, die vaak geheimen bevatten. Door vacatures en waarschuwingen weer te geven, worden uw gegevens weergegeven. Als u een taak in de wachtrij plaatst, wordt uw code uitgevoerd op basis van uw quotum. Geen van deze kan openbaar zijn en het platform weigert ze met 403 voor elke sleutel die niet service_role is.
Dezelfde splitsing bestaat elders. Supabase valideert de JWT van een gebruiker voordat een Edge-functie standaard wordt uitgevoerd (verify_jwt = true) en implementeert functies via de CLI en het platform (docs). Firebase plaatst taken uit een vertrouwde serveromgeving in de wachtrij via de Admin SDK, met een IAM-machtiging (docs). Met Cloudflare kan alleen een werknemer naar een wachtrij verzenden, via een binding (docs).
Eerdere versies van de service beantwoordden GET /v1/functions en GET /v1/functions/{name} op elke sleutel. Als uw project draaide op een implementatie die dateert van vóór deze oplossing, behandel dan de code en variabelen van uw functies als openbaar en roteer de geheimen die ze bevatten. Zie upgrade naar 0.6.
3. Identiteit kan niet worden vervalst
Uw functie leest de beller van x-aura-role, x-aura-user-id en x-aura-project-id. Het platform stelt ze in nadat het de sleutel en het token heeft gevalideerd.
- Een beller kan deze niet verstrekken. Het platform verwijdert
authorization,apikey,x-request-iden elkex-aura-*header die in deheadersvan een aanroep wordt verzonden, ongeacht het geval. In een echte test bereikte een aanroep metx-aura-role: service_roleen een vervalsteauthorizationde functie alsrole: "anon"zonderauthorization. - Andere aangepaste headers gaan onaangeroerd door. Behandel ze als gebruikersinvoer.
- Taken en cron-vuren bereiken uw functie zonder identiteitsheaders. Ze worden geactiveerd door het platform, niet door een gebruiker.
Dus autoriseer op x-aura-role en x-aura-user-id, nooit op een waarde uit de hoofdtekst:
4. De zandbak
Wat het platform u biedt:
- Elke oproep wordt uitgevoerd in zijn eigen V8-isolaat, met zijn eigen geheugenlimiet en time-out van de wandklok. Een crash of een oneindige lus in de ene oproep heeft geen invloed op de andere.
- De omgevingsvariabelen van de host zijn onzichtbaar:
Deno.env.get('PATH')retourneerdeundefinedin een echte run. Alleen de variabelen van uw functie en deAURABASE_*-variabelen van het platform zijn aanwezig. - De code van het ene project kan niet door het andere worden gelezen: de dienst die het bedient, heeft een intern token nodig.
- Reacties die scripts kunnen uitvoeren, worden geleverd met een sandboxing-inhoudsbeveiligingsbeleid, en
Set-Cookie- en CORS-headers van een functie worden verwijderd. Zie antwoorden.
Wat het u geeft en niet:
- Uitgaand netwerk staat open zolang u het niet beperkt. Als
permissions.allow_netminstens één host noemt, weigert de runtime eenfetchnaar elke andere host (Requires net access to "host:443"). Een lege lijst, de standaardwaarde, beperkt niets. Noem elke host die de functie nodig heeft, inclusief de URL van uw project als ze het platform aanroept. Valideer ook met een lijst elke URL die uit gebruikersinvoer komt. - Geen bescherming van uw eigen geheimen in logboeken. Alles wat uw functie met
console.logschrijft, gaat naar de runtimelogboeken. - Geen limiet per gebruiker. De limiet voor het aanroeppercentage geldt per client-IP. Voeg uw eigen controle toe als een gebruiker een functie niet vaker dan een paar keer mag aanroepen.
5. Controlelijst
- De sleutel
service_rolebestaat alleen op uw servers en in uw CI-geheimen. - De browserbundel bevat alleen de openbare sleutel. De SDK weigert standaard een
service_role-sleutel in een browser. - Elke functie controleert
x-aura-rolevoordat er iets gevoeligs gebeurt. - Geheimen zijn variabelen van de functie, nooit in
index.ts. - Functies die externe URL's aanroepen, valideren de bestemming.
- Je roteert een sleutel door een nieuwe aan te maken in de Studio, deze als geheim in te zetten en vervolgens de oude in te trekken.