Configure atributos de idioma de regras personalizadas

Cada regra da política de segurança do Google Cloud Armor tem uma prioridade, uma condição de correspondência e uma ação. O Cloud Armor executa a ação da regra de prioridade mais elevada que corresponde a um pedido. As regras com uma prioridade inferior à da regra de correspondência de prioridade mais elevada não são avaliadas, mesmo que tenham as mesmas condições de correspondência.

Cada regra de política de segurança suporta dois tipos de condições de correspondência:

  • Uma condição de correspondência básica contém listas de endereços IP ou listas de intervalos de endereços IP. As condições de correspondência básicas são definidas através da flag --src-ip-ranges quando cria uma regra com a Google Cloud CLI.
  • Uma condição de correspondência avançada contém uma expressão com até cinco subexpressões que podem corresponder a uma variedade de atributos de um pedido recebido. As condições de correspondência avançadas são definidas através da flag --expression quando cria uma regra com a CLI do Google Cloud.

Esta página aborda as condições de correspondência avançadas e a linguagem de regras personalizadas do Cloud Armor que usa para escrever expressões nas condições de correspondência avançadas das regras da política de segurança. A linguagem das regras personalizadas do Cloud Armor é um subconjunto do Idioma de expressão comum (IEC). As expressões escritas na linguagem de regras personalizadas do Cloud Armor requerem dois componentes:

  • O atributo: os dados a inspecionar
  • A operação: como usar os dados

Por exemplo, a expressão seguinte usa os atributos origin.ip e 9.9.9.0/24 na operação inIpRange(). Neste caso, a expressão devolve verdadeiro se origin.ip estiver no intervalo de endereços IP 9.9.9.0/24.

inIpRange(origin.ip, '9.9.9.0/24')

Embora a expressão do exemplo anterior só corresponda ao endereço IP de origem, quando usa a expressão do exemplo numa regra da política de segurança do Cloud Armor, a regra é considerada uma regra com condições de correspondência avançadas do ponto de vista da quota. Para mais informações, consulte as cotas e os limites do Cloud Armor.

Operações

A referência seguinte descreve os operadores que pode usar com atributos (representados por x, y e k) para definir expressões de regras.

Operações Expressões Descrição
Equality x == y Devolve true se x for igual a y.
Igualdade, literal de string x == "foo" Devolve true se x for igual ao literal de string constante fornecido.
Igualdade, literal de string não processada x == R"fo'o" Devolve true se x for igual ao literal de string não processada fornecido que não interpreta sequências de escape. Os literais de strings não processadas são úteis para expressar strings que, por si só, têm de usar carateres de sequência de escape.
NÃO lógico !x Devolve o valor verdadeiro se o valor booleano x for falso ou devolve o valor falso se o valor booleano x for verdadeiro.
Desigualdade x != y Devolve true se x não for igual a y.
Concatenação x + y Devolve a string concatenada xy.
E lógico x && y Devolve true se x e y forem verdadeiros.
OU lógico x || y Devolve true se x, y ou ambos forem verdadeiros.
Contém substring x.contains(y) Devolve true se a string x contiver a substring y.
Começa com a subcadeia de carateres x.startsWith(y) Devolve true se a string x começar com a substring y.
Termina com substring x.endsWith(y) Devolve true se a string x terminar com a substring y.
Correspondência de expressão regular x.matches(y) Devolve true se a string x for parcialmente correspondida pelo padrão y especificado de RE2. O padrão RE2 é compilado através da opção RE2::Latin1 que desativa as funcionalidades Unicode.
Endereço IP dentro do intervalo inIpRange(x, y) Devolve true se o endereço IP x estiver contido no intervalo de IPs y.
Minúsculas x.lower() Devolve o valor em letras minúsculas da string x.
Maiúsculas x.upper() Devolve o valor em maiúsculas da string x.
Valor descodificado em Base64 x.base64Decode() Devolve o valor descodificado em base64 de x; os carateres _ - são primeiro substituídos por / +, respetivamente. Devolve "" (string vazia) se x não for um valor base64 válido.
Valor do mapa de teclas m['k'] Devolve o valor na chave k no mapa de string para string m se k estiver disponível; caso contrário, devolve um erro. A abordagem recomendada é verificar primeiro a disponibilidade através de "has(m['k'])==true".
Verifique a disponibilidade de chaves num mapa has(m['k']) Devolve true se a chave k estiver disponível no mapa m.
Converter em número inteiro int(x) Converte o resultado da string de x num tipo int. Em seguida, pode ser usado para fazer uma comparação de números inteiros através de operadores aritméticos padrão, como > e <=. Isto só funciona para valores que devem ser números inteiros.
Comprimento size(x) Devolve o comprimento da string x.
Descodificar URL x.urlDecode() Devolve o valor com descodificação de URL de x; as sequências de carateres no formato %## são substituídas pelos equivalentes não ASCII e + é substituído por um espaço. As codificações inválidas são devolvidas tal como estão.
Descodificar URL (Unicode) x.urlDecodeUni() Devolve o valor com descodificação de URL de x; além de urlDecode(), também processa sequências de carateres Unicode no formato %u###. As codificações inválidas são devolvidas tal como estão.
Converter UTF8 em Unicode x.utf8ToUnicode() Devolve a representação Unicode em minúsculas de um x codificado em UTF-8.

