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
Igualdade 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 true se o valor booleano x for falso ou devolve o valor false 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 descodificado do 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 de recursos 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 de 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.

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 tiver configurado 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 cabeçalho do anfitrião

Pode permitir ou recusar tráfego com base no valor do cabeçalho Host no pedido.

  • A expressão seguinte corresponde a pedidos para um URL específico através de ==:

    request.headers['host'].lower() == 'test.example.com'
    
  • A expressão seguinte corresponde a pedidos para um URL específico através de endsWith:

    request.headers['host'].lower().endsWith('.example.com')
    
  • A expressão seguinte corresponde a pedidos para um URL específico através de contains:

    request.headers['host'].lower().contains('test.example.com')
    
  • A expressão seguinte corresponde a pedidos para vários domínios através de contains:

    request.headers['host'].lower().contains('test.example.com') || request.headers['host'].lower().contains('test22.example.com')
    
  • A seguinte expressão corresponde a pedidos de um domínio e dos respetivos subdomínios através de matches:

    request.headers['host'].matches('(?i:(sub\.)?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 um operador de rede específico, os pedidos de todos os outros operadores 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 com um comprimento do cabeçalho x-data igual ou superior a 1024 carateres:

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

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

  • A expressão seguinte 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 do pedido HTTP, aos cabeçalhos do pedido 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 fornece várias regras de WAF predefinidas e pré-configuradas. Para ver uma lista completa das 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 da 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 de WAF pré-configurados

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 é digitado dinamicamente consoante a chave. A finalidade deste argumento é ajustar as assinaturas da WAF 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 sejam 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 xss-v33-stable para mitigar ataques XSS:

    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')
    

Outros operadores

Expressões Descrição
evaluateThreatIntelligence(string)
evaluateThreatIntelligence(string, LIST)
evaluateThreatIntelligence(string, string, LIST)

Devolve true se o endereço IP de origem corresponder a qualquer um dos intervalos de IP na lista de IPs fornecida, a menos que seja explicitamente excluído com a lista de exclusões.

O primeiro argumento é o nome do feed do Google Threat Intelligence, como iplist-known-malicious-ips. Se o segundo argumento for uma string (opcional), determina de onde o endereço IP é extraído e pode ser origin.ip, origin.user_ip ou um nome de cabeçalho específico. Se o segundo ou o terceiro argumento (opcional) for uma lista de strings separadas por vírgulas, em que cada string é um endereço IP ou um intervalo CIDR, este será excluído da avaliação. A lista de exclusão é útil quando um feed contém um endereço IP que aciona um falso positivo.

evaluateAddressGroup(string, string)
evaluateAddressGroup(string, string, LIST)

evaluateOrganizationAddressGroup(string, string)
evaluateOrganizationAddressGroup(string, string, LIST)

Devolve true se o endereço IP de origem corresponder a qualquer um dos intervalos de IP no grupo de endereços especificado, a menos que seja explicitamente excluído com a lista de exclusões.

O primeiro argumento é o nome do grupo de endereços. O segundo argumento determina a origem do endereço IP e pode ser origin.ip, origin.user_ip ou um nome de cabeçalho específico. O terceiro argumento (opcional) é uma lista de strings separadas por vírgulas, em que cada string é um endereço IP ou um intervalo CIDR, que vai ser excluído da avaliação. A lista de exclusão é útil quando um grupo de endereços contém alguns endereços IP que acionam um falso positivo.

evaluateAdaptiveProtection(string)

Devolve true se o pedido corresponder à assinatura de ataque produzida pela proteção adaptativa.

O argumento é o ID de um alerta específico gerado pela proteção adaptativa após a deteção de um ataque.

evaluateAdaptiveProtectionAutoDeploy()

Devolve true se o pedido for proveniente de um endereço IP de um utilizador frequente que corresponda à assinatura de ataque de um ataque em curso detetado pela proteção adaptativa.

Exemplos

  • A seguinte expressão faz corresponder o pedido recebido ao feed de iplist-known-malicious-ipsinteligência sobre ameaças da Google para proteção contra a lista conhecida de IPs maliciosos:

    evaluateThreatIntelligence('iplist-known-malicious-ips')
    
  • A seguinte expressão faz corresponder o pedido recebido ao feed de informações sobre ameaças da Google para proteção contra a lista conhecida de IPs maliciosos, exceto os IPs em 104.135.0.0/16:iplist-known-malicious-ips

    evaluateThreatIntelligence('iplist-known-malicious-ips', ['104.135.0.0/16'])
    
  • A expressão seguinte corresponde ao cabeçalho do pedido personalizado para o IP do utilizador em comparação com o grupo de endereços denominado my-own-list-of-bad-ips:

    evaluateAddressGroup('my-own-list-of-bad-ips', origin.user_ip)
    

O que se segue?