# Bot Manager Lite

O Bot Manager Lite é a edição de autosserviço do [Bot Manager](/pt-br/documentacao/plataforma/firewall/#bot-manager), instalada a partir do Azion Marketplace e executada como uma instância de função em um [Firewall](/pt-br/documentacao/plataforma/firewall/). A função instalada está na versão `0.2.0`, é escrita em JavaScript e tira toda a sua configuração de um objeto JSON de argumentos.

A função pontua cada requisição contra 26 regras estáticas. Cada regra que a requisição corresponde soma um número fixo de pontos e, quando o total alcança ou passa o argumento `threshold`, a função aplica o argumento `action`. Uma requisição que fica abaixo do threshold segue pelo [Rules Engine for Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine/) até a aplicação. As regras pontuam as marcas que clientes de raspagem e de força bruta deixam: um user agent ausente, um cabeçalho `Accept-Language` ausente, um cookie de sessão que não verifica.

Esta página lista as 26 regras com os seus IDs, pontuações e classes, os argumentos para os quais a função entrega um padrão e o log de report que ela escreve.

---

## Regras

Cada regra abaixo soma o seu incremento de pontuação ao total corrente da requisição, e a classe nomeia o comportamento que a regra pontua. Uma regra cujo ID está listado no argumento `disabled_rules` não é processada e não soma nada.

| ID | O que corresponde                                                                       | Pontuação | Classe                     |
| -- | --------------------------------------------------------------------------------------- | --------- | -------------------------- |
| 1  | `${http_user_agent}` está vazio                                                         | 8         | Bad bot signatures         |
| 2  | `${http_content_type}` está vazio e `${request_body}` não está vazio                    | 8         | Bad bot signatures         |
| 3  | `${http_referer}` está vazio e `${request_method}` é `POST`, `PUT`, `PATCH` ou `DELETE` | 6         | Malicious intent           |
| 4  | `${http_user_agent}` contém a string `Dalvik`                                           | 4         | Bad bot signatures         |
| 5  | `${http_user_agent}` contém a string `Trident`                                          | 6         | Bad bot signatures         |
| 6  | `${http_user_agent}` contém a string `Headless`                                         | 6         | Bad bot signatures         |
| 7  | `${http_user_agent}` tem mais de 200 caracteres ou menos de 10 caracteres               | 4         | Bad bot signatures         |
| 8  | `${http_user_agent}` corresponde a um user agent de bot malicioso conhecido             | 8         | Scripted bots              |
| 9  | `${http_accept}` está vazio                                                             | 8         | Bad bot signatures         |
| 10 | `${http_accept_language}` está vazio                                                    | 8         | Bad bot signatures         |
| 11 | `${http_range}` está vazio                                                              | 6         | Malicious intent           |
| 12 | `${request_method}` é `TRACE`                                                           | 8         | Malicious intent           |
| 13 | `${http_content_length}` está vazio e `${request_method}` é `POST`, `PUT` ou `PATCH`    | 8         | Bad bot signatures         |
| 14 | O IP do cliente é encontrado em uma Network List de reputação                           | 6         | Reputation Intelligence    |
| 15 | `${request_method}` é `POST`, `PUT` ou `PATCH` e `${cookie_az_botm}` está ausente       | 8         | Malicious browser behavior |
| 16 | `${request_method}` é `POST`, `PUT` ou `PATCH` e `${cookie_az_asm}` está ausente        | 8         | Malicious browser behavior |
| 17 | A verificação de integridade do cookie de sessão falha                                  | 16        | Malicious browser behavior |
| 18 | `${http_sec_fetch_mode}` está vazio                                                     | 4         | Malicious intent           |
| 19 | `${http_sec_fetch_dest}` está vazio                                                     | 4         | Malicious intent           |
| 20 | `${http_sec_fetch_site}` está vazio                                                     | 4         | Malicious intent           |
| 21 | `${server_fingerprint}` corresponde a uma entrada em `bad_fingerprint_list`             | 32        | Malicious browser behavior |
| 22 | `${http_user_agent}` corresponde a um user agent de navegador desatualizado conhecido   | 6         | Bad bot signatures         |
| 23 | `${server_protocol}` é `HTTP/1.0` ou `HTTP/1.1`                                         | 6         | Scripted bots              |
| 24 | `${geoip_asn}` corresponde a um ASN de provedor de nuvem conhecido                      | 4         | Cloud provider             |
| 25 | `${http_user_agent}` corresponde a um user agent de navegador headless conhecido        | 4         | Bad bot signatures         |
| 26 | `${http_user_agent}` corresponde a um user agent de cliente scriptado conhecido         | 8         | Bad bot signatures         |

> **nota**
>
> As regras 15, 16 e 17 leem o par de cookies de sessão que a função define em um navegador, `az_botm` e `az_asm`. Para mais informações, consulte [Score de bots](/pt-br/documentacao/plataforma/firewall/bot-manager/score-de-bots/#cookies-de-sessao).

A regra 14 verifica o IP do cliente contra as [Network Lists](/pt-br/documentacao/plataforma/firewall/network-shield/network-lists/) cujos IDs estão listados em `reputation_network_lists`, e soma 6 pontos para cada lista em que o IP é encontrado.

Dois argumentos tiram uma requisição da tabela antes de ela ser pontuada. Uma requisição cujo fingerprint está listado em `good_fingerprint_list` pula todas as regras acima. Com `block_ai_bots` definido como `true`, uma requisição de um user agent de IA conhecido é bloqueada antes do pipeline de pontuação, então ela não alcança regra nenhuma e não carrega ID de regra na sua linha de log.

> **Atenção**
>
> As regras 18 a 26 são entregues na v0.2.0 sem calibração prévia, então elas podem pontuar tráfego legítimo dependendo do seu perfil de tráfego. Execute a instância com `action` definido como `allow`, leia os IDs das regras no log de report e liste em `disabled_rules` as regras que seguem correspondendo a requisições legítimas antes de passar para uma ação de bloqueio.

Os IDs que uma requisição correspondeu são escritos no log de report, então os valores de `disabled_rules` vêm do seu próprio tráfego, e não desta tabela.

---

## Argumentos

Uma instância do Bot Manager Lite tira toda a sua configuração de um objeto JSON, e nenhum argumento é obrigatório. O Azion Console renderiza o objeto como a seção **Arguments** de uma instância de função, na aba **Functions Instances** do firewall, e a Azion API e o Azion CLI o carregam como `args`. A função instalada não publica esquema de argumentos, então o editor de **Arguments** não tem formulário para construir a partir dele e o objeto é escrito como JSON puro.

Nada verifica esse objeto. Toda chave que uma instância carrega é armazenada e lida de volta exatamente como foi enviada, incluindo uma chave que a função nunca lê. Escreva `thresold` no lugar de `threshold` e a instância guarda `thresold`, a função segue pontuando contra `30` e nenhuma interface relata um problema. Um argumento alcança a função apenas sob o nome que a função lê.

Os padrões entregues são um fallback de execução, não uma cópia. Uma instância criada com `{}` armazena `{}`, então ler uma instância mostra quais argumentos essa instância define, não os valores com que a função é executada.

O Bot Manager Lite v0.2.0 entrega um padrão para oito argumentos:

| Argumento               | Tipo             | Padrão                    | O que faz                                                                                                                                                                                                    |
| ----------------------- | ---------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `action`                | string           | `deny`                    | O que a função faz com uma requisição cuja pontuação está no threshold ou acima dele. Os sete valores estão listados em [Argumentos](/pt-br/documentacao/plataforma/firewall/bot-manager/argumentos/#action) |
| `bad_fingerprint_list`  | array de strings | `[]`                      | Os fingerprints contra os quais a regra 21 pontua, a 32 pontos por correspondência                                                                                                                           |
| `disabled_rules`        | array de números | `[]`                      | Os IDs das regras que a função não processa. Uma regra desabilitada não soma nada à pontuação                                                                                                                |
| `good_fingerprint_list` | array de strings | `[]`                      | Os fingerprints que pulam a tabela de regras inteira                                                                                                                                                         |
| `internal_logs`         | number           | `0`                       | Para quais requisições a função escreve uma linha de log de report. Os quatro valores estão listados abaixo                                                                                                  |
| `log_headers`           | array de strings | Os nove cabeçalhos abaixo | Os cabeçalhos de requisição que a função escreve no log de report                                                                                                                                            |
| `log_tag`               | string           | `bot-manager-instance`    | A tag que identifica a instância no log de report. Dê a cada instância a sua própria tag                                                                                                                     |
| `threshold`             | number           | `30`                      | A pontuação que uma requisição alcança antes de `action` ser executada. Um valor mais baixo age sobre mais requisições, um valor mais alto sobre menos                                                       |

`log_headers` é entregue com nove cabeçalhos: `accept`, `accept-encoding`, `accept-language`, `content-type`, `host`, `referer`, `user-agent`, `x-forwarded-for` e `x-request-id`. O array nomeia os cabeçalhos que a função escreve, e não os cabeçalhos a manter fora do log. Sete cabeçalhos nunca são escritos, qualquer que seja o conteúdo do array: `authorization`, `cookie`, `proxy-authorization`, `set-cookie`, `x-csrf-token`, `x-api-key` e `x-amz-security-token`. Os valores dos cabeçalhos são escritos em base64.

Os sete argumentos abaixo são documentados para o Bot Manager Lite e não são entregues com padrão na função, então **Padrão documentado** é o valor que a documentação informa, e não um valor lido da função instalada.

| Argumento                   | Tipo             | Padrão documentado | O que faz                                                                                                              |
| --------------------------- | ---------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------- |
| `block_ai_bots`             | boolean          | `false`            | Bloqueia uma requisição de um user agent de IA conhecido antes de as regras de pontuação serem executadas              |
| `custom_html`               | string           | —                  | O HTML que a ação `custom_html` devolve. Ausente, ou não sendo uma string, a função executa `allow`                    |
| `custom_status_code`        | number           | `200`              | O status code que a resposta `custom_html` carrega. Ausente, ou não sendo um número, é `200`                           |
| `redirect_to`               | string           | —                  | A URL para onde a ação `redirect` envia a requisição. Ausente, ou não sendo uma string, a função executa `allow`       |
| `reputation_network_lists`  | array de números | `[]`               | Os IDs das Network Lists contra os quais a regra 14 verifica o IP do cliente, a 6 pontos para cada lista correspondida |
| `session_signature_key`     | string           | `az`               | A chave HMAC que assina o cookie de sessão `az_asm`. Ausente, ou inválida, a função usa `az`                           |
| `should_write_warning_logs` | boolean          | `false`            | Se a função escreve logs de aviso no [Real-Time Events](/pt-br/documentacao/plataforma/real-time-events/)              |

O Bot Manager documenta outros argumentos que o Bot Manager Lite não documenta, e os valores que `action` aceita estão listados uma vez para as duas edições. Para mais informações, consulte [Argumentos](/pt-br/documentacao/plataforma/firewall/bot-manager/argumentos/).

### Internal logs

`internal_logs` seleciona para quais requisições a função escreve uma linha de log de report. Um valor que a função não reconhece é lido como `0`.

| Valor | O que a função registra                                                                     |
| ----- | ------------------------------------------------------------------------------------------- |
| `0`   | Uma requisição cuja pontuação está acima de `0`. Este é o padrão                            |
| `1`   | Uma requisição cuja pontuação está acima de `0`, e uma requisição classificada como bot bom |
| `2`   | Todas as requisições                                                                        |
| `3`   | Nenhuma requisição                                                                          |

Defina `internal_logs` como `2` enquanto você calibra uma instância. Uma requisição que pontuou `0` ainda produz uma linha, que é o único jeito de ver que as regras foram executadas e não corresponderam a nada.

---

## Log de report

O Bot Manager Lite escreve uma linha por requisição pontuada. A linha abre com o produto e o
`log_tag` da instância entre colchetes, e depois carrega um objeto JSON de catorze campos:

```text
[Bot-Protection][storefront-bots] Report:  {"request_id":"0123456789abcdef0123456789abcdef","remote_addr":"203.0.113.42","fingerprint":"ge20cn020000_000000000000_000000000000_000000000000","host":"<your-workload-domain>","http_user_agent":"","request_uri":"/","geoip_country":"BR","geoip_region":"SP","asn":"64496","score":28,"bot_category":"Bad Bot Signatures, Malicious Intent detected","classified":"legitimate","action":"allow","matched_rules":[1,10,18,19,20]}
```

O `log_tag` fica no **prefixo**, não no objeto, então um firewall que executa várias instâncias é
diferenciado pelo colchete, e não por um campo. O objeto carrega `request_id`, `remote_addr`,
`fingerprint`, `host`, `http_user_agent`, `request_uri`, `geoip_country`, `geoip_region`, `asn`,
`score`, `bot_category`, `classified`, `action` e `matched_rules`. O Bot Manager escreve um objeto
mais longo; o dicionário de campos das duas edições está em [Logs](/pt-br/documentacao/plataforma/firewall/bot-manager/logs/#campos).

`score` é o total acumulado da requisição em todas as regras que ela correspondeu, e
`matched_rules` carrega os IDs que dispararam, que é de onde vêm os valores de `disabled_rules`. Os
dois concordam com a tabela acima: a linha mostrada correspondeu às regras 1, 10, 18, 19 e 20, cujos
incrementos de 8, 8, 4, 4 e 4 somam o `score` de 28.

`bot_category` é uma lista unida por vírgula das classes das regras que corresponderam, não um valor
único: as regras 1 e 10 são `Bad bot signatures` e as regras 18, 19 e 20 são `Malicious intent`.

`classified` é um veredito relativo ao threshold, não uma propriedade da requisição em si. A mesma
pontuação de 28 pelas mesmas regras é lida como `legitimate` sob um threshold de 30 e como
`bad bot` sob um threshold de 1. Elevar um threshold impede que a ação seja executada e muda como o
tráfego é etiquetado nos logs.

`geoip_country` carrega um código de país, e `fingerprint` carrega quatro segmentos separados por
sublinhado, não um hash único. `request_id` correlaciona a linha com a mesma requisição nas outras
ferramentas de observabilidade da Azion, e `remote_addr` é o IP do cliente que a regra 14 verifica
contra as listas de reputação.

---

## Recursos relacionados

- [Boas práticas de Firewall](/pt-br/documentacao/plataforma/firewall/boas-praticas.md#bot-manager): Como calibrar o threshold e as regras desabilitadas contra o seu próprio tráfego.
- [Instale o Bot Manager Lite](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/bot-manager-lite.md): Instala a função, a instancia em um firewall e a executa a partir de uma regra.
- [Teste o Bot Manager Lite com o Starter Kit](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/frameworks/bot-manager-lite-starter-kit.md): Publica uma aplicação de exemplo com a função já instanciada contra ela.
- [Adicione o Bot Manager Lite a um firewall](/pt-br/documentacao/guias/desenvolvimento-de-aplicacoes/integracoes/bot-manager-lite-integration-kit.md): Adiciona a função a um firewall que já protege uma aplicação.
