# Rules Engine para Firewall

import DocButton from '~/components/webkit/DocButton.vue';
import RulesExecution from '~/includes/snippets/RulesEngineExecution/pt/snippet.mdx'
import Tag from '~/components/webkit/Tag.vue'

**Rules Engine para Firewall** é uma ferramenta projetada para implementação de lógicas de segurança no Firewall. A aba de configurações do Rules Engine aparece dentro de um firewall criado.

O Rules Engine para Firewall da Azion é programável. Dessa forma, você define quais são as condições (**Criteria**) e ações (**Behaviors**). Se as Criteria forem atendidas, os Behaviors serão executados.

Você pode usar o Rules Engine para Firewall para configurar todos os aspectos operacionais dos firewalls de suas applications. Aqui estão alguns exemplos de implementações para as quais você pode utilizá-lo:

- Bloquear requisições.
- Ignorar requisições.
- Limitar a taxa de acessos.
- Aplicar políticas de **Web Application Firewall (WAF)**.
- Rodar **Functions para Firewall** com seu próprio código.
- Monitorar tráfego para identificação de ameaças.

Um firewall pode ter quantas regras forem necessárias. Essas regras também são intercambiáveis, e você pode compartilhar a mesma regra com outras configurações de firewall.

<DocButton href="/pt-br/documentacao/produtos/secure/firewall/" label="Saiba mais sobre o Firewall" kind="secondary" size="medium" />

<DocButton href="/pt-br/documentacao/produtos/guias/secure/trabalhar-com-rules-engine/" label="Consulte o guia para trabalhar com Rules Engine" kind="secondary" size="medium" />

## Implementação

| Escopo | Recurso |
| --- | --- |
| Proteja sua aplicação | [Como proteger uma aplicação](/pt-br/documentacao/produtos/secure/proteja-aplicacao/) |
| Configure as main settings | [Como definir as main settings de um firewall](/pt-br/documentacao/produtos/guias/secure/firewall-definir-main-settings/) |
| Crie um WAF rule set | [Como criar um WAF rule set](/pt-br/documentacao/produtos/guias/secure/criar-waf-rule-set/) |
| Bloqueie endereços IP de exit nodes Tor | [Como bloquear endereços IP de exit nodes Tor](/pt-br/documentacao/produtos/guias/secure/bloquear-redes-tor/) |

---

## Como funciona o Rules Engine para o Firewall

As requisições de seus usuários para sua aplicação são processadas primeiro pelo **Firewall**. Você pode definir um conjunto de regras de segurança que serão executadas por esse Firewall. 

As regras são compostas por *Criteria*, que representam as condições para execução das regras, e por *Behaviors*, que representam as ações e comandos que serão executados.

O processamento das regras é sequencial e você pode usá-las aliadas a um poderoso conjunto de variáveis e operadores de comparação. Se as condições forem atendidas, os *Behaviors* de cada regra são executados até todas as regras serem processadas.

:::note
Um firewall é composto por vários componentes-chave que definem sua funcionalidade e operação. Ao configurar um firewall, você pode definir suas configurações principais, incluindo: um **Nome**, os **Domínios** que serão protegidos pelo firewall e os **Módulos** que serão usados para ampliar a usabilidade do **Rules Engine**, além de habilitar o recurso **Debug Rules**.

Depois disso, você poderá adicionar [Functions Instances](/pt-br/documentacao/produtos/secure/firewall/functions-instances/) e regras do **Rules Engine**. Os campos e requisitos para usar o **Rules Engine para Firewall** são explicados nas seções abaixo.
:::

---

## Nome

Cada regra deve ter um nome único e fácil de lembrar, permitindo que você a referencie e gerencie facilmente dentro do seu sistema.

---

## Descrição

Além do nome da regra, você pode adicionar uma descrição para ela usando o campo **Description**. Sua descrição ficará visível na lista de regras e pode ser usada para identificar o que a regra faz.

---

## Criteria

A seção de **Criteria** no **Rules Engine for Firewall** serve para determinar as condições que precisam ser atendidas para a execução dos **Behaviors**. Critérios são compostos de:

- Variáveis
- Operadores de comparação
- Operadores lógicos
- Argumentos, quando aplicável