Atributos

Os atributos representam informações de um pedido recebido, como o endereço IP de origem ou o caminho do URL pedido.

Campo Tipo Descrição do campo
origin.ip de string O endereço IP de origem do pedido.
origin.user_ip de string O endereço IP do cliente de origem, que está incluído no HTTP-HEADER por um proxy a montante. Antes de usar este atributo, tem de configurar a opção userIpRequestHeaders[] no campo advancedOptionsConfig da política de segurança para corresponder a uma origem como True-Client-IP, X-Forwarded-For ou X-Real-IP.

Se não configurar a opção userIpRequestHeaders[], se o cabeçalho configurado contiver valores de endereço IP inválidos ou se o cabeçalho configurado não estiver presente, o origin.user_ip é predefinido como origin.ip. Para mais informações, consulte a referência do recurso securityPolicy.

origin.tls_ja4_fingerprint de string JA4 TLS/SSL fingerprint se o cliente se ligar através de HTTPS, HTTP/2 ou HTTP/3. Se não estiver disponível, é devolvida uma string vazia.
origin.tls_ja3_fingerprint de string Impressão digital JA3 TLS/SSL se o cliente se ligar através de HTTPS, HTTP/2 ou HTTP/3. Se não estiver disponível, é devolvida uma string vazia.
request.headers mapa Um mapa de string para string dos cabeçalhos do pedido HTTP. Se um cabeçalho contiver vários valores, o valor neste mapa seria uma string separada por vírgulas de todos os valores do cabeçalho. As chaves neste mapa estão todas em minúsculas. Todos os cabeçalhos aceites por equilibradores de carga de aplicações externos são inspecionados e aplicam-se as mesmas limitações de cabeçalhos.

A abordagem recomendada é verificar primeiro a disponibilidade através de has(), como has(request.headers['header-key']) && request.headers['header-key'] != 'header-value'.

request.method de string O método de pedido HTTP, como GET ou POST.
request.path de string O caminho de URL HTTP pedido.
request.scheme de string O esquema do URL HTTP, como http ou https. Os valores deste atributo estão todos em minúsculas.
request.query de string A consulta do URL HTTP no formato de name1=value&name2=value2, conforme aparece na primeira linha do pedido HTTP. Não é feita nenhuma descodificação.
origin.region_code de string O código do país Unicode associado ao IP de origem, como US. Se estiver a criar uma regra ou uma expressão que use códigos de países ou regiões ISO 3166-1 alfa 2, o Cloud Armor trata cada código de forma independente. As regras e as expressões do Cloud Armor usam explicitamente esses códigos de região para permitir ou negar pedidos.
origin.asn número inteiro O número do sistema autónomo (ASN) associado ao endereço IP de origem. O ASN exclusivo a nível global é determinado com base no operador de rede que suporta os prefixos de endereço IP que contêm o endereço IP de origem.

