Trabalhar com regras personalizadas do WAF
As regras personalizadas do WAF oferecem poder e flexibilidade ao direcionar o tráfego HTTP e aplicar critérios personalizados para bloquear, contestar, registrar ou permitir determinadas solicitações.
Você pode criar vários tipos de regras personalizadas do WAF. No entanto, o número de regras ativas em seu site é limitado pelo seu plano do cliente. Consulte Comparação de planos CIS para obter mais informações sobre direitos.
O número de regras ativas por plano é fixo. Atualmente, não é possível comprar regras mais ativas.
Antes de começar, é uma boa ideia revisar Usando campos, funções e expressões.
Você pode criar, atualizar e excluir uma regra personalizada usando a interface do usuário, a CLI, a API ou o Terraform.
Trabalhar com regras personalizadas do WAF no console
Criação de uma regra personalizada no console
Siga estas etapas para criar uma regra personalizada no console:
As regras personalizadas do WAF são configuradas usando a página de regras de firewall existentes. Todas as regras de firewall herdadas que foram criadas anteriormente em seu domínio são automaticamente convertidas em regras personalizadas do WAF.
-
Navegue para Segurança > Regras de firewall.
-
Clique em Criar.
-
Insira uma descrição opcional.
-
Opcionalmente, insira uma prioridade, se necessário. Uma prioridade de zero é uma prioridade nula e é avaliada por último.
-
Use o construtor da IU na seção Solicitações recebidas para incluir uma condição. Para construir uma expressão com múltiplas condições, clique em um dos seguintes:
- E- para avaliar as condições de uso e a lógica
- Ou- para avaliar condições ou grupos de condições previamente avaliadas que usam a lógica ou
É possível ver que à medida que você constrói uma condição, a Visualização de expressão mostra a expressão em texto simples.
Na Visualização de expressão, é possível clicar para editar a sua expressão manualmente em vez de usar o Construtor de expressões visuais ou alternar entre os dois. No entanto, dependendo da complexidade de uma expressão construída manualmente, o Visual Expression Builder pode ser incapaz de renderizá-la.
-
Escolha uma ação no menu de listagem Resposta.
-
Para salvar a sua regra, escolha a opção mais apropriada clicando em:
- Salvar como rascunho para salvar sua regra, mas deixe-a desativada.
- Salvar e implementar para salvar sua regra e ativá-la.
Atualização de uma regra personalizada no console
Siga estas etapas para atualizar uma regra personalizada existente no console:
- Navegue para Segurança > Regras de firewall.
- Na tabela de regras do firewall, localize a regra que você deseja modificar e clique no menu Ações à direita da linha.
- Selecione Editar.
- Faça suas mudanças na regra.
- Para salvar a sua regra, escolha a opção mais apropriada clicando em:
- Salvar como rascunho para salvar sua regra, mas deixe-a desativada.
- Salvar e implementar para salvar sua regra e ativá-la.
Para pausar ou ativar qualquer regra na lista de regras existentes, clique na alternância Ativado.
Exclusão de uma regra personalizada no console
Siga estas etapas para excluir uma regra personalizada existente no console:
- Navegue para Segurança > Regras de firewall.
- Na tabela de regras do firewall, localize a regra a ser modificada e clique no menu Ações à direita da linha.
- Selecione ** Excluir **.
- Confirme a exclusão de regra.
Trabalhar com regras personalizadas do WAF na CLI
Criação de uma regra personalizada na CLI
Para criar uma regra personalizada na CLI, siga estas etapas:
-
Configure seu ambiente da CLI.
-
Faça login na sua conta com a CLI. Depois que você digitar a senha, o sistema solicitará a conta e a região que você deseja usar:
ibmcloud login --sso
-
Execute o seguinte comando para criar uma regra personalizada:
ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID --match EXPRESSION --action ACTION [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]
ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID ((--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
Where:
`DNS_DOMAIN_ID`
: The ID of DNS domain.
`--match`
: Specifies the conditions that must be matched for the rule to run. For match value, see [Using fields, functions, and expressions](/docs/cis?topic=cis-fields-and-expressions).
`--action`
:The rule action to perform. Valid values: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip". For "block" and "skip" actions, use JSON file or JSON string instead.
`--enabled`
: Indicates if the rule is active. Default is "false".
`--description`
: A brief description of the rule.
`--json`
: The JSON file or JSON string used to describe a custom rule.
- The required fields in JSON data are `expression`, `action`.
`expression`: Specifies the conditions that must be matched for the rule to run.
`action`: The rule action to perform. Valid values: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip".
- The optional fields are `description`, `enabled`, `logging`, `action_parameters`.
`action_parameters`: The rule action parameters.
`ruleset`: Skip all remaining rules or one or more WAF managed rulesets. Valid value: `current`.
`phases`: Skips WAF components for matching requests. Valid values: "http_ratelimit", "http_request_firewall_managed", "http_request_sbfm".
`products`: Skips specific security products for matching requests. Valid values: "waf", "rateLimit", "securityLevel", "hot", "bic", "uaBlock", "zoneLockdown".
`response`: Define a custom response for 'block' action.
`status_code`: Choose an HTTP status code for the response, in the range 400-499.
`content_type`: The content type of a custom response. Valid response types are :`text/html`,`text/plain`, `application/json`, `text/xml`.
`content`: The response body.
`description`: Briefly describes the rule.
`enabled`: Indicates if the rule is active.
`logging`: Log requests matching the skip rule. This field is only available for the "skip" action.
- `enabled`: When disabled, matched requests don't appear in firewall events.
Sample JSON data:
{
"description": "test-custom-rule",
"expression": "(http.cookie contains \"test\")",
"action": "skip",
"logging": {
"enabled": true
},
"action_parameters": {
"ruleset": "current",
"phases": [
"http_ratelimit",
"http_request_firewall_managed",
"http_request_sbfm"
],
"products": [
"waf",
"rateLimit",
"securityLevel",
"hot",
"bic",
"uaBlock",
"zoneLockdown"
]
},
"enabled": true
}
`-i, --instance`
: Instance name or ID. If not set, the context instance specified by `ibmcloud cis instance-set INSTANCE` is used.
`--output`
: Specify output format, only `JSON` is supported.
### Updating a custom rule from the CLI {: #update-custom-rule-cli}
Run the following command to update a custom rule in the CLI:
```sh {: pre}
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID [--match EXPRESSION] [--action ACTION] [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
Em que:
DNS_DOMAIN_ID
- A ID do domínio DNS.
RULE_ID
- O ID da regra.
--match
- Especifica as condições que devem ser atendidas para que a regra seja executada. Para obter o valor da correspondência, consulte Uso de campos, funções e expressões.
--action
a ação da regra a ser executada. Valores válidos: "block" (bloquear), "challenge" (desafio), "js_challenge" (desafio js), "managed_challenge" (desafio gerenciado), "log"
(registro), "skip" (pular). Para as ações "block" (bloquear) e "skip" (pular), use o arquivo JSON ou a cadeia de caracteres JSON.
--enabled
-
Indica se a regra está ativa. O padrão é "false".
--description
-
Uma breve descrição da regra.
--json
-
O arquivo JSON ou a sequência de caracteres JSON usada para descrever uma regra customizada.
-
Os campos obrigatórios em dados JSON são
expression
,action
.expression
: Especifica as condições que devem ser atendidas para que a regra seja executada.action
: A ação de regra a ser executada. Valores válidos: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip". -
Os campos opcionais são
description
,enabled
,logging
,action_parameters
.action_parameters
: Os parâmetros de ação da regra.ruleset
: Ignorar todas as regras restantes ou um ou mais conjuntos de regras gerenciados pelo WAF. Valores válidos:current
.phases
: Ignora os componentes do WAF para solicitações correspondentes. Valores válidos: "http_ratelimit", "http_request_firewall_managed", "http_request_sbfm".products
: Ignora produtos de segurança específicos para solicitações de correspondência. Valores válidos: "waf", "rateLimit", "securityLevel", "hot", "bic", "uaBlock", "zoneLockdown".response
: Definir uma resposta customizada para a ação "bloquear".status_code
: Escolha um código de status HTTP para a resposta, no intervalo de 400-499.content_type
: O tipo de conteúdo de uma resposta personalizada. Os tipos de resposta válidos são:text/html
,text/plain
,application/json
,text/xml
.content
: O corpo da resposta.description
: Descreve brevemente a regra.enabled
: Indica se a regra está ativa.logging
: Registrar solicitações correspondentes à regra de ignorar. Esse campo só está disponível para a ação "pular".enabled
quando desativado, as solicitações correspondentes não aparecem nos eventos do firewall.
Dados JSON de amostra:
{ "description": "test-custom-rule", "expression": "(http.cookie contains \"test\")", "action": "block", "action_parameters": { "response": { "status_code": 429, "content_type": "text/xml", "content": "reject" } }, "enabled": true }
-
-i, --instance
-
O ID ou o nome da instância. Se não configurado, a instância do contexto especificada por
ibmcloud cis instance-set INSTANCE
será usada. --output
-
Especifique o formato de saída, somente
JSON
é compatível.
Exclusão de uma regra personalizada da CLI
Execute o seguinte comando para excluir uma regra personalizada na CLI:
ibmcloud cis custom-waf rule-delete DNS_DOMAIN_ID RULE_ID [-f, --force] [-i, --instance INSTANCE] [--output FORMAT]
Em que:
DNS_DOMAIN_ID
- A ID do domínio DNS.
RULE_ID
- O ID da regra personalizada.
-i, --instance
- O ID ou o nome da instância. Se não configurado, a instância do contexto especificada por
ibmcloud cis instance-set INSTANCE
será usada. -f, --force
- Tentativa de excluir regra customizada sem solicitar confirmação.
--output
- Especifique o formato de saída, somente
JSON
é compatível.
Exemplos de comando
-
Para criar uma regra personalizada:
ibmcloud cis custom-waf rule-create 601b728b86e630c744c81740f72570c3 --action challenge --description "rule 1" --enabled true --match "(http.host eq \"www.example.com\")"
-
Para atualizar uma regra personalizada:
ibmcloud cis custom-waf rule-update 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27 --enabled true
-
Para excluir uma regra personalizada:
ibmcloud cis custom-waf rule-delete 601b728b86e630c744c81740f72570c3 4d37cb6f87654e96a18bc531628a4d27
Trabalhar com regras personalizadas do WAF com a API
Obtenção do ponto de entrada da regra personalizada para a API
Todas as operações da API de regras personalizadas exigem um RULESET_ID
do conjunto de regras do ponto de entrada para a fase de regras personalizadas. Esse conjunto de regras de ponto de entrada pode já existir ou precisa ser
criado, caso não exista.
Siga estas etapas para obter o conjunto de regras do ponto de entrada da regra personalizada:
-
Configure seu ambiente de API com as variáveis corretas.
-
Armazene os valores a seguir nas variáveis a serem usadas no comando da API:
CRN
: O nome completo do recurso de nuvem (CRN) codificado em URL da instância de serviço.ZONE_ID
: o ID de domínio. -
Quando todas as variáveis forem iniciadas, obtenha o conjunto de regras do ponto de entrada:
curl -X GET "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/phases/http_request_firewall_custom/entrypoint" \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json"
A ID do conjunto de regras estará na resposta da solicitação bem-sucedida. Se a chamada acima retornar uma resposta 404 Not Found, use a API a seguir para criar o conjunto de regras de ponto de entrada para a fase de regras personalizadas:
curl -x POST https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
"name": "Zone-level phase entry point",
"kind": "zone",
"description": "Custom rule entry point ruleset.",
"phase": "http_request_firewall_custom"
}'
Criação de uma regra personalizada com a API
Siga estas etapas para criar uma regra personalizada com a API:
-
Configure seu ambiente de API com as variáveis corretas.
-
Armazene os valores a seguir nas variáveis a serem usadas no comando da API:
CRN
: O nome completo do recurso de nuvem (CRN) codificado em URL da instância de serviço.ZONE_ID
: o ID de domínio.RULESET_ID
: A ID do conjunto de regras do ponto de entrada da regra personalizada. -
Quando todas as variáveis forem iniciadas, crie a regra personalizada:
curl -X POST "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
"description": "My custom rule with plain text response",
"expression": "(ip.src.country eq \"GB\" or ip.src.country eq \"FR\") and cf.waf.score lt 20",
"action": "block",
"action_parameters": {
"response": {
"status_code": 403,
"content": "Your request was blocked.",
"content_type": "text/plain"
}
}
}'
Atualização de uma regra personalizada com a API
Siga estas etapas para atualizar uma regra personalizada existente com a API:
-
Configure seu ambiente de API com as variáveis corretas.
-
Armazene os valores a seguir nas variáveis a serem usadas no comando da API:
CRN
: O nome completo do recurso de nuvem (CRN) codificado em URL da instância de serviço.ZONE_ID
: o ID de domínio.RULESET_ID
: A ID do conjunto de regras do ponto de entrada da regra personalizada.RULE_ID
: A ID da regra personalizada a ser modificada. -
Quando todas as variáveis forem iniciadas, atualize a regra personalizada:
curl -X PATCH "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules/$RULE_ID" \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json" \
--data '{
"enabled": false,
"description": "block GB and FR or based on IP Reputation (temporarily disabled)"
}'
Exclusão de uma regra personalizada com a API
Siga estas etapas para excluir uma regra personalizada existente com a API:
-
Configure seu ambiente de API com as variáveis corretas.
-
Armazene os valores a seguir nas variáveis a serem usadas no comando da API:
CRN
: O nome completo do recurso de nuvem (CRN) codificado em URL da instância de serviço.ZONE_ID
: o ID de domínio.RULESET_ID
: A ID do conjunto de regras do ponto de entrada da regra personalizada.RULE_ID
: A ID da regra personalizada a ser modificada. -
Quando todas as variáveis forem iniciadas, exclua a regra personalizada:
curl -X DELETE "https://api.cis.cloud.ibm.com/v1/$CRN/zones/$ZONE_ID/rulesets/$RULESET_ID/rules/$RULE_ID" \
--header "X-Auth-User-Token: Bearer <API_TOKEN>" \
--header "Content-Type: application/json"
Trabalhar com regras personalizadas do WAF com o Terraform
Criação de uma regra personalizada com o Terraform
O exemplo a seguir cria uma regra personalizada usando o Terraform:
# First get the entrypoint ruleset ID for the phase `http_request_firewall_custom`.
data "ibm_cis_ruleset_entrypoint_versions" "test"{
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
phase = "http_request_firewall_custom"
}
# To create a custom rule:
resource ibm_cis_ruleset_rule "config" {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
ruleset_id = "data.ibm_cis_ruleset_entrypoint_versions.ruleset_id"
rule {
action = "block"
description = "var.description"
expression = "true"
enabled = "false"
action_parameters {
response {
status_code = var.status_code
content = var.content
content_type = "text/plain"
}
}
position {
index = var.index
after = <id of any existing rule>
before = <id of any existing rule>
}
}
}
Para obter mais informações sobre os argumentos e atributos, consulte ibm_cis_ruleset_rule
no registro do Terraform.
Você pode atualizar uma regra personalizada com o Terraform modificando o exemplo anterior usado para criar a regra personalizada e executar o comando terraform apply
. Para excluir a regra, basta remover a configuração e executar
terraform apply
.