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 |
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
|
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')
Permita ou recuse tráfego com um cookie específico
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ãoAU
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 stringWordPress
: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çalhoUser-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émwordpress
; corresponde aUser-Agent:WordPress/605.1.15
,User-Agent:wordPress
e outras variações dewordpress
: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çalhouser-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
ouMatch%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:
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
|
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
e941110
: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 |
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 |
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-ips
inteligê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?
- Configure as políticas de segurança do Cloud Armor
- Ajuste as regras de WAF pré-configuradas do Cloud Armor
- Resolva problemas do Cloud Armor
- Quotas e limites