Atributos do reCAPTCHA

Esta secção apresenta atributos que só são aplicáveis a tokens do reCAPTCHA ou cookies de isenção. Uma subexpressão baseada nestes atributos devolve false se o token do reCAPTCHA ou o cookie de isenção a avaliar não estiver disponível ou for inválido por um dos seguintes motivos:

  • O token está mal formado e não pode ser descodificado.
  • O token contém atributos inválidos. Por exemplo, o token foi gerado usando uma chave do reCAPTCHA que não corresponde às chaves do reCAPTCHA associadas à regra.
  • O token expirou.
Campo Tipo Descrição do campo
token.recaptcha_exemption.valid bool A presença de um cookie de isenção do reCAPTCHA válido.

Atributos do token de ação

Campo Tipo Descrição do campo
token.recaptcha_action.score float A pontuação de um token de ação do reCAPTCHA. Uma pontuação válida varia entre 0.0 e 1.0, sendo que 0.0 é muito provável que seja um utilizador ilegítimo e 1.0 é muito provável que seja um utilizador legítimo.
token.recaptcha_action.captcha_status string O estado do CAPTCHA de um token de ação do reCAPTCHA. Um estado válido é NONE, PASS ou FAIL, em que NONE se refere a quando não existem desafios envolvidos durante a avaliação do reCAPTCHA, de modo que o campo captcha está em falta no token de ação.
token.recaptcha_action.action string O nome da ação (até 100 carateres) de um token de ação do reCAPTCHA. Consulte Nomes das ações.
token.recaptcha_action.valid bool A presença de um token de ação reCAPTCHA válido.

Atributos do token de sessão

Campo Tipo Descrição do campo
token.recaptcha_session.score float A pontuação de um token de sessão do reCAPTCHA. Uma pontuação válida varia entre 0.0 e 1.0, sendo que 0.0 é muito provável que seja um utilizador ilegítimo e 1.0 é muito provável que seja um utilizador legítimo.
token.recaptcha_session.valid bool A presença de um token de sessão do reCAPTCHA válido.

Exemplos de expressões

Para cada uma destas expressões, a ação tomada depende de a expressão estar incluída numa regra de rejeição ou numa regra de permissão.

Permita ou negue o acesso com base num intervalo de endereços IP em IPv4 ou IPv6

  • A seguinte expressão corresponde a pedidos do 198.51.100.0/24 intervalo de endereços IP:

    inIpRange(origin.ip, '198.51.100.0/24')
    
  • A seguinte expressão corresponde a pedidos do 2001:db8::/32 intervalo de endereços IP:

    inIpRange(origin.ip, '2001:db8::/32')
    

Permita ou recuse o acesso com base num intervalo de endereços IP de cliente personalizado atrás de um proxy a montante

Se configurou o operador origin.user_ip, pode fazer a correspondência com base nos valores dos cabeçalhos que especificou no campo advancedOptionsConfig.userIpRequestHeaders[].

  • A seguinte expressão corresponde a pedidos originados do intervalo de endereços IP 192.0.2.0/24:

    inIpRange(origin.user_ip, '192.0.2.0/24')
    
  • A seguinte expressão corresponde a pedidos originados do intervalo de endereços IP 2001:db8::/32:

    inIpRange(origin.user_ip, '2001:db8::/32')
    
  • A expressão seguinte corresponde a pedidos que têm um cookie que contém 80=BLAH:

    has(request.headers['cookie']) && request.headers['cookie'].contains('80=BLAH')
    

