Ajustar regras WAF pré-configuradas do Google Cloud Armor

O Google Cloud Armor oferece regras WAF pré-configuradas cada uma consiste em váriosassinaturas proveniente dos Conjunto de regras principais do ModSecurity (CRS). Cada assinatura corresponde a uma regra de detecção de ataque no conjunto de regras. As solicitações recebidas são avaliadas em relação às regras WAF pré-configuradas. Uma solicitação corresponderá a uma regra WAF pré-configurada se a solicitação corresponder a qualquer uma das assinaturas associadas à regra WAF pré-configurada. Uma correspondência é feita quando a expressão evaluatePreconfiguredWaf() ou evaluatePreconfiguredExpr() retorna o valor true.

Escolher um nível de sensibilidade

Cada assinatura tem um nível de confidencialidade que corresponde a um nível de paranoia do ModSecurity. Você pode selecionar uma sensibilidade entre 0 e 4, embora o nível de confidencialidade 0 significa que nenhuma regra está ativada por padrão.

Um nível de sensibilidade mais baixo indica assinaturas de maior confiança, que têm menos probabilidade de gerar um falso positivo. Um nível de sensibilidade mais alto aumenta a segurança, mas também aumenta o risco de gerar um falso positivo. Quando você seleciona um nível de confidencialidade para a regra WAF, as assinaturas são ativadas nos níveis de sensibilidade menores ou iguais ao nível de sensibilidade selecionado. No exemplo a seguir, você ajusta uma regra WAF pré-configurada selecionando o nível de sensibilidade de 1:

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

Desativar assinaturas de regras

Se você decidir que uma regra WAF pré-configurada corresponde a mais solicitações do que o necessário ou se a regra estiver bloqueando o tráfego que precisa ser permitido, a regra pode ser ajustada para desativar assinaturas com ruídos ou desnecessárias. Para desativar assinaturas em uma regra WAF pré-configurada específica, forneça uma lista de IDs das assinaturas indesejadas à expressão evaluatePreconfiguredWaf().

O exemplo a seguir exclui dois códigos de regra de CRS da regra WAF sqli-v33-stable (CRS 3.3) pré-configurada:

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

Ao desativar IDs de assinatura de conjuntos de regras CRS pré-configurados, você precisa corresponder a versão do ID de assinatura com a versão do conjunto de regras (CRS 3.0 ou 3.3) para evitar erros de configuração.

Você também pode desativar os IDs de assinatura usando a expressão legada evaluatePreconfigureExpr(). Para mais informações sobre as expressões de regra WAF pré-configuradas, consulte a referência de linguagem de regras personalizadas.

Ativar assinaturas de regras

Em vez de desativar as assinaturas das regras, você pode ativá-las com níveis de sensibilidade desativados. Recomendamos que você ative as assinaturas de regras quando houver menos assinaturas para usar em determinado nível de sensibilidade do que regras para desativar. Para ativar as assinaturas de regras, o nível de confidencialidade precisa ser 0. O exemplo a seguir desativa todas as assinaturas cve-canary em todos os níveis de sensibilidade e, em seguida, ativa explicitamente em 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ção (como cabeçalhos, cookies, parâmetros de consulta ou URIs) que correspondem a assinaturas em regras WAF pré-configuradas, mas que você sabe que são legítimas. Nesse caso, é possível reduzir os falsos positivos excluindo esses campos de solicitação da inspeção, associando uma lista de exclusões de campos de solicitação à regra da política de segurança.

Ao configurar uma exclusão de campo de solicitação, você a associa a um destino, que pode ser uma regra WAF pré-configurada inteira ou uma lista de assinaturas em uma regra WAF pré-configurada. É possível 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 os seguintes:

  • EQUALS: o operador corresponderá se o valor do campo for igual ao valor especificado.
  • STARTS_WITH: o operador corresponde se o valor do campo começa com o valor especificado.
  • ENDS_WITH: o operador corresponde se o valor do campo termina com o valor especificado.
  • CONTAINS: o operador corresponde se o valor do campo contém o valor especificado.
  • EQUALS_ANY: o operador corresponde se o valor do campo for qualquer valor.

As seções a seguir fornecem mais informações sobre os campos de solicitação que podem ser excluídos da inspeção, seguidos de exemplos.

Cabeçalhos de solicitação

Uma lista de nomes de cabeçalhos de solicitação com valor excluído da inspeção durante a avaliação de regras WAF pré-configuradas.

A exclusão só é aplicável a assinaturas no destino que inspecionariam originalmente o valor do cabeçalho da solicitação. Isso inclui assinaturas associadas à seguinte sinalização de solicitação no conjunto de regras principais do ModSecurity:

  • REQUEST_HEADERS

Somente o valor dos cabeçalhos de solicitação especificados é excluído da inspeção. O nome ainda é inspecionado.

Solicitar cookies

Uma lista de nomes de cookies de solicitação com um valor excluído da inspeção durante a avaliação de regras do WAF pré-configuradas.

A exclusão só é aplicável a assinaturas no destino que inspecionam o valor do cookie de solicitação originalmente. Isso inclui assinaturas associadas à seguinte sinalização de solicitação no conjunto de regras principais do ModSecurity:

  • REQUEST_COOKIES

Somente o valor dos cookies de solicitação especificados são excluídos da inspeção. O nome ainda é inspecionado.

Parâmetros de consulta da solicitação

Uma lista de nomes de parâmetros de consulta de solicitação com valor excluído da inspeção durante a avaliação de regras pré-configuradas do WAF.

