# Azion Bot Manager Lite

import DocButton from '~/components/webkit/DocButton.vue';

# Visão Geral

Azion Bot Manager Lite v0.2.0 é uma integração serverless disponível no Marketplace da Azion, construída com uma function no Firewall. Ela analisa as requisições recebidas e atribui a cada uma uma pontuação com base em um conjunto de regras predefinidas. Quando a pontuação atinge ou excede o limite configurado, a função executa a ação definida. Se a pontuação ficar abaixo do limite, a requisição prossegue normalmente (`allow` é a ação padrão). Ações disponíveis: `allow`, `deny`, `drop`, `redirect`, `custom_html`, `random_delay` e `hold_connection`. A integração detecta tráfego suspeito e bots maliciosos, incluindo web scraping e ataques de força bruta.

## Detalhes da solução

A função avalia cada requisição e atribui uma pontuação com base em regras predefinidas. Você configura a ação e o limite nos JSON Args. Se a pontuação atingir ou exceder o limite, a função executa a ação configurada. Caso contrário, o Rules Engine do Firewall continua a ser executado normalmente.

## Regras

O Bot Manager Lite avalia cada requisição com base em 26 regras. Cada regra correspondida incrementa a pontuação da requisição por um valor fixo. Quando a pontuação acumulada atinge ou excede o `threshold` configurado, a função executa a `action` configurada.

| ID da Regra | Descrição | Incremento | Classe |
|---|---|---|---|
| 1 | `${http_user_agent}` está vazio | 8 | Assinaturas de bots maliciosos |
| 2 | `${http_content_type}` está vazio E `${request_body}` não está vazio | 8 | Assinaturas de bots maliciosos |
| 3 | `${http_referer}` está vazio E `${request_method}` é POST, PUT, PATCH ou DELETE | 6 | Intenção maliciosa |
| 4 | `${http_user_agent}` contém a string `Dalvik` | 4 | Assinaturas de bots maliciosos |
| 5 | `${http_user_agent}` contém a string `Trident` | 6 | Assinaturas de bots maliciosos |
| 6 | `${http_user_agent}` contém a string `Headless` | 6 | Assinaturas de bots maliciosos |
| 7 | `${http_user_agent}` tem mais de 200 ou menos de 10 caracteres | 4 | Assinaturas de bots maliciosos |
| 8 | `${http_user_agent}` corresponde a um user agent de bot malicioso conhecido | 8 | Bots scriptados |
| 9 | `${http_accept}` está vazio | 8 | Assinaturas de bots maliciosos |
| 10 | `${http_accept_language}` está vazio | 8 | Assinaturas de bots maliciosos |
| 11 | `${http_range}` está vazio | 6 | Intenção maliciosa |
| 12 | `${request_method}` é `TRACE` | 8 | Intenção maliciosa |
| 13 | `${http_content_length}` está vazio E `${request_method}` é POST, PUT ou PATCH | 8 | Assinaturas de bots maliciosos |
| 14 | O IP do cliente está em uma Network List de reputação configurada | 6 | Inteligência de Reputação |
| 15 | `${request_method}` é POST, PUT ou PATCH E `${cookie_az_botm}` está ausente | 8 | Comportamento malicioso de navegador |
| 16 | `${request_method}` é POST, PUT ou PATCH E `${cookie_az_asm}` está ausente | 8 | Comportamento malicioso de navegador |
| 17 | Violação de integridade dos cookies de sessão | 16 | Comportamento malicioso de navegador |
| 18 | `${http_sec_fetch_mode}` está vazio | 4 | Intenção maliciosa |
| 19 | `${http_sec_fetch_dest}` está vazio | 4 | Intenção maliciosa |
| 20 | `${http_sec_fetch_site}` está vazio | 4 | Intenção maliciosa |
| 21 | `${server_fingerprint}` corresponde a uma entrada em `bad_fingerprint_list` | 32 | Comportamento malicioso de navegador |
| 22 | `${http_user_agent}` corresponde a um user agent de navegador desatualizado conhecido | 6 | Assinaturas de bots maliciosos |
| 23 | `${server_protocol}` é HTTP/1.0 ou HTTP/1.1 | 6 | Bots scriptados |
| 24 | `${geoip_asn}` corresponde a um ASN de provedor de nuvem conhecido | 4 | Provedor de nuvem |
| 25 | `${http_user_agent}` corresponde a um user agent de navegador headless conhecido | 4 | Assinaturas de bots maliciosos |
| 26 | `${http_user_agent}` corresponde a um user agent de cliente scriptado conhecido | 8 | Assinaturas de bots maliciosos |

