Trabalhar com regras personalizadas do WAF
As regras personalizadas do WAF oferecem potência e flexibilidade ao direcionarem-se ao tráfego HTTP e aplicarem critérios personalizados para bloquear, solicitar autenticação, registrar ou permitir determinadas solicitações.
É possível criar diversos tipos de regras personalizadas para o WAF. No entanto, o número de regras ativas em seu site é limitado pelo seu plano do cliente. Para obter mais informações sobre direitos, consulte Comparação de planos CIS.
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 o console, a CLI, a API ou o Terraform.
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.
-
No console CIS, navegue até a seção Segurança.
-
Selecione a guia Custom rules (Regras personalizadas ) e clique em Create (Criar ).
-
Insira uma descrição opcional.
-
Opcionalmente, insira uma prioridade, se necessário. Uma prioridade 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 unidas por “e” que utilizam 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:
- Salve como rascunho para salvar sua regra, mas mantenha-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:
- No console CIS, navegue até a seção Segurança.
- Selecione a guia “Regras personalizadas ”.
- Na tabela “Regras personalizadas”, localize a regra que você deseja modificar e, em seguida, 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:
- Salve como rascunho para salvar sua regra, mas mantenha-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:
- No console CIS, navegue até a seção Segurança.
- Na tabela “Regras personalizadas”, localize a regra a ser excluída e clique no menu “Ações” à direita da linha.
- Selecione “Excluir ” no menu de ações.
- Clique em Excluir regra personalizada do WAF para excluir a regra.
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 pela CLI. Depois de digitar a senha, o sistema solicita que você indique a conta e a região que 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]Você também pode criar uma regra personalizada fornecendo um arquivo JSON ou uma cadeia de caracteres JSON diretamente:
ibmcloud cis custom-waf rule-create DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
Opções de comando
DNS_DOMAIN_ID-
A ID do domínio DNS.
--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 de regra a ser executada. Valores válidos: "block", "challenge", "js_challenge", "managed_challenge", "log", "skip". Para as ações “bloquear” e “pular”, use um arquivo JSON ou uma string 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 string JSON utilizada para descrever uma regra personalizada.
-
Os campos obrigatórios nos dados JSON são
expressioneaction.expression: Especifica as condições que devem ser atendidas para que a regra seja executada.action: A ação da regra a ser executada. Os valores válidos sãoblock,challenge,js_challenge,managed_challenge,log, eskip.
-
Os campos opcionais são
description,enabled,logging, eaction_parameters.action_parameters: Os parâmetros de ação da regra.rulesetskip: pula todas as regras restantes ou um ou mais conjuntos de regras gerenciados pelo WAF. O valor válido écurrent.phases: Ignora os componentes do WAF para as solicitações correspondentes. Os valores válidos sãohttp_ratelimit,http_request_firewall_managedehttp_request_sbfm.productsskips: Ignora produtos de segurança específicos para solicitações de correspondência. Os valores válidos sãowaf,rateLimit,securityLevel,hot,bic,uaBlock, ezoneLockdown.response: Defina uma resposta personalizada para uma ação do tipo “block”.status_code: Escolha um código de status do tipo “ HTTP ” para a resposta, dentro do intervalo400-499.content_typetipo de conteúdo de uma resposta personalizada: 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.
descriptiondescrição da regra: descreve brevemente a regra.enabled: Indica se a regra está ativa ou não. Quando esse campo está desativado, as solicitações correspondentes não aparecem nas solicitações do firewall.logging: Registrar as solicitações que correspondem à regra de exclusão. Esse campo só está disponível para a ação "ignorar".
-
Dados JSON de amostra:
{
"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- O ID ou o nome da instância. Se não for definido, será utilizada a instância de contexto especificada por
ibmcloud cis instance-set INSTANCE. --output- Especifique o formato de saída; apenas o formato “
JSON” é compatível.
Atualização de uma regra personalizada na CLI
Execute o seguinte comando para atualizar uma regra personalizada a partir da CLI:
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID [--match EXPRESSION] [--action ACTION] [--description DESCRIPTION] [--enabled true|false] [-i, --instance INSTANCE] [--output FORMAT]
Você também pode atualizar uma regra personalizada fornecendo um arquivo JSON ou uma cadeia de caracteres JSON diretamente:
ibmcloud cis custom-waf rule-update DNS_DOMAIN_ID (--json @JSON_FILE | JSON_STRING) [-i, --instance INSTANCE] [--output FORMAT]
Opções de comando
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 de 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 valor padrão é "False".
--description-
Uma breve descrição da regra.
--json-
O arquivo JSON ou a string JSON utilizada para descrever uma regra personalizada.
-
Os campos obrigatórios nos dados JSON são
expressioneaction.expression: Especifica as condições que devem ser atendidas para que a regra seja executada.action: A ação da regra a ser executada. Os valores válidos sãoblock,challenge,js_challenge,managed_challenge,log, eskip.
-
Os campos opcionais são
description,enabled,logging, eaction_parameters.action_parameters: Os parâmetros de ação da regra.rulesetskip: pula todas as regras restantes ou um ou mais conjuntos de regras gerenciados pelo WAF. O valor válido écurrentphases: Ignora os componentes do WAF para as solicitações correspondentes. Os valores válidos sãohttp_ratelimit,http_request_firewall_managedehttp_request_sbfm.productsskips: Ignora produtos de segurança específicos para solicitações de correspondência. Os valores válidos sãowaf,rateLimit,securityLevel,hot,bic,uaBlock, ezoneLockdown.response: Defina uma resposta personalizada para a ação “block”.status_code: Escolha um código de status do tipo “ HTTP ” para a resposta, dentro do intervalo400-499.content_typetipo de conteúdo de uma resposta personalizada: O tipo de conteúdo de uma resposta personalizada. Os tipos de resposta válidos sãotext/html,text/plain,application/jsonetext/xml.content: O corpo da resposta.
descriptiondescrição da regra: descreve brevemente a regra.enabled: Indica se a regra está ativa ou não. Quando esse campo está desativado, as solicitações correspondentes não aparecem nas solicitações do firewall.logging: Registrar as solicitações que correspondem à regra de exclusão. Esse campo só está disponível para a ação "ignorar".
-
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 for definido, será utilizada a instância de contexto especificada por
ibmcloud cis instance-set INSTANCE. --output- Especifique o formato de saída; apenas o formato “
JSON” é compatível.
Exclusão de uma regra personalizada da CLI
Execute o seguinte comando para excluir uma regra personalizada da CLI:
ibmcloud cis custom-waf rule-delete DNS_DOMAIN_ID RULE_ID [-f, --force] [-i, --instance INSTANCE] [--output FORMAT]
Opções de comando
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 for definido, será utilizada a instância de contexto especificada por
ibmcloud cis instance-set INSTANCE. -f, --force- Tentar excluir uma regra personalizada sem solicitar confirmação.
--output- Especifique o formato de saída; apenas o formato “
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
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.
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 está na resposta da solicitação bem-sucedida. Se a chamada anterior 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 estiverem definidas, 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 estiverem inicializadas, 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 estiverem inicializadas, 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"
Criação de uma regra personalizada com o Terraform
Para criar uma regra personalizada, você deve primeiro criar um ponto de entrada e, em seguida, criar a regra personalizada. Para fazer isso, siga estas etapas:
-
Para criar um conjunto de regras de ponto de entrada, execute o seguinte comando:
resource "ibm_cis_ruleset_entrypoint_version" "test" { cis_id = "<cis-id>" domain_id = "<domain-id>" phase = "http_request_firewall_custom" rulesets { description = "Entry point ruleset for custom ruleset" } lifecycle { ignore_changes = [ rulesets ] } } -
Para criar uma regra personalizada, execute o seguinte comando:
resource ibm_cis_ruleset_rule "config" { cis_id = ibm_cis.instance.id domain_id = data.ibm_cis_domain.cis_domain.domain_id ruleset_id = resource.ibm_cis_ruleset_entrypoint_version.rulesets[0].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> } } }
O exemplo a seguir mostra como criar um ponto de entrada e uma regra personalizada do WAF:
resource ibm_cis_ruleset_entrypoint_version test {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
phase = "http_request_firewall_custom"
rulesets {
description = "Entrypoint ruleset for custom ruleset"
}
lifecycle {
ignore_changes = [
rulesets
]
}
}
data ibm_cis_ruleset_entrypoint_versions custom_rule_ep {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
phase = "http_request_firewall_custom"
depends_on = [
ibm_cis_ruleset_entrypoint_version.test
]
}
resource ibm_cis_ruleset_rule "custom_rule1" {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
ruleset_id = data.ibm_cis_ruleset_entrypoint_versions.custom_rule_ep.rulesets[0].ruleset_id
rule {
action = "skip"
description = "adding custom rule via terraform"
expression = "true"
enabled = "true"
action_parameters{
ruleset = "current"
phases = ["http_ratelimit", "http_request_sbfm","http_request_firewall_managed"]
products = ["zoneLockdown","uaBlock", "bic", "hot", "securityLevel", "rateLimit","waf"]
}
}
}
resource ibm_cis_ruleset_rule "custom_rule2" {
cis_id = ibm_cis.instance.id
domain_id = data.ibm_cis_domain.cis_domain.domain_id
ruleset_id = data.ibm_cis_ruleset_entrypoint_versions.custom_rule_ep.rulesets[0].ruleset_id
rule {
action = "block"
description = "adding custom rule via terraform2"
expression = "(http.request.uri.path eq \"/path1\")"
enabled = "false"
}
}
Para obter mais informações, consulte ibm_cis_ruleset_rule no registro do Terraform.
Você pode atualizar uma regra personalizada com o Terraform modificando o exemplo anterior e executando o comando terraform apply. Para excluir a regra, basta remover a configuração e executar terraform apply.