Edge Functions no Edge Firewall

Edge Functions são funções executadas na plataforma de Edge da Azion, com a latência baixa, levando a capacidade operacional para mais perto do usuário final.

Edge Firewall suporta edge functions. Através delas, você pode escrever seu próprio código de segurança em JavaScript e realizar deploy no edge.

Com edge functions nos Edge Firewall, você pode:

  • Melhorar sua proteção.
  • Ter mais dinamismo.
  • Implementar a lógica necessária para o funcionamento do seu negócio.
  • Fazer uso de APIs que possibilitam a manipulação dos headers de request e response.

Implementação

EscopoGuia
Como criar e configurar uma edge function em seu Edge FirewallComo criar e configurar uma edge function no seu Edge Firewall
ExemplosExemplos de functions para firewall
Exemplos no GitHubRepositório do GitHub

Como funcionam as edge functions no Edge Firewall

Processo

  • As regras configuradas nas Rules Engine do Edge Firewall para a execução da função são acionadas.
  • O Azion Runtime processa a função, retornando um resultado.
  • O Edge Firewall Rules Engine prossegue com o processamento, baseado no resultado recebido, a partir do ponto que o comportamento foi acionado.

Adicionar Header da Requisição

Você pode adicionar headers na requisição que é enviada à origem.

addEventListener("firewall", (event) => {
event.addRequestHeader("X-Custom-Header-1", "1");
event.addRequestHeader("X-Custom-Header-2", "2");
event.continue();
});

Adicionar Header da Resposta

Você pode adicionar headers na resposta que é enviada aos usuários.

addEventListener("firewall", (event) => {
event.addResponseHeader("X-Custom-Header-3", "3");
event.addResponseHeader("X-Custom-Header-4", "4");
event.continue();
});

Deny (403 Forbidden)

Através do evento event.deny(), você pode finalizar uma requisição retornando HTTP 403 Forbidden.

addEventListener("firewall", (event) => {
event.deny();
});

Drop (Fechar Sem Resposta)

Através do evento event.drop(), você pode finalizar uma solicitação sem retornar uma resposta ao cliente.

addEventListener("firewall", (event) => {
event.drop();
});

Respond with

Através do evento event.respondWith(), você pode interceptar requisições e retornar respostas customizadas, além de modificar os headers da resposta ou o conteúdo.

event.respondWith(new Response('{"my_custom_response": true}', {
status: 599,
headers: { "content-type": "application/json" }
}));

Metadados

As edge functions no Edge Firewall possibilitam a manipulação de metadados.

Utilizando esses metadados, você pode filtrar e gerenciar o acesso às suas aplicações e implementar a lógica específica em diferente cenários, como por exemplo:

Informação de GeoIP

Você pode negar acesso quando a requisição vem de lugares específicos.

Leia mais sobre a lista de metadados de GeoIP.

Remote

Você pode verificar o endereço de IP e a porta TCP utilizada.

Leia mais sobre a lista de metadados de Remote.

Server

Você pode verificar o protocolo sendo usado na requisição.

Leia mais sobre a lista de metadados de Server.

TLS

Os metadados relacionados a TLS estarão disponíveis quando a requisição for feita de uma conexão segura.

Leia mais sobre a lista de metadados de TLS.

Repositório Azion Samples

Acesse o repositório Azion Samples no GitHub e analise os code samples que podem ajudar no desenvolvimento de suas edge functions.


Práticas recomendadas

Conditionals

Ao trabalhar com condicionais e event.method, use if else. Caso a implementação seja semelhante a:

if (someCondition){
event.drop()
}
event.continue()

Ela pode acabar com comportamentos inesperados.

É altamente recomendável utilizar da seguinte forma:

if (someCondition){
event.drop()
}else{
event.continue()
}

Sync x async

Como o eventHandler é síncrono, é necessário escrever uma function assíncrona quando await é implementado.

Recomenda-se usar event.waitUntil. Caso contrário, a promise pode acabar em exceções inesperadas.

async function firewallHandler(event) {
// any async operation here like fetch, timeout etc.
}
addEventListener("firewall", (event) => event.waitUntil(firewallHandler(event)));
}

Contribuidores