Permita ou recuse tráfego com um cabeçalho referer não vazio

  • A seguinte expressão corresponde a pedidos que têm um cabeçalho referer não vazio:

    has(request.headers['referer']) && request.headers['referer'] != ""
    

Permita ou recuse tráfego com base no URL do anfitrião no cabeçalho

  • A expressão seguinte corresponde a pedidos para um URL específico:

    request.headers['host'].lower().contains('test.example.com')
    

Permita ou recuse tráfego de uma região específica

Se a sua aplicação Web não estiver disponível na região AU, todos os pedidos dessa região têm de ser bloqueados.

  • Numa regra de recusa, use a seguinte expressão, que corresponde a pedidos da região AU:

    origin.region_code == 'AU'
    

Em alternativa, se a sua aplicação Web estiver apenas disponível na região AU, os pedidos de todas as outras regiões têm de ser bloqueados.

  • Numa regra de recusa, use a seguinte expressão, que corresponde a pedidos de todas as regiões, exceto a região AU:

    origin.region_code != 'AU'
    

Os códigos de região baseiam-se nos códigos ISO 3166-1 alfa 2. Em alguns casos, uma região corresponde a um país, mas nem sempre é assim. Por exemplo, o código US inclui todos os estados dos Estados Unidos, um distrito e seis áreas periféricas.

Permita ou recuse tráfego de um ASN específico

Se a sua aplicação Web tiver de ser bloqueada para clientes atendidos por uma operadora de rede específica, pode usar o número ASN da operadora de rede para o bloqueio.

  • Numa regra de recusa, use a seguinte expressão, que corresponde a pedidos de um ASN específico:

    origin.asn == 123
    

Em alternativa, se a sua aplicação Web estiver apenas disponível para clientes atrás de uma operadora de rede específica, os pedidos de todas as outras operadoras de rede têm de ser bloqueados.

  • Numa regra de recusa, use a seguinte expressão, que corresponde a todos os outros operadores de rede, exceto aquele que tem interesse em permitir:

    origin.asn != 123
    

Várias expressões

Para incluir várias condições numa única regra, combine várias subexpressões.

  • No exemplo seguinte, os pedidos de 1.2.3.0/24 (como os seus testadores alfa) na região AU correspondem à seguinte expressão:

    origin.region_code == "AU" && inIpRange(origin.ip, '1.2.3.0/24')
    
  • A seguinte expressão corresponde a pedidos de 1.2.3.4 em que um agente do utilizador contém a string WordPress:

    inIpRange(origin.ip, '1.2.3.4/32') &&
    has(request.headers['user-agent']) && request.headers['user-agent'].contains('WordPress')
    

Permitir ou recusar tráfego para um URI de pedido que corresponda a uma expressão regular

  • A expressão seguinte corresponde a pedidos que contêm a string /example_path/ no URI:

    request.path.matches('/example_path/')
    
  • A seguinte expressão corresponde a pedidos que têm Chrome no campo do cabeçalho User-Agent:

    request.headers['user-agent'].matches('Chrome')
    
  • A expressão seguinte mostra a correspondência não sensível a maiúsculas e minúsculas para o cabeçalho User-Agent que contém wordpress; corresponde a User-Agent:WordPress/605.1.15, User-Agent:wordPress e outras variações de wordpress:

    request.headers['user-agent'].matches('(?i:wordpress)')
    

Permita ou recuse tráfego que contenha um valor descodificado em base64 específico

  • A expressão seguinte corresponde a pedidos que têm um valor descodificado em base64 de myValue para o cabeçalho user-id:

    has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')
    

Permitir ou recusar tráfego que contenha um valor de string de um comprimento específico

  • A seguinte expressão corresponde a pedidos que têm um comprimento do URL superior a 10 carateres:

    size(request.path) > 10
    
  • A seguinte expressão corresponde a pedidos que têm um cabeçalho com um comprimento igual ou superior a 1024 carateres:x-data

    size(request.headers['x-data']) >= 1024
    

