Ajustar regras de WAF pré-configuradas para o Cloud Armor

O Cloud Armor fornece regras de WAF pré-configuradas, e cada regra é composta por diversas assinaturas provenientes do conjunto de regras principais (CRS) do OWASP. Cada assinatura corresponde a uma regra de detecção de ataques no conjunto de regras. As solicitações recebidas são avaliadas com base nas regras de WAF pré-configuradas. Uma solicitação é considerada correspondente a uma regra de WAF pré-configurada quando ela coincide com qualquer uma das assinaturas associadas a essa regra. Uma correspondência é identificada quando a expressão evaluatePreconfiguredWaf() retorna o valor true.

Escolher um nível de sensibilidade

Cada assinatura tem um nível de sensibilidade que equivale a um nível de paranoia do OWASP. É possível escolher um nível de sensibilidade entre 0 e 4; no entanto, o nível 0 indica que nenhuma regra está ativada por padrão.

Níveis de sensibilidade mais baixos correspondem a assinaturas mais confiáveis, com menos chances de gerarem falsos positivos. Um nível de sensibilidade elevado fortalece a segurança, porém também aumenta o risco de gerar um falso positivo. Quando você escolhe um nível de sensibilidade para sua regra de WAF pré-configurada, todas as assinaturas com sensibilidade igual ou inferior ao nível escolhido são incluídas. No exemplo a seguir, você ajusta uma regra de WAF pré-configurada selecionando o nível de sensibilidade 1:

evaluatePreconfiguredWaf(
  'sqli-v33-stable',
  {
    'sensitivity': 1
  }
)

Desativar assinaturas de regras

Se você perceber que uma regra de WAF pré-configurada corresponde a mais solicitações do que o necessário, ou se a regra está bloqueando tráfego que deveria ser permitido, é possível ajustá-la para desativar assinaturas com ruídos ou desnecessárias. Para desativar assinaturas em uma regra de WAF pré-configurada específica, basta fornecer à expressão evaluatePreconfiguredWaf() uma lista com os IDs das assinaturas que não deseja utilizar.

O exemplo a seguir demonstra a exclusão de dois IDs de regras do CRS da regra de WAF pré-configurada sqli-v33-stable (CRS 3.3):

evaluatePreconfiguredWaf(
  'sqli-v33-stable',
  {
    'sensitivity': 4,
    'opt_out_rule_ids': ['owasp-crs-v030301-id942350-sqli', 'owasp-crs-v030301-id942360-sqli']
  }
)

Ao desativar IDs de assinaturas em conjuntos de regras CRS pré-configurados, é necessário que a versão do ID da assinatura corresponda à versão do conjunto de regras (CRS 3.0 ou 3.3) para evitar erros de configuração.

Também é possível desativar IDs de assinaturas com a expressão legada evaluatePreconfigureExpr(). Para mais informações sobre expressões de regras de WAF pré-configuradas, confira a referência de linguagem para regras personalizadas.

Ativar assinaturas de regras

Em vez de desativar assinaturas de regras, você pode ativar assinaturas de regras em níveis de sensibilidade que estão desabilitados. Recomendamos ativar assinaturas de regras quando houver menos assinaturas que você deseja usar em um determinado nível de sensibilidade do que regras que você gostaria de desativar. Para ativar assinaturas de regras, o nível de sensibilidade deve ser 0. No exemplo a seguir, todas as assinaturas cve-canary são desativadas em todos os níveis de sensibilidade, e depois são incluídas explicitamente owasp-crs-v030001-id044228-cve e owasp-crs-v030001-id144228-cve:

evaluatePreconfiguredWaf(
  'cve-canary',
  {
    'sensitivity': 0,
    'opt_in_rule_ids': ['owasp-crs-v030001-id044228-cve', 'owasp-crs-v030001-id144228-cve']
  }
)

Excluir campos de solicitação da inspeção

Seu aplicativo personalizado pode ter conteúdo em campos de solicitações (como cabeçalhos, cookies, parâmetros de consulta ou URIs) que corresponda a assinaturas de regras de WAF pré-configuradas, mas que você sabe ser legítimo. Nesse caso, é possível reduzir falsos positivos excluindo esses campos de solicitações da inspeção ao associar uma lista de exclusões de campos de solicitações à regra da política de segurança. Vale ressaltar que, se um campo da solicitação estiver excluído em uma regra de WAF, não é possível usar a ação allow.