:::note
As regras 15, 16 e 17 dependem do sistema de validação de cookies assinados integrado. Na primeira requisição de um navegador, o Bot Manager Lite define dois cookies de sessão: `az_botm` (um identificador único da requisição) e `az_asm` (uma versão assinada com HMAC do mesmo valor). Nas requisições seguintes, a função verifica se os dois cookies ainda são consistentes. Uma incompatibilidade aciona a regra 17.
:::

:::caution[Atenção]
As regras 18–26 são novas na v0.2.0 e entram em produção sem calibração prévia. Dependendo do perfil de tráfego da sua aplicação, elas podem gerar falsos positivos. Monitore seus logs e use `disabled_rules` para excluir qualquer regra que corresponda consistentemente a tráfego legítimo antes de alternar de `allow` para uma ação de bloqueio.
:::

Você pode desabilitar regras específicas usando o argumento `disabled_rules`. Consulte [Configure a função](#configure-a-funcao) para mais detalhes.

## Detalhes da function

A função é implementada em JavaScript e é executada dentro do Firewall. Você configura seu comportamento por meio dos JSON Args. Os logs são transmitidos via Data Stream e Real-Time Events.

## Logs e integração

Você pode configurar os registros de log para capturar uma ampla gama de dados de requisição, excluindo cabeçalhos sensíveis listados na descrição do argumento `log_headers`. A solução também valida endereços IP usando Network Lists de reputação definidas no argumento `reputation_network_lists`, aumentando a pontuação de ameaça das requisições correspondentes.

### Configure a função

A função aceita os seguintes argumentos:

| Variável | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| `action` | String | Sim | A ação a ser tomada pela função sempre que a pontuação da requisição for igual ou maior ao limite definido. Valores possíveis: `allow`, `deny`, `redirect`, `custom_html`, `drop`, `random_delay` e `hold_connection`. Saiba mais sobre a [configuração de actions](#configuracao-de-actions) |
| `threshold` | Número | Sim | A pontuação máxima que a requisição pode atingir antes que a função execute uma ação. Se não tiver valor, a função não agirá |
| `disabled_rules` | Array de números | Não | As regras a serem desativadas. Se uma regra estiver desabilitada, ela não será processada nem aumentará a pontuação da requisição |
| `internal_logs` | String | Não | A classe de logging que a função usará. Valores possíveis:<br/>`"0"`: escrever logs se a pontuação da requisição for maior que 0 (padrão).<br/>`"1"`: escrever logs apenas se a pontuação da requisição for maior que 0, ou se a requisição for classificada como Good Bot.<br/>`"2"`: sempre escrever logs.<br/>`"3"`: nunca escrever logs.<br/>Quando este campo não tiver valor ou tiver um valor inválido, a função usará o valor padrão `"0"` |
| `log_headers` | Array de strings | Não | Define quais cabeçalhos de requisição devem ser incluídos no log de relatórios da função. Por razões de segurança, os seguintes cabeçalhos são proibidos: `authorization`, `cookie`, `proxy-authorization`, `set-cookie`, `x-csrf-token`, `x-api-key`, `x-amz-security-token`. **Nota**: os valores dos cabeçalhos serão armazenados com codificação base64 |
| `log_tag` | String | Não | Uma tag para identificar nos logs a instância da função que gerou a requisição. Use tags únicas ao executar múltiplas instâncias |
| `reputation_network_lists` | Array de números | Não | IDs de Network Lists usadas para validar o IP do cliente. Se o IP for encontrado em alguma lista, a pontuação da requisição aumenta 6 pontos por lista correspondida. Padrão: lista vazia |
| `session_signature_key` | String | Não | Assina o cookie de sessão `az_asm` usando HMAC para proteger contra adulteração de cookies. Se este campo não tiver valor ou tiver um valor inválido, a função usará o valor padrão `az` |
| `should_write_warning_logs` | Boolean | Não | Define se a função registrará logs de aviso no Real-Time Events. Valor padrão: `false` |
| `good_fingerprint_list` | Array de strings | Não | Fingerprints com boa reputação conhecida. Requisições que correspondam a qualquer fingerprint desta lista ignoram todas as regras de análise de bot. Padrão: lista vazia |
| `bad_fingerprint_list` | Array de strings | Não | Fingerprints com má reputação conhecida, avaliados pela regra 21. Uma correspondência adiciona 32 pontos à pontuação da requisição. Padrão: lista vazia |
| `block_ai_bots` | Boolean | Não | Quando definido como `true`, requisições identificadas como provenientes de user agents de AI conhecidos são bloqueadas automaticamente, sem executar nenhuma outra regra de análise de bot. Padrão: `false` |

### Configuração de actions

Azion Bot Manager Lite pode executar 7 ações diferentes sempre que a pontuação da requisição for maior ou igual ao limite (threshold) definido. Saiba mais sobre cada action a seguir:

1. `allow`: permite a continuação da requisição. Para habilitar esta ação, declare-a da seguinte forma:

```json
  "action": "allow"
```

Essa ação não requer argumentos adicionais.

Se o score for menor que o limiar predeterminado, a requisição será processada — `allow` é a ação padrão.

2. `deny`: entrega uma resposta padrão com *Status Code 403*. Para habilitar esta ação, declare-a da seguinte forma:

```json
  "action": "deny"
```

Essa ação não requer argumentos adicionais.

3. `drop`: encerra a requisição sem uma resposta ao usuário. Para habilitar esta ação, declare-a da seguinte forma:

```json
  "action": "drop"
```

Essa ação não requer argumentos adicionais.

4. `redirect`: redireciona a requisição para uma nova URL quando o limite de segurança é atingido. Para habilitar esta ação, declare as variáveis como no exemplo:

```json
  "action": "redirect",
  "redirect_to": "http://xxxxxxxxxx.map.azionedge.net/"
```

Onde `redirect_to` define a nova URL para redirecionar a requisição. Se este campo não estiver preenchido ou estiver preenchido com um valor que não seja uma string, a função se comportará como se a ação `allow` estivesse habilitada.

5. `custom_html`: entrega conteúdo HTML personalizado ao usuário em caso de violação do limite. Para habilitar esta ação, declare as variáveis como no exemplo:

```json
  "action": "custom_html",
  "custom_html": "This should be the custom HTML content",
  "custom_status_code": 418
```

Onde `custom_html` define o conteúdo HTML a ser entregue e `custom_status_code` define o status code HTTP a ser retornado.

- Se `custom_html` não estiver preenchido ou estiver preenchido com um valor que não seja uma string, a função se comportará como se a ação `allow` estivesse habilitada.
- Se `custom_status_code` não estiver preenchido ou estiver preenchido com um valor que não seja um número, o valor padrão será *Status Code 200*.

6. `random_delay`: faz com que a função aguarde um período aleatório entre 1 e 10 segundos antes de permitir que a requisição prossiga. Para habilitar esta ação, declare-a da seguinte forma:

```json
  "action": "random_delay"
```

Essa ação não requer argumentos adicionais.

7. `hold_connection`: retém a requisição, mantendo a conexão aberta por 1 minuto antes de encerrá-la. Para habilitar esta ação, declare-a da seguinte forma:

```json
  "action": "hold_connection"
```

Essa ação não requer argumentos adicionais.

:::note
Usar qualquer valor diferente de `allow`, `deny`, `redirect`, `custom_html`, `drop`, `random_delay` ou `hold_connection` para a variável `action` faz com que a função execute a ação padrão: `allow`.
:::

<DocButton href="/pt-br/documentacao/produtos/guias/bot-manager-lite/" label="Vá para o guia de instalação do Bot Manager Lite" kind="secondary" size="medium" />

<DocButton href="/pt-br/documentacao/produtos/guias/bot-manager-lite-starter-kit/" label="Vá para o guia do Bot Manager Lite Starter Kit" kind="secondary" size="medium" />

<DocButton href="/pt-br/documentacao/produtos/guias/bot-manager-lite-integration-kit/" label="Vá para o guia do Bot Manager Lite Integration Kit" kind="secondary" size="medium" />