Permita ou recuse tráfego que tenha zero content-length no corpo HTTP

  • A seguinte expressão corresponde a pedidos que têm um zero content-length no corpo HTTP:

    int(request.headers["content-length"]) == 0
    

Permita ou recuse tráfego que contenha um valor codificado por URL específico

  • A expressão seguinte corresponde a pedidos que têm um valor de cookie que contém %3c:

    has(request.headers['cookie']) && request.headers['cookie'].urlDecode().contains('<')
    

Permitir ou negar tráfego que contenha um valor codificado de URL específico de uma string Unicode

  • A expressão seguinte corresponde a pedidos que têm um valor de cookie igual a Match%2BValue ou Match%u002BValue:

    has(request.headers['cookie']) && request.headers['cookie'].urlDecodeUni() == 'Match+Value'
    

Permita ou recuse tráfego que contenha uma string Unicode específica de um texto UTF-8

  • A expressão seguinte corresponde a pedidos que têm um valor de cookie igual a ¬:

    has(request.headers['cookie']) && request.headers['cookie'].utf8ToUnicode() == '%u00ac'
    

Permita ou recuse tráfego com base numa impressão digital JA4 conhecida

  • A expressão seguinte corresponde a pedidos com uma impressão digital do JA4 igual a t13d1516h2_8daaf6152771_b186095e22b6:

    origin.tls_ja4_fingerprint == 't13d1516h2_8daaf6152771_b186095e22b6'
    

Permita ou recuse tráfego com base numa lista de impressões digitais JA4

  • A seguinte expressão corresponde a pedidos que tenham uma impressão digital JA4 igual a qualquer uma das seguintes impressões digitais JA4:

    • t00d0000h0_000000000000_000000000000
    • t13d1516h2_8daaf6152771_b186095e22b6
    origin.tls_ja4_fingerprint == 't00d0000h0_000000000000_000000000000' || origin.tls_ja4_fingerprint == 't13d1516h2_8daaf6152771_b186095e22b6'
    

Regras de WAF pré-configuradas

As regras da WAF pré-configuradas usam assinaturas estáticas pré-configuradas, expressões regulares ou ambas para corresponder ao corpo HTTP POST, aos cabeçalhos de pedidos HTTP e aos parâmetros de consulta. As regras de WAF pré-configuradas disponíveis baseiam-se na versão 3.3 do conjunto de regras principais da OWASP. O Cloud Armor oferece várias regras de WAF predefinidas e pré-configuradas. Para ver uma lista completa de regras de WAF pré-configuradas, consulte a vista geral das regras de WAF pré-configuradas do Cloud Armor.

Para listar todas as regras de WAF pré-configuradas disponíveis, consulte o artigo Liste as regras de WAF pré-configuradas disponíveis.

Para mais informações sobre as regras de WAF pré-configuradas, consulte o exemplo de utilização Mitigue ataques à camada de aplicação através da utilização de regras de WAF pré-configuradas.

Nomes de regras de WAF pré-configuradas

Os nomes das regras da WAF pré-configuradas têm o formato <attack category>-<OWASP CRS version>-<version field>. A categoria de ataque especifica o tipo de ataques contra os quais quer proteger-se, como xss (cross-site scripting) ou sqli (injeção de SQL).

Os campos de versão suportados são stable e canary. As adições e as modificações às regras são lançadas primeiro na versão canary. Quando as adições e as modificações são consideradas seguras e estáveis, são promovidas para a versão stable.

IDs de membros de regras da WAF pré-configuradas

