# Rule sets

Um rule set é o objeto que guarda o que o [Web Application Firewall](/pt-br/documentacao/plataforma/firewall/#waf) (WAF) procura: as famílias de ameaças contra as quais ele pontua uma requisição e o nível de sensibilidade que transforma um score em um bloqueio. O Azion Console lista esses objetos em **WAF Rules**; a API da Azion e a Azion CLI chamam o mesmo objeto de `waf`.

Um rule set não age sozinho. Ele é executado quando uma regra do [Rules Engine for Firewall](/pt-br/documentacao/plataforma/firewall/rules-engine/) carrega o behavior **Set WAF** que o nomeia, junto com um modo *Logging* ou *Blocking*. O modo pertence a essa regra e não ao rule set, então um mesmo rule set é executado em *Logging* em uma regra e em *Blocking* em outra. Para mais informações, consulte [Score e modos](/pt-br/documentacao/plataforma/firewall/waf/score-e-modos/).

Esta página lista os campos de um rule set, as oito famílias de ameaças que ele pontua, os cinco níveis de sensibilidade e seus limiares, as 63 regras internas por trás das famílias e as superfícies de API e CLI que o gerenciam.

---

## Campos

Um rule set carrega sete campos, quatro que uma requisição define e três que a plataforma define e retorna. A tabela abaixo lista também os seis campos aninhados dentro de `engine_settings`, então ela chega a treze linhas.

| Campo                                                 | Tipo                                                                | Obrigatório     | Padrão                                        | Descrição                                                                               |
| ----------------------------------------------------- | ------------------------------------------------------------------- | --------------- | --------------------------------------------- | --------------------------------------------------------------------------------------- |
| `id`                                                  | integer                                                             | Somente leitura | —                                             | O identificador que todas as chamadas seguintes usam                                    |
| `name`                                                | string, de 1 a 250 caracteres                                       | Sim             | —                                             | O nome do rule set, único dentro da conta. O Console o renderiza como o campo **Name**  |
| `active`                                              | boolean                                                             | Não             | `true`                                        | Se o rule set está ativo. O Console o renderiza como o switch **Active**                |
| `product_version`                                     | string, de 3 a 50 caracteres, nullable, correspondendo a `\d+\.\d+` | Não             | `1.0`                                         | A versão de produto do rule set                                                         |
| `last_editor`                                         | string, até 250 caracteres                                          | Somente leitura | —                                             | O e-mail da conta que alterou o rule set pela última vez                                |
| `last_modified`                                       | date-time                                                           | Somente leitura | —                                             | Quando o rule set foi alterado pela última vez                                          |
| `engine_settings`                                     | object                                                              | Não             | —                                             | O motor de pontuação e o que ele pontua. Seus campos vêm a seguir                       |
| `engine_settings.engine_version`                      | string                                                              | Não             | `2021-Q3`                                     | O build do motor. `2021-Q3` é o único valor aceito                                      |
| `engine_settings.type`                                | string                                                              | Não             | `score`                                       | Como o motor decide. `score` é o único valor aceito                                     |
| `engine_settings.attributes.rulesets`                 | array de integers                                                   | Não             | `[1]`                                         | O rule set gerenciado que o motor executa. `[1]` é o único valor aceito                 |
| `engine_settings.attributes.thresholds`               | array de objects, de 1 a 8 entradas                                 | Não             | Todas as oito famílias de ameaças em `medium` | Uma entrada por família de ameaças, cada uma carregando a sensibilidade a aplicar a ela |
| `engine_settings.attributes.thresholds[].threat`      | string                                                              | Sim             | —                                             | Um dos oito valores listados em Famílias de ameaças                                     |
| `engine_settings.attributes.thresholds[].sensitivity` | string                                                              | Não             | `medium`                                      | Um dos cinco valores listados em Níveis de sensibilidade                                |

**Três campos aceitam exatamente um valor cada.** `rulesets` aceita `[1]`, `engine_version` aceita `2021-Q3` e `engine_settings.type` aceita `score`. Qualquer outro valor retorna `400` com `10039 Invalid Choice`, então uma requisição que carrega um segundo ID de ruleset ou uma versão de motor posterior é rejeitada em vez de rebaixada.

`thresholds` carrega entre 1 e 8 entradas. Uma requisição que nomeia menos de oito famílias é aceita e armazena exatamente o que enviou, e uma requisição que nomeia a mesma família duas vezes retorna `500` em vez de um erro de validação. O formulário do Console sempre escreve as oito. Uma criação que não envia nenhum `engine_settings` produz um rule set completo: ruleset `[1]`, motor `2021-Q3`, tipo `score` e as oito famílias em `medium`.

---

## Famílias de ameaças

O WAF pontua uma requisição contra oito famílias de ameaças. Cada família carrega a sua própria sensibilidade, então uma requisição bloqueada por uma família passa por outra. O Console renderiza as oito como a tabela **Threat Type Configuration** na aba **Main Settings** de um rule set.

| Família de ameaças           | Valor na API            | O que detecta                                                                                                                                                           |
| ---------------------------- | ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SQL Injection                | `sql_injection`         | Detecta uma tentativa de inserir uma consulta SQL por meio dos dados de entrada que o cliente envia para a aplicação                                                    |
| Remote File Inclusions (RFI) | `remote_file_inclusion` | Detecta uma tentativa de incluir um arquivo remoto, normalmente por meio de um script no servidor web                                                                   |
| Directory Traversal          | `directory_traversal`   | Detecta a sanitização insuficiente de nomes de arquivo fornecidos pelo usuário, em que caracteres que significam "subir para o diretório pai" chegam às APIs de arquivo |
| Cross-Site Scripting (XSS)   | `cross_site_scripting`  | Detecta a injeção de scripts client-side em páginas que outros visitantes veem                                                                                          |
| File Upload                  | `file_upload`           | Detecta uma tentativa de enviar um arquivo                                                                                                                              |
| Evading Tricks               | `evading_tricks`        | Detecta truques de codificação usados para escapar de mecanismos de proteção                                                                                            |
| Unwanted Access              | `unwanted_access`       | Detecta uma tentativa de alcançar páginas vulneráveis ou administrativas, e o uso de bots e ferramentas de varredura de segurança                                       |
| Identified Attack            | `identified_attack`     | Detecta ataques conhecidos contra vulnerabilidades comuns em aplicações e servidores                                                                                    |

Toda família tem `medium` como padrão. Unwanted Access e Identified Attack são pontuadas como as outras seis, e uma criação que não envia o array `thresholds` carrega as oito.

---

## Níveis de sensibilidade

Uma requisição carrega um score por família de ameaças que disparou, e cada score é comparado com o limiar da sua própria família. A requisição é bloqueada quando um score alcança esse limiar.

O limiar cai conforme a sensibilidade sobe. Uma sensibilidade maior, portanto, bloqueia mais requisições com menos evidências, e uma sensibilidade menor deixa passar mais requisições: `highest` bloqueia em um score de 4, e `lowest` bloqueia em 40.

| Nível   | Valor na API | Bloqueia em um score de | O que significa                                                                                                     |
| ------- | ------------ | ----------------------- | ------------------------------------------------------------------------------------------------------------------- |
| Highest | `highest`    | 4                       | A tolerância mais estreita. Um único indício da família é suficiente para bloquear                                  |
| High    | `high`       | 8                       | Bloqueia com indícios leves, bem abaixo do que o Medium exige                                                       |
| Medium  | `medium`     | 16                      | O nível recomendado, e o padrão. Bloqueia quando a requisição carrega evidências substanciais                       |
| Low     | `low`        | 24                      | Bloqueia apenas com evidências fortes, e deixa passar requisições limítrofes                                        |
| Lowest  | `lowest`     | 40                      | A tolerância mais ampla. Bloqueia apenas com as evidências mais fortes, e produz o menor número de falsos positivos |

Uma sensibilidade se aplica a uma família de ameaças, e cada família é definida de forma independente. No Console, a opção carrega a palavra Sensitivity: a opção padrão diz *Sensitivity Medium*.

Lowest e Low protegem menos a aplicação e bloqueiam menos requisições legítimas. High e Highest fazem o oposto, e aumentam o número de falsos positivos quando o tráfego já observado no modo *Logging* não cobriu a variedade de requisições que a aplicação recebe.

---

## Regras internas

Cada regra interna carrega um identificador numérico, e uma regra que dispara contribui para o score da família de ameaças à qual pertence. O identificador é o que uma exceção nomeia quando ela permite um padrão que a regra pontuaria. Para mais informações, consulte [WAF Exceptions](/pt-br/documentacao/plataforma/firewall/waf/custom-allowed-rules/).

| ID da regra | O que detecta                                                                                                                                 |
| ----------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `0`         | Todas as regras. Não carrega detecção própria e representa todas as outras regras desta tabela                                                |
| `1`         | Conformidade de protocolo: uma requisição estranha que o motor não consegue analisar                                                          |
| `2`         | Um corpo de requisição grande demais para analisar. O corpo é armazenado em disco e não é inspecionado                                        |
| `10`        | Conformidade de protocolo: codificação HEX inválida, incluindo null bytes                                                                     |
| `11`        | Conformidade de protocolo: um header `Content-Type` ausente ou desconhecido em um POST. Aplica-se somente à match zone do corpo da requisição |
| `12`        | Conformidade de protocolo: uma URL com formato inválido                                                                                       |
| `13`        | Conformidade de protocolo: um formato de POST inválido                                                                                        |
| `14`        | Conformidade de protocolo: um boundary de POST inválido                                                                                       |
| `15`        | Conformidade de protocolo: JSON inválido                                                                                                      |
| `16`        | Conformidade de protocolo: um POST sem corpo                                                                                                  |
| `17`        | Possível ataque de SQL Injection: validação com `libinjection_sql`                                                                            |
| `18`        | Possível ataque de XSS: validação com `libinjection_xss`                                                                                      |
| `1000`      | Possível ataque de SQL Injection: palavras-chave SQL em `Body`, `Path`, `Query String` ou `Cookies`                                           |
| `1001`      | Possível ataque de SQL Injection ou XSS: aspas duplas `"` em `Body`, `Path`, `Query String` ou `Cookies`                                      |
| `1002`      | Possível ataque de SQL Injection: possível codificação hexadecimal `0x` em `Body`, `Path`, `Query String` ou `Cookies`                        |
| `1003`      | Possível ataque de SQL Injection: comentário MySQL `/*` em `Body`, `Path`, `Query String` ou `Cookies`                                        |
| `1004`      | Possível ataque de SQL Injection: comentário MySQL `*/` em `Body`, `Path`, `Query String` ou `Cookies`                                        |
| `1005`      | Possível ataque de SQL Injection: palavra-chave MySQL `\|` em `Body`, `Path`, `Query String` ou `Cookies`                                     |
| `1006`      | Possível ataque de SQL Injection: palavra-chave MySQL `&&` em `Body`, `Path`, `Query String` ou `Cookies`                                     |
| `1007`      | Possível ataque de SQL Injection: comentário MySQL `--` em `Body`, `Path`, `Query String` ou `Cookies`                                        |
| `1008`      | Possível ataque de SQL Injection ou XSS: ponto e vírgula `;` em `Body`, `Path` ou `Query String`                                              |
| `1009`      | Possível ataque de SQL Injection: sinal de igual `=` em `Body` ou `Query String`                                                              |
| `1010`      | Possível ataque de SQL Injection ou XSS: parêntese de abertura `(` em `Body`, `Path`, `Query String` ou `Cookies`                             |
| `1011`      | Possível ataque de SQL Injection ou XSS: parêntese de fechamento `)` em `Body`, `Path`, `Query String` ou `Cookies`                           |
| `1013`      | Possível ataque de SQL Injection ou XSS: apóstrofo `'` em `Body`, `Path`, `Query String` ou `Cookies`                                         |
| `1015`      | Possível ataque de SQL Injection: vírgula `,` em `Body`, `Path`, `Query String` ou `Cookies`                                                  |
| `1016`      | Possível ataque de SQL Injection: comentário MySQL `#` em `Body`, `Path`, `Query String` ou `Cookies`                                         |
| `1017`      | Possível ataque de SQL Injection: arroba duplo `@@` em `Body`, `Path`, `Query String` ou `Cookies`                                            |
| `1100`      | Possível ataque de RFI: esquema `http://` em `Body`, `Query String` ou `Cookies`                                                              |
| `1101`      | Possível ataque de RFI: esquema `https://` em `Body`, `Query String` ou `Cookies`                                                             |
| `1102`      | Possível ataque de RFI: esquema `ftp://` em `Body`, `Query String` ou `Cookies`                                                               |
| `1103`      | Possível ataque de RFI: esquema `php://` em `Body`, `Query String` ou `Cookies`                                                               |
| `1104`      | Possível ataque de RFI: esquema `sftp://` em `Body`, `Query String` ou `Cookies`                                                              |
| `1105`      | Possível ataque de RFI: esquema `zlib://` em `Body`, `Query String` ou `Cookies`                                                              |
| `1106`      | Possível ataque de RFI: esquema `data://` em `Body`, `Query String` ou `Cookies`                                                              |
| `1107`      | Possível ataque de RFI: esquema `glob://` em `Body`, `Query String` ou `Cookies`                                                              |
| `1108`      | Possível ataque de RFI: esquema `phar://` em `Body`, `Query String` ou `Cookies`                                                              |
| `1109`      | Possível ataque de RFI: esquema `file://` em `Body`, `Query String` ou `Cookies`                                                              |
| `1110`      | Possível ataque de RFI: esquema `gopher://` em `Body`, `Query String` ou `Cookies`                                                            |
| `1198`      | Possível ataque de RCE: validação com log4j (Log4Shell) em `Headers`                                                                          |
| `1199`      | Possível ataque de RCE: validação com log4j (Log4Shell) em `Body`, `Path`, `Query String`, `Headers` ou `Cookies`                             |
| `1200`      | Possível ataque de Directory Traversal: ponto duplo `..` em `Body`, `Path`, `Query String` ou `Cookies`                                       |
| `1202`      | Possível ataque de Directory Traversal: sonda conhecida `/etc/passwd` em `Body`, `Path`, `Query String` ou `Cookies`                          |
| `1203`      | Possível ataque de Directory Traversal: caminho conhecido do Windows `c:\` em `Body`, `Path`, `Query String` ou `Cookies`                     |
| `1204`      | Possível ataque de Directory Traversal: sonda conhecida `cmd.exe` em `Body`, `Path`, `Query String` ou `Cookies`                              |
| `1205`      | Possível ataque de Directory Traversal: barra invertida `\` em `Body`, `Path`, `Query String` ou `Cookies`                                    |
| `1206`      | Possível ataque de Directory Traversal: barra `/` em `Body`, `Query String` ou `Cookies`                                                      |
| `1207`      | Possível ataque de Directory Traversal: sonda de path conhecida `/..;/` em `Body`, `Query String` ou `Cookies`                                |
| `1208`      | Possível ataque de Directory Traversal: sonda de path conhecida `/.;/` em `Body`, `Query String` ou `Cookies`                                 |
| `1209`      | Possível ataque de Directory Traversal: sonda de path conhecida `/.%2e/` em `Body`, `Query String` ou `Cookies`                               |
| `1210`      | Possível ataque de Directory Traversal: sonda de path conhecida `/%2e./` em `Body`, `Query String` ou `Cookies`                               |
| `1302`      | Possível ataque de XSS: tag HTML de abertura `<` em `Body`, `Path`, `Query String` ou `Cookies`                                               |
| `1303`      | Possível ataque de XSS: tag HTML de fechamento `>` em `Body`, `Path`, `Query String` ou `Cookies`                                             |
| `1310`      | Possível ataque de XSS: colchete de abertura `[` em `Body`, `Path`, `Query String` ou `Cookies`                                               |
| `1311`      | Possível ataque de XSS: colchete de fechamento `]` em `Body`, `Path`, `Query String` ou `Cookies`                                             |
| `1312`      | Possível ataque de XSS: caractere til `~` em `Body`, `Path`, `Query String` ou `Cookies`                                                      |
| `1314`      | Possível ataque de XSS: crase `` ` `` em `Body`, `Path`, `Query String` ou `Cookies`                                                          |
| `1315`      | Possível ataque de XSS: codificação dupla `%[2\|3]` em `Body`, `Path`, `Query String` ou `Cookies`                                            |
| `1400`      | Possível truque para escapar da proteção: codificação UTF7/8 `&#` em `Body`, `Path`, `Query String` ou `Cookies`                              |
| `1401`      | Possível truque para escapar da proteção: codificação MS `%U` em `Body`, `Path`, `Query String` ou `Cookies`                                  |
| `1402`      | Possível truque para escapar da proteção: caracteres codificados `%20-%3F` em `Body`, `Query String` ou `Cookies`                             |
| `1500`      | Possível tentativa de File Upload: `.ph`, `.asp` ou `.ht` em um nome de arquivo em um POST multipart que carrega um arquivo                   |
| `2001`      | Possível ataque de CVE-2022-22965: adulteração do Tomcat Pipeline Context                                                                     |

A regra `0` significa todas as regras, e uma exceção criada contra ela se aplica a todas as outras regras da tabela.

O dropdown **Rule ID** do Console oferece 62 dessas 63. A regra `1314` está ausente da lista, e a API a aceita, então uma exceção para a crase é criada pela API ou pela CLI.

Algumas requisições que falham na regra `13` são bloqueadas mesmo quando o rule set é executado no modo *Logging*. Para o tamanho do corpo da requisição que a regra `2` mede, consulte [Limites de Firewall](/pt-br/documentacao/plataforma/firewall/limites/#waf).

---

## API

Toda operação é autenticada e fica sob `https://api.azion.com/v4/workspace/wafs`. Uma requisição carrega um token de [Personal Tokens](/pt-br/documentacao/fundamentos/personal-tokens/) no header `Authorization` sob o esquema `Token`, e uma requisição com corpo também carrega `Content-Type: application/json`.

| Operação                       | Método e path               |
| ------------------------------ | --------------------------- |
| Criar um rule set              | `POST /wafs`                |
| Listar rule sets               | `GET /wafs`                 |
| Recuperar um rule set          | `GET /wafs/{waf_id}`        |
| Substituir um rule set         | `PUT /wafs/{waf_id}`        |
| Atualizar parte de um rule set | `PATCH /wafs/{waf_id}`      |
| Excluir um rule set            | `DELETE /wafs/{waf_id}`     |
| Clonar um rule set             | `POST /wafs/{waf_id}/clone` |

Uma criação, uma clonagem e uma atualização parcial respondem `202`, e o envelope carrega um `state` igual a `pending` ao lado do objeto. Uma leitura responde `200` e carrega apenas `data`, sem a chave `state`.

### Criar um rule set

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/wafs \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "my-waf-rule-set",
  "active": true,
  "product_version": "1.0",
  "engine_settings": {
    "engine_version": "2021-Q3",
    "type": "score",
    "attributes": {
      "rulesets": [1],
      "thresholds": [
        { "threat": "cross_site_scripting", "sensitivity": "medium" },
        { "threat": "directory_traversal", "sensitivity": "medium" },
        { "threat": "evading_tricks", "sensitivity": "medium" },
        { "threat": "file_upload", "sensitivity": "medium" },
        { "threat": "identified_attack", "sensitivity": "medium" },
        { "threat": "remote_file_inclusion", "sensitivity": "medium" },
        { "threat": "sql_injection", "sensitivity": "medium" },
        { "threat": "unwanted_access", "sensitivity": "medium" }
      ]
    }
  }
}'
```

A resposta carrega `202`, e não `201`:

```json
{
  "state": "pending",
  "data": {
    "id": 12345,
    "active": true,
    "name": "my-waf-rule-set",
    "last_editor": "[ACCOUNT EMAIL]",
    "last_modified": "2026-01-01T12:00:00.000000Z",
    "product_version": "1.0",
    "engine_settings": {
      "engine_version": "2021-Q3",
      "type": "score",
      "attributes": {
        "rulesets": [1],
        "thresholds": [
          { "threat": "cross_site_scripting", "sensitivity": "medium" },
          { "threat": "directory_traversal", "sensitivity": "medium" },
          { "threat": "evading_tricks", "sensitivity": "medium" },
          { "threat": "file_upload", "sensitivity": "medium" },
          { "threat": "identified_attack", "sensitivity": "medium" },
          { "threat": "remote_file_inclusion", "sensitivity": "medium" },
          { "threat": "sql_injection", "sensitivity": "medium" },
          { "threat": "unwanted_access", "sensitivity": "medium" }
        ]
      }
    },
    "version_id": null,
    "version_state": null,
    "is_versioned": false,
    "version": null
  }
}
```

O `state` igual a `pending` diz que o rule set foi aceito, e o `id` em `data` é o identificador que todas as chamadas seguintes usam. `last_editor` carrega o e-mail da conta que alterou o rule set pela última vez, e o valor acima é um placeholder. A resposta também carrega `version_id`, `version_state`, `is_versioned` e `version`, que um corpo de criação não define. A API retorna os thresholds ordenados por `threat`, seja qual for a ordem em que a requisição os enviou.

### Listar rule sets

```bash
curl --request GET \
  --url https://api.azion.com/v4/workspace/wafs \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]'
```

A resposta carrega `200` e o envelope de coleção abaixo, com um rule set por entrada em `results`, cada um no formato que a resposta de criação carrega.

| Campo         | O que carrega                                                    |
| ------------- | ---------------------------------------------------------------- |
| `count`       | Rule sets que a conta possui                                     |
| `total_pages` | Páginas em que o resultado se divide, no `page_size` atual       |
| `page`        | A página que esta resposta carrega                               |
| `page_size`   | Rule sets por página. O padrão é 10                              |
| `next`        | A URL da página seguinte, ou `null`                              |
| `previous`    | A URL da página anterior, ou `null`                              |
| `results`     | Um rule set por entrada, carregando os campos listados em Campos |

O endpoint aceita `fields`, `id`, `name`, `ordering`, `page`, `page_size` e `search` como query parameters. `page_size` vai de 1 a 100 e tem 10 como padrão. Um valor acima de 100 retorna `400` com `10097 Invalid Page Size`.

### Recuperar, atualizar e excluir um rule set

`GET /wafs/{waf_id}` responde `200` e retorna o rule set em `data`.

`PUT /wafs/{waf_id}` substitui um rule set e recebe o mesmo corpo de uma criação. `PATCH /wafs/{waf_id}` recebe apenas os campos enviados e responde `202` com um `state` igual a `pending`. Um `PATCH` que carrega `engine_settings` substitui todo o array `thresholds` em vez de mesclá-lo entrada por entrada, então uma atualização parcial envia todas as famílias de ameaças que o rule set deve manter.

`DELETE /wafs/{waf_id}` remove um rule set e responde `202` com um `state` `pending`. Enquanto o comportamento *Set WAF* de uma regra ainda aplica o rule set, a exclusão é recusada com `26007`.

### Clonar um rule set

Uma clonagem é uma cópia profunda de um rule set existente, incluindo as suas exceções.

```bash
curl --request POST \
  --url https://api.azion.com/v4/workspace/wafs/12347/clone \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
  "name": "my-waf-rule-set-clone"
}'
```

A resposta carrega `202`, um `state` igual a `pending` e o novo rule set: um novo `id`, o `name` que a requisição enviou e as famílias de ameaças e sensibilidades copiadas da origem. A API não adiciona sufixo e não deriva nenhum nome próprio.

O corpo é obrigatório, e o `name` dentro dele também. Uma clonagem enviada sem corpo, ou com um objeto vazio, retorna `400`:

```json
{
  "errors": [
    {
      "code": "10059",
      "title": "Required Field",
      "detail": "This field is required.",
      "status": "400",
      "source": {
        "pointer": "/data/name"
      }
    }
  ]
}
```

---

## CLI

A [Azion CLI](/pt-br/documentacao/devtools/cli/) gerencia rule sets sob o substantivo `waf`. As flags abaixo são as que a Azion CLI 4.23.0 carrega, sem as flags globais que todo comando recebe.

| Comando              | O que faz                             |
| -------------------- | ------------------------------------- |
| `azion create waf`   | Cria um rule set                      |
| `azion list waf`     | Lista os rule sets que a conta possui |
| `azion describe waf` | Retorna um rule set                   |
| `azion update waf`   | Altera um rule set                    |
| `azion delete waf`   | Remove um rule set                    |

`azion create waf` e `azion update waf` compartilham as suas flags, exceto que `--product-version` pertence à criação e `--waf-id` à atualização.

| Flag                | O que define                                                                                 |
| ------------------- | -------------------------------------------------------------------------------------------- |
| `--name`            | O nome do rule set                                                                           |
| `--active`          | `true` ou `false`                                                                            |
| `--rulesets`        | Os IDs dos rulesets gerenciados, separados por vírgula. `1` é o único valor que a API aceita |
| `--thresholds`      | Pares `threat=sensitivity` separados por vírgula, um por família de ameaças                  |
| `--engine-version`  | O build do motor. `2021-Q3` é o único valor que a API aceita                                 |
| `--type`            | O tipo do motor. `score` é o único valor que a API aceita                                    |
| `--product-version` | A versão de produto. Somente `azion create waf`                                              |
| `--waf-id`          | O rule set a alterar. Somente `azion update waf`                                             |
| `--file`            | Um arquivo JSON carregando o corpo, ou `-` para ler o corpo da entrada padrão                |

`azion list waf` recebe `--details`, `--filter` para filtrar por nome, `--order-by`, `--page` com padrão `1` e `--page-size` com padrão `50`. `azion describe waf` e `azion delete waf` recebem cada um `--waf-id`.

Uma criação que define todas as famílias de ameaças recebe um único valor em `--thresholds`:

```bash
azion create waf --name "my-waf-rule-set-cli" --active true --rulesets 1 \
  --thresholds "sql_injection=medium,cross_site_scripting=medium,directory_traversal=medium,evading_tricks=medium,file_upload=medium,identified_attack=medium,remote_file_inclusion=medium,unwanted_access=medium"
