Edge Functions model bezpieczeństwa
Zasady, dzięki którym Twoje funkcje, ich kod i tajemnice pozostają prywatne, a także miejsca, za które ponosisz odpowiedzialność.
1. Klucze i role
| Rola | Klawisz | Można |
|---|---|---|
anon | Klucz publiczny, bezpieczny w przeglądarce | Wywołaj funkcję |
authenticated | Klucz publiczny plus JWT zalogowanego użytkownika | Wywołaj funkcję z tożsamością użytkownika |
service_role | Tajny klucz, tylko serwer | Wszystko: wdrażaj, czytaj kod i sekrety, zadania, cron, alerty |
admin | Sesja konsolowa w Studio | Wszystko ze Studia |
Rola pochodzi z klucza i tokena, które platforma sprawdza. Klient nie może tego wybrać: wywołanie z kluczem publicznym i nagłówkiem x-aura-role: service_role nadal osiąga Twoją funkcję jako anon.
Każda trasa i jej rola są wymienione w Dokumentacja API HTTP.
2. Dlaczego tylko inwokacja jest publiczna?
Klucz publiczny jest publikowany w Twojej aplikacji internetowej lub mobilnej, więc każdy może go przeczytać. Na co pozwala, każdemu wolno. Wywołanie funkcji jest jedyną operacją przeznaczoną do tego celu: Twój kod decyduje, co może zrobić osoba wywołująca.
Odczytywanie definicji funkcji jest inne. Zawiera kod źródłowy i zmienne środowiskowe, które często skrywają tajemnice. Lista ofert pracy i alertów pokazuje Twoje dane. Umieszczenie zadania w kolejce powoduje uruchomienie kodu w ramach przydziału. Żaden z nich nie może być publiczny, a platforma odrzuca je za pomocą 403 dla dowolnego klucza, który nie jest service_role.
Ten sam podział istnieje gdzie indziej. Supabase sprawdza JWT użytkownika przed domyślnym uruchomieniem funkcji brzegowej (verify_jwt = true) i wdraża funkcje za pośrednictwem interfejsu CLI i platformy (dokumentacja). Firebase kolejkuje zadania ze środowiska zaufanego serwera za pośrednictwem pakietu Admin SDK z uprawnieniami IAM (dokumentacja). Cloudflare pozwala tylko robotnikowi wysyłać do kolejki poprzez powiązanie (dokumentacja).
Wcześniejsze wersje usługi odpowiadały GET /v1/functions i GET /v1/functions/{name} na dowolny klucz. Jeśli Twój projekt działał we wdrożeniu poprzedzającym tę poprawkę, traktuj kod i zmienne funkcji jako ujawnione i zmieniaj zawarte w nich wpisy tajne. Zobacz aktualizację do wersji 0.6.
3. Tożsamości nie można sfałszować
Twoja funkcja odczytuje obiekt wywołujący z x-aura-role, x-aura-user-id i x-aura-project-id. Platforma ustawia je po zweryfikowaniu klucza i tokena.
- Osoba dzwoniąca nie może ich dostarczyć. Platforma odrzuca
authorization,apikey,x-request-idi dowolny nagłówekx-aura-*wysłany wheaderswywołania, niezależnie od ich przypadku. W prawdziwym teście wywołanie zx-aura-role: service_rolei sfałszowanymauthorizationosiągnęło funkcję jakorole: "anon"bezauthorization. - Inne niestandardowe nagłówki przechodzą bez zmian. Traktuj je jako dane wejściowe użytkownika.
- Zadania i uruchomienia cron docierają do Twojej funkcji bez nagłówków tożsamości. Są one wyzwalane przez platformę, a nie przez użytkownika.
Autoryzuj więc x-aura-role i x-aura-user-id, nigdy na wartości z treści:
4. Piaskownica
Co daje Ci platforma:
- Każde połączenie działa we własnym izolacji V8, z własnym limitem pamięci i limitem czasu zegara ściennego. Awaria lub nieskończona pętla w jednym wywołaniu nie wpływają na inne.
- Zmienne środowiskowe hosta są niewidoczne:
Deno.env.get('PATH')zwróciłoundefinedw prawdziwym uruchomieniu. Obecne są tylko zmienne Twojej funkcji i zmienneAURABASE_*platformy. - Kod jednego projektu nie może zostać odczytany przez inny: obsługująca go usługa wymaga wewnętrznego tokena.
- Odpowiedzi, które mogą uruchamiać skrypty, są obsługiwane z polityką bezpieczeństwa treści w trybie piaskownicy, a nagłówki
Set-Cookiei CORS z funkcji są usuwane. Zobacz odpowiedzi .
Co robi , a nie, co daje:
- Sieć wychodząca jest otwarta, dopóki jej nie ograniczysz. Gdy
permissions.allow_netwymienia co najmniej jeden host, środowisko uruchomieniowe odrzucafetchdo każdego innego hosta (Requires net access to "host:443"). Pusta lista, czyli wartość domyślna, niczego nie ogranicza. Wymień każdy host, którego potrzebuje funkcja, w tym adres URL projektu, jeśli wywołuje platformę. Nawet z listą waliduj każdy adres URL pochodzący z danych użytkownika. - Brak ochrony własnych sekretów w logach. Wszystko, co Twoja funkcja zapisuje za pomocą
console.log, trafia do dzienników środowiska wykonawczego. - Brak limitu na użytkownika. Limit szybkości wywołań dotyczy adresu IP klienta. Dodaj własne sprawdzenie, czy jeden użytkownik nie może wywołać funkcji więcej niż kilka razy.
5. Lista kontrolna
- Klucz
service_roleistnieje tylko na Twoich serwerach i w tajemnicach CI. - Pakiet przeglądarki zawiera wyłącznie klucz publiczny. Zestaw SDK domyślnie odrzuca klucz
service_rolew przeglądarce. - Każda funkcja sprawdza
x-aura-role, zanim wykona cokolwiek wrażliwego. - Sekrety są zmiennymi funkcji, nigdy w
index.ts. - Funkcje wywołujące zewnętrzne adresy URL sprawdzają miejsce docelowe.
- Obracasz klucz, tworząc nowy w Studio, wdrażając go jako klucz tajny, a następnie unieważniając stary.