A exclusão só é aplicável a assinaturas no destino que inspecionariam os parâmetros de solicitação originalmente. Isso inclui assinaturas associadas às seguintes sinalizações de solicitação no conjunto de regras principais do ModSecurity:

  • ARGS
  • ARGS_GET
  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE

Apenas o valor dos parâmetros de consulta especificados são excluídos da inspeção, que pode estar na string de consulta ou no corpo POST. O nome ainda é inspecionado.

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

Por exemplo, se você excluir um parâmetro de consulta chamado "args", ainda poderá ver uma correspondência em uma assinatura que inspeciona todo o corpo da solicitação se a solicitação tiver um parâmetro "args" no corpo POST e no valor de correspondências "args"

URI da solicitação

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

A exclusão só é aplicável a assinaturas no destino que inspecionariam o URI de solicitação originalmente. Isso inclui assinaturas associadas às seguintes sinalizações de solicitação no conjunto de regras principais do ModSecurity:

  • REQUEST_URI
  • REQUEST_URI_RAW
  • REQUEST_LINE
  • REQUEST_FILENAME
  • REQUEST_BASENAME

Ao excluir qualquer um dos campos anteriores, o campo é excluído completamente da inspeção, e não é realizada nova montagem.

Valores de campo

Será necessário especificar um valor de campo se você usar um operador de campo diferente de EQUALS_ANY.

Para cabeçalhos de solicitação, cookies de solicitação e parâmetros de consulta de solicitação, o conjunto de caracteres permitidos para valores de campo inclui os seguintes caracteres:

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

Ao aplicar exclusões a esses campos de solicitação, os valores de campo configurados são comparados como estão em relação aos valores (não diferenciam maiúsculas de minúsculas, após a transformação) da solicitaçã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 permitidos.

Para URIs de solicitação, o valor do campo precisa ser fornecido em um formato de URI, como mostrado a seguir:

  • Um esquema é permitido, mas está restrito a http ou https.
  • Um host é permitido e pode ser um endereço IP.
  • Uma porta é permitida.
  • Um caminho é permitido.
  • Não é permitido fazer uma consulta.
  • Um fragmento não é permitido.

Ao aplicar exclusões para URIs de solicitação, os valores de campo configurados são comparados como estão em relação aos URIs (que não diferenciam maiúsculas de minúsculas, após a transformação) da linha de solicitaçã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.

Examples

O primeiro exemplo atualiza a regra na política de segurança POLICY_1 em PRIORITY para adicionar uma configuração de exclusão a todas as assinaturas na regra WAF sqli-v33-stable para excluir todos os cookies de solicitação da inspeçã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 assinaturas owasp-crs-v030301-id941140-xss e owasp-crs-v030301-id941270-xss na regra WAF xss-v33-stable, para excluir cabeçalhos de solicitação que começam com abc ou terminam com xyz da inspeção:

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 remover todas as exclusões de campo de solicitação dos IDs de regra 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_3 \
    --target-rule-set "sqli-v33-stable" \
    --target-rule-ids "owasp-crs-v030301-id942110-sqli,owasp-crs-v030301-id942120-sqli"

Aplicar a análise a valores de cabeçalho Content-Type personalizados

Quando o Google Cloud Armor avalia o corpo POST em relação às regras de WAF predefinidas, o cabeçalho Content-Type indica o formato dos dados no corpo da solicitação. Por padrão, o Google Cloud Armor lida com o conteúdo do corpo POST como uma string, considerando-o todo qualificado para inspeção e correspondência nas regras de WAF predefinidas. No entanto, será possível configurar uma análise mais precisa se as solicitações recebidas tiverem uma codificação diferente. O Google Cloud Armor é compatível com os seguintes tipos de codificação:

  • JSON
  • GraphQL

Para configurar a lista de valores de cabeçalho Content-Type personalizados aos quais a análise alternativa se aplica, use o exemplo a seguir. O exemplo atualiza a política de segurança POLICY_NAME para ativar a análise JSON e especifica os tipos de conteúdo application/json, application/vnd.api+json, application/vnd.collection+json e application/vnd.hyper+json:

gcloud compute security-policies update POLICY_NAME \
    --json-parsing STANDARD \
    --json-custom-content-types "application/json,application/vnd.api+json,application/vnd.collection+json,application/vnd.hyper+json"

Como alternativa, se a política de segurança estiver protegendo um aplicativo que usa o GraphQL ou recebe conteúdos codificados de GraphQL, é possível usar o argumento STANDARD_WITH_GRAPHQL para analisar o conteúdo do corpo POST como um conteúdo do GraphQL, como no seguinte exemplo:

gcloud compute security-policies update POLICY_NAME \
    --json-parsing STANDARD_WITH_GRAPHQL

A inspeção do corpo POST ainda está limitada aos primeiros 8 KB. Para mais informações, consulte Limitações da política de segurança.

  • Se o conteúdo JSON for maior que 8 KB, o Google Cloud Armor aplicará a análise JSON aos primeiros 8 KB de conteúdo usado que é inspecionado por qualquer regra de WAF predefinida.

  • Se o analisador JSON não retornar um resultado, poderá ser feita uma análise de URI. Se o analisador de URI não retornar nenhum parâmetro de nome-valor ou apenas parâmetros parciais de nome-valor, a string inteira ou parcial vai poder ser tratada como o nome do parâmetro para a inspeção.

A seguir