Uma regra de WAF pré-configurada contém várias expressões, cada uma com a sua assinatura. Por exemplo, a regra de WAF pré-configurada xss-v33-stable inclui uma expressão denominada owasp-crs-v030301-id941100-xss, que corresponde ao ID da regra id941100 para a versão 3.3. Pode usar as assinaturas para excluir expressões específicas da utilização, o que é útil se uma expressão específica acionar consistentemente um falso positivo. Para mais informações, consulte as informações de resolução de problemas de falsos positivos.

Para informações sobre o conjunto de regras principal e a otimização a diferentes níveis de sensibilidade, consulte o artigo Otimizar as regras do WAF do Google Cloud Armor.

Operador para regras de WAF pré-configuradas

Expressões Descrição
evaluatePreconfiguredWaf(string, MAP<string, dyn>) Devolve verdadeiro se qualquer uma das assinaturas da WAF no conjunto de regras da WAF especificado devolver verdadeiro. O primeiro argumento é o nome do conjunto de regras do WAF, como xss-v33-stable. O segundo argumento (opcional) é um mapa em que a chave é uma string e o valor é escrito dinamicamente consoante a chave. A finalidade deste argumento é ajustar as assinaturas da FAP que são avaliadas. As chaves aceites incluem o seguinte:
  • "sensitivity": isto corresponde ao nível de paranoia do conjunto de regras principais da OWASP, que tem 4 níveis, que variam de 1 a 4. O valor é um número inteiro com um intervalo válido de 0 a 4. Tenha em atenção que 0 está reservado como um valor válido quando usado em combinação com "opt_in_rule_ids" (descrito mais adiante). Quando especifica uma sensibilidade de x (x >= 1), todas as assinaturas da WAF associadas com um valor de sensibilidade de 1 a x são avaliadas. Quando omitido, é usado 4 como valor de sensibilidade.
  • "opt_out_rule_ids": assinaturas da WAF (representadas por IDs de regras) a serem excluídas da avaliação, em que o conjunto base é determinado pelo valor de sensibilidade. O respetivo valor é uma lista de strings. O número máximo de IDs de regras permitido é 128.
  • "opt_in_rule_ids": assinaturas da WAF (representadas por IDs de regras) a serem ativadas para avaliação, em que o conjunto base está vazio. O respetivo valor é uma lista de strings. O número máximo de IDs de regras permitidos é 128. Quando usar esta opção, tem de especificar uma "sensibilidade" de 0.

As chaves "opt_out_rule_ids" e "opt_in_rule_ids" são mutuamente exclusivas. Pode optar por usar "opt_in_rule_ids" se quiser rever e ativar manualmente novas assinaturas da WAF que são adicionadas posteriormente a um conjunto de regras existente.

evaluatePreconfiguredExpr(string, LIST)

Devolve true se qualquer uma das expressões na regra de WAF pré-configurada especificada devolver true.

O primeiro argumento é o nome da regra de WAF pré-configurada, como xss-stable. O segundo argumento (opcional) é uma lista de strings separadas por vírgulas de IDs que devem ser excluídos da avaliação. A lista de exclusões é útil quando um determinado membro da regra de WAF pré-configurada aciona um falso positivo.

Exemplos de regras de WAF pré-configuradas

  • A expressão seguinte usa a regra de WAF pré-configurada para mitigar ataques XSS:xss-v33-stable

    evaluatePreconfiguredWaf('xss-v33-stable')
    
  • A expressão seguinte usa todas as expressões da regra de WAF pré-configurada, exceto os IDs de membros 941100 e 941110:xss-v33-stable

    evaluatePreconfiguredWaf('xss-v33-stable', {'opt_out_rule_ids': ['owasp-crs-v030301-id941100-xss',
    'owasp-crs-v030301-id941110-xss']})
    
  • A expressão seguinte usa uma regra de WAF pré-configurada para mitigar ataques de SQLi do intervalo de endereços IP 198.51.100.0/24:

    inIpRange(origin.ip, '198.51.100.0/24') && evaluatePreconfiguredWaf('sqli-v33-stable')
    

O que se segue?