Rule sets
Consulte os campos de um WAF rule set, suas oito famílias de ameaças, os cinco níveis de sensibilidade e as 63 regras internas por trás deles.
Um rule set é o objeto que guarda o que o Web Application Firewall (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 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.
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.
| 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.
API
Toda operação é autenticada e fica sob https://api.azion.com/v4/workspace/wafs. Uma requisição carrega um token de 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
A resposta carrega 202, e não 201:
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
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.
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:
CLI
A Azion 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:
Uma criação que não define nada além de um nome produz um rule set completo:
azion describe waf --waf-id 12347 --format json retorna o rule set armazenado, com as chaves ordenadas pela CLI:
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:
| 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.