Ao configurar uma exclusão de campo de solicitação, você a associa a um destino, que pode ser a regra de WAF pré-configurada completa ou uma lista de assinaturas pertencentes a uma regra de WAF pré-configurada. Você pode especificar uma correspondência exata ou parcial usando um operador de campo e um valor de campo. Os operadores de campo disponíveis são:

  • EQUALS: o operador corresponde se o valor do campo for igual ao valor especificado.
  • STARTS_WITH: o operador corresponde se o valor do campo começar com o valor especificado.
  • ENDS_WITH: o operador corresponde se o valor do campo terminar com o valor especificado.
  • CONTAINS: o operador corresponde se o valor do campo contiver o valor especificado.
  • EQUALS_ANY: o operador corresponde se o valor do campo for qualquer valor.

Nas próximas seções, você encontrará mais detalhes sobre os campos da solicitação que podem ser excluídos da inspeção, acompanhados de exemplos.

Cabeçalhos da solicitação

Uma lista de nomes de cabeçalhos da solicitação cujos valores são excluídos da inspeção durante a avaliação de regras de WAF pré-configuradas.

A exclusão é válida somente para as assinaturas do destino que, originalmente, fariam a inspeção do valor do cabeçalho da solicitação. Isso inclui assinaturas que estão associadas à seguinte flag de solicitação no conjunto de regras principais do OWASP:

  • REQUEST_HEADERS

Apenas o valor dos cabeçalhos da solicitação especificados é excluído da inspeção. O nome permanece sujeito à inspeção.

Cookies da solicitação

Uma lista de nomes de cookies da solicitação cujos valores são excluídos da inspeção durante a avaliação de regras de WAF pré-configuradas.

A exclusão é válida somente para as assinaturas do destino que, originalmente, fariam a inspeção do valor do cookie da solicitação. Isso inclui assinaturas que estão associadas à seguinte flag de solicitação no conjunto de regras principais do OWASP:

  • REQUEST_COOKIES

Apenas o valor dos cookies da solicitação especificados é excluído da inspeção. O nome permanece sujeito à inspeção.

Parâmetros de consulta da solicitação

Uma lista de nomes de parâmetros de consulta da solicitação cujos valores são excluídos da inspeção durante a avaliação de regras de WAF pré-configuradas.

A exclusão é válida somente para as assinaturas do destino que, originalmente, fariam a inspeção dos parâmetros da solicitação. Isso inclui assinaturas que estão associadas às seguintes flags de solicitação no conjunto de regras principais do OWASP:

  • ARGS
  • ARGS_GET
  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE

Apenas o valor dos parâmetros de consulta especificados é excluído da inspeção, podendo estar na string de consulta ou no corpo da solicitação. O nome permanece sujeito à inspeção.

Como os parâmetros de consulta fazem parte do URI e da linha de solicitação, esses campos são reconstituídos para inspeção após a exclusão dos parâmetros de consulta especificados. No entanto, para assinaturas que inspecionam todo o corpo da solicitação (como aquelas associadas à flag de solicitação REQUEST_BODY), a exclusão de parâmetros de consulta não é aplicada.

Por exemplo, se você excluir um parâmetro de consulta chamado “args”, ainda poderá ocorrer uma correspondência em uma assinatura que inspeciona todo o corpo da solicitação, caso o corpo da solicitação contenha um parâmetro “args” e o valor de “args” corresponda.

URI de solicitação

Uma lista de URIs da linha de solicitação, excluindo os dados da string de consulta, que devem ser excluídos da inspeção durante a avaliação de regras de WAF pré-configuradas.

A exclusão é válida somente para as assinaturas do destino que, originalmente, fariam a inspeção do URI de solicitação. Isso inclui assinaturas que estão associadas às seguintes flags de solicitação no conjunto de regras principais do OWASP:

  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE
  • REQUEST_FILENAME
  • REQUEST_BASENAME

Ao excluir qualquer um dos campos anteriores, o campo é totalmente excluído da inspeção, e nenhuma reconstituição é realizada.

Valores dos campos

É necessário especificar um valor de campo se usar um operador de campo diferente de EQUALS_ANY.

Para cabeçalhos da solicitação, cookies da solicitação e parâmetros de consulta da solicitação, o conjunto de caracteres permitido para os valores dos campos inclui os seguintes caracteres:

  • !, #, $, %, &, *, +, -, ., ^, _, `, | e ~
  • Caracteres alfabéticos de A a Z (maiúsculos e minúsculos)
  • Caracteres numéricos de 0 a 9

