Modelo de segurança Edge Functions
As regras que mantêm suas funções, seu código e seus segredos privados, e os locais onde você permanece responsável.
1. Chaves e funções
| Função | Chave | Pode fazer |
|---|---|---|
anon | Chave pública, segura em um navegador | Invocar uma função |
authenticated | Chave pública mais JWT de um usuário conectado | Invocar uma função, com a identidade do usuário |
service_role | Chave secreta, apenas servidor | Tudo: implantar, ler códigos e segredos, jobs, cron, alertas |
admin | Uma sessão de console no Studio | Tudo, do Estúdio |
A função vem da chave e do token, que a plataforma valida. Um cliente não pode escolher: uma chamada com a chave pública e um cabeçalho x-aura-role: service_role ainda atinge sua função como anon.
Cada rota e sua função estão listadas na referência da API HTTP .
2. Por que apenas a invocação é pública
Uma chave pública é publicada em seu aplicativo web ou móvel, para que qualquer pessoa possa lê-la. Tudo o que permite, todos são permitidos. Invocar uma função é a única operação projetada para isso: seu código decide o que um chamador pode fazer.
Ler a definição de uma função é diferente. Ele contém o código-fonte e as variáveis de ambiente, que muitas vezes guardam segredos. A listagem de empregos e alertas mostra seus dados. Enfileirar um trabalho executa seu código em sua cota. Nada disso pode ser público e a plataforma os recusa com 403 para qualquer chave que não seja service_role.
A mesma divisão existe em outros lugares. Supabase valida o JWT de um usuário antes que uma Edge Function seja executada por padrão (verify_jwt = true) e implemente funções por meio de sua CLI e plataforma (docs). Firebase enfileira tarefas de um ambiente de servidor confiável por meio do Admin SDK, com uma permissão do IAM (docs). Cloudflare permite que apenas um Worker envie para uma fila, por meio de uma ligação (docs).
Versões anteriores do serviço respondiam GET /v1/functions e GET /v1/functions/{name} para qualquer chave. Se o seu projeto foi executado em uma implantação anterior a essa correção, trate o código e as variáveis de suas funções como expostas e gire os segredos que elas contêm. Consulte atualização para 0.6.
3. A identidade não pode ser forjada
Sua função lê o chamador de x-aura-role, x-aura-user-id e x-aura-project-id. A plataforma os define após validar a chave e o token.
- Um chamador não pode fornecê-los. A plataforma descarta
authorization,apikey,x-request-ide qualquer cabeçalhox-aura-*enviado noheadersde uma invocação, seja qual for o caso. Em um teste real, uma chamada comx-aura-role: service_rolee umauthorizationforjado atingiu a função comorole: "anon"semauthorization. - Outros cabeçalhos personalizados passam intactos. Trate-os como entrada do usuário.
- Jobs e disparos de cron alcançam sua função sem cabeçalhos de identidade. Eles são acionados pela plataforma, não por um usuário.
Então autorize em x-aura-role e x-aura-user-id, nunca em um valor do corpo:
4. A caixa de areia
O que a plataforma oferece:
- Cada chamada é executada em seu próprio isolamento V8, com seu próprio limite de memória e tempo limite de relógio. Uma falha ou um loop infinito em uma chamada não afeta outra.
- As variáveis de ambiente do host são invisíveis:
Deno.env.get('PATH')retornouundefinedem uma execução real. Apenas as variáveis da sua função e as variáveis AURABASE_*da plataforma estão presentes. - O código de um projeto não pode ser lido por outro: o serviço que o atende requer um token interno.
- As respostas que podem executar scripts são fornecidas com uma política de segurança de conteúdo de sandbox e os cabeçalhos
Set-Cookiee CORS de uma função são descartados. Consulte as respostas de .
O que e não oferece:
- A rede de saída fica aberta enquanto você não a restringir. Quando
permissions.allow_netlista pelo menos um host, o runtime recusa umfetchpara qualquer outro host (Requires net access to "host:443"). Uma lista vazia, o padrão, não restringe nada. Liste cada host de que a função precisa, incluindo a URL do seu projeto se ela chamar a plataforma. Mesmo com uma lista, valide qualquer URL vinda de entrada do usuário. - Nenhuma proteção de seus próprios segredos nos logs. Qualquer coisa que sua função escreve com
console.logvai para os logs do tempo de execução. - Sem limite por usuário. O limite da taxa de invocação é por IP do cliente. Adicione sua própria verificação se um usuário não deve chamar uma função mais do que algumas vezes.
5. Lista de verificação
- A chave
service_roleexiste apenas nos seus servidores e nos seus segredos de CI. - O pacote do navegador contém apenas a chave pública. O SDK recusa uma chave
service_roleem um navegador por padrão. - Cada função verifica
x-aura-roleantes de fazer qualquer coisa sensível. - Os segredos são variáveis da função, nunca em
index.ts. - Funções que chamam URLs externos validam o destino.
- Você alterna uma chave criando uma nova no Studio, implantando-a como um segredo e, em seguida, revogando a antiga.