A inclusão de argumentos em um critério depende dos operadores de comparação escolhidos. O formato dos argumentos é descrito nas seções de [variáveis](#variáveis) e [operadores de comparação](#operadores-de-comparação) abaixo. Você também pode adicionar [operadores lógicos](#operadores-lógicos) para aumentar a quantidade de comparações que a regra irá executar.

Por exemplo, este critério identifica requisições onde o URI começa com uma barra ("/") para que o comportamento definido possa ser aplicado a elas.

| | Variável | Operador de comparação | Argumento |
| --- | ---- | --- | --- |
| If | `Request URI` | *starts with* | `/` |

:::note 
A disponibilidade de certos critérios depende dos módulos de Firewall ativados. Acesse a [referência dos módulos do Firewall](/pt-br/documentacao/produtos/secure/firewall/#sobre-os-modulos-do-edge-firewall) para mais detalhes.
:::

### Variáveis

Esta é a lista de todas as variáveis de Criteria disponíveis:

| Criteria | Descrição | Exemplo | Requisitos |
| -------- | --------- | ---------- | ---------- |
| Header Accept | Header que informa quais tipos de dado que o cliente aceita como resposta | `application/json` | Web Application Firewall |
| Header Accept Encoding | Header que informa quais os tipos de codificação de conteúdo, geralmente algoritmos de compressão, que o cliente aceita como resposta | `gzip` | Web Application Firewall |
| Header Accept Language | Header que informa a linguagem esperada | `en-US` | Web Application Firewall |
| Header Cookie | Header que contém os cookies enviados pelo cliente na requisição para o servidor | `session_id=abc123` | Web Application Firewall |
| Header Origin | Header que informa a origem de uma requisição de acesso *cross-site* ou de uma requisição *preflight*. A origem é uma URI indicando o nome do servidor, sem nenhuma informação de caminho | `https://example.com` | Web Application Firewall |
| Header Referer | Header que indica o endereço do documento, ou elemento em um documento, a partir do qual a URI da requisição foi obtida | `https://example.com/landing-page` | Web Application Firewall |
| Header User Agent | Header com uma sequência característica que permite que servidores identifiquem o aplicativo, sistema operacional, fornecedor e/ou versão do dispositivo | `Mozilla/5.0` | Web Application Firewall |
| Host | Em ordem de precedência: o *hostname* da linha de requisição, ou o valor do campo de header *host* da requisição, ou o nome do servidor atendendo a requisição |  `api.example.com` | -                        |
| Network | O endereço IP do cliente que está realizando a requisição HTTP, que poderá ser utilizado para qualquer comparação de rede (CIDR, ASN ou Country) | `1xx.xxx.x.0` | Network Shield |
| Request Args | Todos os argumentos enviados pelo usuário na linha de requisição (*query string*) | `page=1` | Web Application Firewall |
| Request Method | O método HTTP da requisição. Por exemplo: `GET`, `POST`, `PUT`, etc. | `POST` | -                       |
| Request URI | Refere-se à variável `uri` da Rules Engine para Applications. O URI normalizado (urldecoded) da requisição. O valor de `uri` pode mudar durante o processamento de uma requisição, por exemplo, quando ocorre um redirecionamento interno ou quando são utilizados arquivos de índice. Ele não carrega os parâmetros da Query String como `request_uri` faz | `/api/v1/` | -                        |
| Scheme | O scheme da requisição: http ou https | `https` | -                        |
| Client Certificate Validation | Processo do servidor para autenticar o certificado digital do cliente | `true` | - |
| SSL Verification Status | Resultado do servidor para validação do certificado do cliente. Pode ser `Success`, quando a validação do certificado do cliente foi aprovada; `Certificate Verification Error`, quando o certificado do cliente não era válido; e `Missing Client Certificate`, quando o certificado do cliente não foi enviado na solicitação | `Certificate Verification Error` | - |

### Operadores de comparação

A condição para a execução de uma regra deve ser a comparação de uma variável com um argumento. Os operadores de comparação são:

| Operador | Descrição | Tipo de argumento |
| -------- | --------- | --------- |
| is equal | O valor da variável é igual ao argumento, comparado caractere a caractere | String |
| is not equal | O valor da variável não é exatamente igual ao argumento | String |
| starts with | O valor da variável inicia pelo argumento | String |
| does not start with | O valor da variável não inicia pelo argumento | String |
| matches | O valor da variável coincide com a expressão regular ou lista informada como argumento | Regular expression ou lista |
| does not match | O valor da variável não coincide com a expressão regular ou lista informada como argumento | Regular expression ou lista |
| exists | A variável tem valor definido. Por exemplo, `Request Args` existe se for enviado um argumento na query string da requisição | - |
| does not exist | A variável não tem valor definido. Por exemplo, `Request Args` não existe se não for enviado um argumento na query string da requisição | - |

:::note[nota]
Esses operadores podem variar de acordo com a Criteria selecionada.
:::

### Operadores lógicos

Múltiplas critérios podem ser definidos por meio dos operadores lógicos `And` e `Or`. 

:::note[nota]
O operador `And` tem precedência implícita sobre o operador `Or`.
:::

Se necessária precedência explícita, você pode adicionar múltiplos grupos de critérios sob a lógica `And`.

---

## Behaviors

Em **Behaviors**, você adiciona os comandos de ação que deseja executar se as Criteria forem atendidas.

Por exemplo, este comportamento executa a função especificada, permitindo que você execute lógica personalizada para o tratamento de requisições.

| Behavior | Argumento |
| --- | ---- |
| `Run Function` | `<name-of-the-instantiated-function>` |

### Deny (403 Forbidden)

O comportamento encerra a requisição com resposta HTTP *403 Forbidden*. Nenhum argumento é necessário.

### Drop (Close Without Response)

O comportamento encerra a requisição sem responder ao cliente. Nenhum argumento é necessário.

### Set Rate Limit

Define um limite de taxa de acesso que, se excedido, resultará em resposta HTTP *429 Too Many Requests*. Para configurar *Rate Limit*, você deverá informar:

- `Type`, é o campo para selecionar o tipo de requisição do Rate Limit, optando por `Req/s` (requisições por segundo) ou `Req/Min` (requisições por minuto).
- `Average Rate Limit`, que é a taxa limite por segundo, propriamente dita.
- `Client IP address`, se você deseja que a contabilização da taxa de acesso seja por endereço `IP do cliente` ou `Global`, caso deseje contabilização total da taxa de acesso.
- `Maximum burst size`, que indica o tamanho máximo da rajada de requisições HTTP enviadas simultaneamente, as quais serão enfileiradas e despachadas gradualmente, respeitando-se a taxa limite.
    - O valor configurado será o Rate Limit em cada Azion Edge Node, implementado por meio do algoritmo de Leaky Bucket. Recomendamos que você utilize `Maximum burst size` no máximo 10 vezes o valor configurado em `Average Rate Limit`, o que resultaria em penalizar a última requisição de uma rajada com até 10 segundos de atraso.
O Rate Limite é aplicado por endereço de IP ou por Global e por regra, e se uma regra possui *mais de uma URI* especificada e possui o *condicional Or*, o limite de taxa de acesso será compartilhado entre as URIs. Crie diferentes regras se você deseja ter um limite de taxa de acesso para cada URI.

:::note[nota]
`Maximum Burst size` está disponível apenas para o tipo de requisição `Req/s` (requisições por segundo).
:::

### Set WAF Rule Set

<Tag severity="info">Requer WAF</Tag>

Associa a Rule Set de WAF que deve ser utilizada na requisição. As políticas de WAF devem ser previamente configuradas no menu **Edge Libraries** > **WAF Rules*. Você também deve definir o **modo WAF**: **Learning** ou **Blocking**. Leia mais sobre [WAF Rule Sets](/pt-br/documentacao/produtos/secure/firewall/web-application-firewall/rule-sets/).

:::caution[atenção]
A plataforma da Azion mantém apenas uma configuração do behavior `Set WAF Rule Set` para cada lógica de criteria. Se você tiver dois firewalls diferentes, configurados com a mesma criteria, mas com behaviors `Set WAF Rule Set` diferentes, apenas o mais recente será processado. Isso pode ser útil caso sua aplicação precise trocar o behavior de `Set WAF Rule Set` constantemente, com base na mesma criteria.
:::

### Run Function

<Tag severity="info">Requer Functions</Tag>

Executa uma função especificada como parâmetro. A função deve ter sido previamente instanciada e parametrizada na aba Functions para poder ser utilizada.

### Set Custom Response

Permite uma resposta personalizada quando a requisição atende aos critérios. Você pode personalizar o `Status Code` alterando-o de 200 para 499, por exemplo, e o header `Content Type` e o `Content Body` da sua solicitação com no máximo `500` caracteres.

### Lógica e execução de behaviors

<RulesExecution />

---

## Debug de regras 

Você pode [depurar regras criadas com o Rules Engine para Firewall](/pt-br/documentacao/produtos/guias/debug-regras/) através da GraphQL API, Data Stream ou Real-Time Events.