Ao aplicar exclusões para esses campos de solicitações, os valores dos campos configurados são comparados exatamente como estão com os valores das solicitações (que não diferencia maiúsculas de minúsculas, após qualquer transformação). Não é necessário realizar codificação adicional se você quiser excluir um caractere específico que não esteja no conjunto de caracteres permitido.

No caso de URIs de solicitação, o valor do campo deve estar no formato de URI, obedecendo às seguintes regras:

  • Um esquema pode ser usado, mas apenas http ou https.
  • Um host pode ser usado, podendo ser um endereço IP.
  • Uma porta pode ser usada.
  • Um caminho pode ser usado.
  • Uma consulta não pode ser usada.
  • Um fragmento não pode ser usado.

Ao aplicar exclusões para URIs de solicitação, os valores de campo configurados são comparados exatamente como estão com os URIs da linha de solicitação (que não diferencia maiúsculas de minúsculas, após qualquer transformação), excluindo a string de consulta. Os URIs da linha de solicitação podem ser relativos ou absolutos. Considere isso ao configurar exclusões para URIs de solicitação.

Exemplos

O primeiro exemplo atualiza a regra na política de segurança POLICY_1, em PRIORITY, para adicionar uma configuração de exclusão para todas as assinaturas da regra de WAF pré-configurada sqli-v33-stable, excluindo da inspeção todos os cookies da solicitação:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_1 \
    --target-rule-set "sqli-v33-stable" \
    --request-cookie-to-exclude "op=EQUALS_ANY"

O segundo exemplo atualiza a regra na política de segurança POLICY_2, em PRIORITY, para adicionar uma configuração de exclusão para as assinaturas owasp-crs-v030301-id941140-xss e owasp-crs-v030301-id941270-xss da regra de WAF pré-configurada xss-v33-stable, excluindo da inspeção os cabeçalhos de solicitação que começam com abc ou terminam com xyz:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_2 \
    --target-rule-set "xss-v33-stable" \
    --target-rule-ids "owasp-crs-v030301-id941140-xss,owasp-crs-v030301-id941270-xss" \
    --request-header-to-exclude "op=STARTS_WITH,val=abc" \
    --request-header-to-exclude "op=ENDS_WITH,val=xyz"

O terceiro exemplo atualiza a regra na política de segurança POLICY_3, em PRIORITY, para adicionar uma configuração de exclusão para todas as assinaturas da regra de WAF pré-configurada sqli-v33-stable. Isso exclui da inspeção os parâmetros de consulta da solicitação (analisados com a string de consulta do URI ou o payload do corpo) que sejam iguais a bad-param:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_3 \
    --target-rule-set "sqli-v33-stable" \
    --request-query-param-to-exclude "op=EQUALS,val=bad-param"

O quarto exemplo atualiza a regra na política de segurança POLICY_4, em PRIORITY, para adicionar uma configuração de exclusão para a assinatura owasp-crs-v030301-id930100-lfi da regra de WAF pré-configurada lfi-v33-stable. Isso exclui da inspeção os URIs de solicitação que contenham /bad-path:

gcloud compute security-policies rules add-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_4 \
    --target-rule-set "lfi-v33-stable" \
    --target-rule-ids "owasp-crs-v030301-id930100-lfi" \
    --request-uri-to-exclude "op=CONTAINS,val=/bad-path"

O quinto exemplo atualiza a regra na política de segurança POLICY_5, em PRIORITY para remover todas as exclusões de campos de solicitação para os IDs de regras owasp-crs-v030301-id942110-sqli e owasp-crs-v030301-id942120-sqli em sqli-v33-stable.

gcloud compute security-policies rules remove-preconfig-waf-exclusion PRIORITY \
    --security-policy POLICY_5 \
    --target-rule-set "sqli-v33-stable" \
    --target-rule-ids "owasp-crs-v030301-id942110-sqli,owasp-crs-v030301-id942120-sqli"

Aplicar análise nos valores personalizados do cabeçalho Content-Type

Quando o Cloud Armor avalia o corpo da solicitação em relação às regras de WAF pré-configuradas, o cabeçalho Content-Type indica o formato dos dados no corpo da solicitação. Por padrão, o Cloud Armor trata o conteúdo do corpo da solicitação como uma única string, toda passível de inspeção e correspondência pelas suas regras de WAF pré-configuradas. No entanto, é possível configurar uma análise mais detalhada se as solicitações recebidas tiverem uma codificação diferente. O Cloud Armor é compatível com os seguintes tipos de codificação:

  • JSON
  • GraphQL

Para mais informações, confira Analisar o conteúdo do corpo da solicitação.

A seguir