# Crie regras no Rules Engine para o Firewall

import Tabs from '~/components/tabs/Tabs'
import Code from '~/components/Code/Code.astro'


Implementar regras em seu firewall usando o [Rules Engine](/pt-br/documentacao/produtos/secure/firewall/rules-engine/) permitirá que você determine as regras que ele deve executar em cenários específicos.

Este guia demonstra o processo de criação de uma regra com um exemplo prático de verificação da existência de um certificado e retorno de uma resposta personalizada quando não houver um. Esse comportamento é útil em cenários como ajustar suas políticas para cumprir os requisitos do BACEN.

:::note
Existem diferentes critérios que requerem módulos diferentes do Firewall. Certifique-se de ter o [módulo correto](/pt-br/documentacao/produtos/secure/firewall/rules-engine/#criteria) ativado para criar suas regras.
:::
---

<Tabs client:visible>
    <Fragment slot="tab.console">Console</Fragment>
    <Fragment slot="tab.api">API</Fragment>

<Fragment slot="panel.console">
Para criar uma regra:

1. [No Azion Console](/pt-br/documentacao/produtos/guias/como-acessar-o-azion-console/), vá para **Firewall**.
2. Selecione o firewall no qual deseja configurar a regra.
3. Clique na aba **Rules Engine**.
4. Clique no botão **+ Rule**.
5. Dê um nome à sua regra e, opcionalmente, uma descrição.
6. Na seção **Criteria**, selecione a variável `SSL Verification Status`.
7. Como operador de comparação, selecione `is equal`.
8. Como argumento, selecione `Missing Client Certificate`.
9. Na seção **Behaviors**, selecione **Set Custom Response**.
10. Como argumentos:
    - Em **Status Code**, adicione `401`.
    - Em **Content Type**, adicione o conteúdo e a descrição do cabeçalho. Exemplo: `application/json`.
    - Em **Content Body**, insira a mensagem que deseja apresentar aos usuários.
11. Clique no botão **Save**.
</Fragment>

<Fragment slot="panel.api">
1. Execute a seguinte requisição `POST` para criar uma regra, substituindo `[TOKEN VALUE]` pelo seu [personal token](/pt-br/documentacao/produtos/guias/personal-tokens/) e a variável `<edge_firewall_id>` pelo valor do ID do firewall:

<Code lang="bash" code={`
curl --request POST \
  --url https://api.azion.com/v4/edge_firewall/firewalls/<edge_firewall_id>/request_rules \
  --header 'Accept: application/json' \
  --header 'Authorization: Token [TOKEN VALUE]' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "SSL Verification",
    "active": true,
    "criteria": [
      [
        {
          "conditional": "if",
          "variable": "\${ssl_verification_status}",
          "operator": "is_equal",
          "argument": "MISSING_CLIENT_CERTIFICATE"
        }
      ]
    ],
    "behaviors": [
      {
        "type": "set_custom_response",
        "attributes": {
          "status_code": 401,
          "content_type": "application/json",
          "content_body": "{}"
        }
      }
    ]
  }'
`} />


| Chave | Descrição |
| --- | --- |
| `name` | Nome da regra |
| `description` | Descrição da regra |
| `behaviors` | Array que armazena objetos que definem comportamentos |
| `criteria` | Array que armazena objetos que definem critérios |

Veja a [documentação da Azion API](https://api.azion.com/) para saber mais sobre os objetos de criteria e behaviors.

2. Você receberá a seguinte resposta:

<Code lang="json" code={`
{
  "results": {
    "name": "SSL Verification",
    "is_active": true,
    "behaviors": [
      {
        "status_code": 401,
        "content_body": "{}",
        "name": "set_custom_response",
        "content_type": "application/json"
      }
    ],
    "criteria": [
      [
        {
          "variable": "ssl_verification_status",
          "operator": "is_equal",
          "conditional": "if",
          "argument": "MISSING_CLIENT_CERTIFICATE"
        }
      ]
    ],
    "last_modified": "2023-11-23T23:54:14.941097Z",
    "last_editor": "your-email@example.com",
    "id": <id>,
    "order": 2
  },
  "schema_version": 3
}
`} />


3. Aguarde alguns minutos para que as alterações se propaguem.

:::tip
Consulte a [documentação da API Azion](https://api.azion.com/) para saber mais sobre todas as funcionalidades disponíveis via API.
:::
</Fragment>

</Tabs>

---

:::tip
Se você precisa encaminhar a identidade do cliente autenticado para o servidor de origem via mTLS — por exemplo, passando o Common Name (CN) do certificado do cliente pelo header `client_cn` — use o [Rules Engine para Applications](/pt-br/documentacao/produtos/build/applications/rules-engine/) com a variável `${ssl_client_s_dn_parsed}` e o behavior **Add Request Header**. Consulte [Especificando variáveis mTLS nos headers HTTP](/pt-br/documentacao/produtos/guias/mtls/#especificando-variaveis-mtls-no-header-da-aplicacao) para um guia completo.
:::
---