```

```text
Created WAF with ID 12346
```

Uma criação que não define nada além de um nome produz um rule set completo:

```bash
azion create waf --name "my-waf-rule-set-defaults"
```

```text
Created WAF with ID 12347
```

`azion describe waf --waf-id 12347 --format json` retorna o rule set armazenado, com as chaves ordenadas pela CLI:

```json
{"active": true,
 "engine_settings": {"attributes": {"rulesets": [1],
   "thresholds": [{"sensitivity": "medium", "threat": "cross_site_scripting"},
                  {"sensitivity": "medium", "threat": "directory_traversal"},
                  {"sensitivity": "medium", "threat": "evading_tricks"},
                  {"sensitivity": "medium", "threat": "file_upload"},
                  {"sensitivity": "medium", "threat": "identified_attack"},
                  {"sensitivity": "medium", "threat": "remote_file_inclusion"},
                  {"sensitivity": "medium", "threat": "sql_injection"},
                  {"sensitivity": "medium", "threat": "unwanted_access"}]},
  "engine_version": "2021-Q3", "type": "score"},
 "id": 12347, "is_versioned": false, "last_editor": "[ACCOUNT EMAIL]",
 "last_modified": "2026-01-01T12:00:30.00000Z", "name": "my-waf-rule-set-defaults",
 "product_version": "1.0", "version": null, "version_id": null, "version_state": null}
