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 |
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 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.
Atributos de cookies de isenção
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')
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 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ã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 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
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 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:
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
|
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
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')
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