```

> **nota**
>
> O help distribuído carrega dois exemplos que não funcionam. `azion create waf` mostra `--rulesets "1,2,3"`, e `1` é o único ruleset que a API aceita. `azion update waf` mostra uma flag `--in`, e a flag é `--file`.

---

## Erros

Uma requisição rejeitada retorna um array `errors`. Cada entrada carrega um `code`, um `title`, um `detail`, o `status` e um ponteiro `source` que nomeia o campo a que a rejeição se refere:

```json
{
  "errors": [
    {
      "code": "10046",
      "title": "Max Length",
      "detail": "Ensure this field has no more than 250 characters.",
      "status": "400",
      "source": {
        "pointer": "/data/name"
      }
    }
  ]
}
```

| Código  | Título                 | Status | O que causa                                                                                                                      | O que fazer                                                                                                                                                                                                                   |
| ------- | ---------------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `10004` | Not Found              | 404    | O não encontrado genérico da plataforma. Um `POST` para `/wafs/{waf_id}/exceptions` que nomeia um `waf_id` inexistente o retorna | Verifique cada segmento do path                                                                                                                                                                                               |
| `10009` | Unsupported Media Type | 415    | Uma escrita enviada com um `Content-Type` diferente de `application/json`                                                        | Envie `Content-Type: application/json`                                                                                                                                                                                        |
| `10018` | Blank Field            | 400    | Um `name` que é uma string vazia                                                                                                 | Envie um `name` de 1 a 250 caracteres                                                                                                                                                                                         |
| `10039` | Invalid Choice         | 400    | Um valor fora de um enum: `threat`, `sensitivity`, `rulesets`, `engine_settings.type` ou `engine_version`                        | Envie um dos valores que o enum permite: as famílias de ameaças estão em Famílias de ameaças, os níveis de sensibilidade em Níveis de sensibilidade, e os três campos restantes em Campos. O ponteiro `source` nomeia o campo |
| `10046` | Max Length             | 400    | Um `name` com mais de 250 caracteres                                                                                             | Encurte o nome                                                                                                                                                                                                                |
| `10059` | Required Field         | 400    | Um campo obrigatório está ausente, como uma clonagem enviada sem `name`                                                          | Adicione o campo que o ponteiro `source` nomeia                                                                                                                                                                               |
| `10067` | Internal Server Error  | 500    | O mesmo `threat` duas vezes em `thresholds`                                                                                      | Envie uma entrada por família de ameaças                                                                                                                                                                                      |
| `10097` | Invalid Page Size      | 400    | Um `page_size` acima de 100 em uma requisição de listagem                                                                        | Peça 100 ou menos                                                                                                                                                                                                             |
| `26006` | Name Already In Use    | 400    | Um `name` que outro rule set da conta já possui                                                                                  | Escolha outro nome                                                                                                                                                                                                            |
| `26007` | Cannot Delete WAF      | 400    | Um `DELETE` em um rule set que uma regra do Rules Engine ainda aplica por um comportamento `set_waf`                             | Exclua cada regra que o erro nomeia, ou aponte o *Set WAF* dela para outro rule set, e depois exclua o rule set de novo                                                                                                       |

`10067` retorna `500` para um erro do cliente. Uma família de ameaças repetida é respondida com o texto `A server error occurred.`, que não nomeia nem a duplicata nem o campo, então quem confia no código de status conclui que a plataforma está fora do ar, e uma nova tentativa retorna o mesmo `500`. O seu ponteiro `source` diz `/data/attributes/thresholds`, um segmento a menos que o ponteiro que todo outro erro de threshold retorna.

`26007` nomeia duas vezes cada regra que ainda aplica o rule set, como `<firewall-name> - <rule-name>`: uma no `detail`, `It was not possible to perform this operation. To delete this WAF, you must first remove its usage in the following rules engine: ['<firewall-name> - <rule-name>'].`, e outra como uma entrada de `meta.ef_rules_using_waf`. O seu ponteiro `source` diz `/data`.

---

## Recursos relacionados

- [Score e modos](/pt-br/documentacao/plataforma/firewall/waf/score-e-modos.md): O modelo de score por trás destes limiares, e os dois modos em que uma regra aplica um rule set.
- [Crie e aplique um WAF rule set](/pt-br/documentacao/guias/seguranca-de-aplicacoes/firewall-e-waf/criar-waf-rule-set.md): O procedimento que cria um rule set e o aplica por meio do Rules Engine for Firewall.
- [Data Stream](/pt-br/documentacao/plataforma/data-stream.md): O template de eventos de WAF que envia o que um rule set pontuou para o seu próprio destino.
- [Real-Time Events](/pt-br/documentacao/plataforma/real-time-events.md): Os logs brutos de requisição que mostram qual regra disparou e o que ela pontuou.
