Esta página descreve como criar políticas de segurança do Google Cloud Armor para filtrar o tráfego de entrada no seu aplicativo. Para informações sobre conceitos de política de segurança, consulte a visão geral da política de segurança do Cloud Armor.
Antes de começar
Antes de configurar políticas de segurança, faça o seguinte:
Familiarize-se com os conceitos de balanceador de carga de aplicativo externo.
Examine seus serviços de back-end atuais para determinar quais não têm uma política de segurança anexada. Esses serviços e os back-ends associados não são protegidos. Para adicionar a proteção do Cloud Armor, anexe uma política de segurança nova ou atual ao serviço de back-end.
Configurar permissões do IAM para políticas de segurança do Cloud Armor
As operações a seguir exigem o papel de administrador de segurança do
Identity and Access Management (IAM)
(roles/compute.securityAdmin):
- Como configurar modificar, atualizar e excluir uma política de segurança do Cloud Armor
- Usando os seguintes métodos de API:
SecurityPolicies insertSecurityPolicies deleteSecurityPolicies patchSecurityPolicies addRuleSecurityPolicies patchRuleSecurityPolicies removeRule
Um usuário com o
papel de administrador de rede do Compute
(roles/compute.networkAdmin) pode realizar as seguintes operações:
- Definir uma política de segurança do Cloud Armor para um serviço de back-end
- Usando os seguintes métodos de API:
BackendServices setSecurityPolicyBackendServices list(somentegcloud)
Os usuários com os papéis de administrador de segurança
(roles/iam.securityAdmin) e administrador de rede do Compute
(roles/compute.networkAdmin) podem visualizar as políticas de segurança
do Cloud Armor usando os métodos get, list e
getRule da API SecurityPolicies.
Configurar permissões do IAM para papéis personalizados
A tabela a seguir lista as permissões básicas dos papéis do IAM, os métodos de API associados e os papéis que concedem essa permissão.
| Permissão do IAM | Métodos da API | Papéis |
|---|---|---|
compute.securityPolicies.create |
SecurityPolicies insert |
Administrador de segurança do Compute (roles/compute.securityAdmin) |
compute.securityPolicies.delete |
SecurityPolicies delete |
Administrador de segurança do Compute (roles/compute.securityAdmin) |
compute.securityPolicies.get |
SecurityPolicies getSecurityPolicies getRule |
Administrador de segurança (roles/iam.securityAdmin) |
compute.securityPolicies.list |
SecurityPolicies list |
Administrador de segurança (roles/iam.securityAdmin) |
Ambas as opções a seguir:
|
BackendServices |
Administrador da rede do Compute (roles/compute.networkAdmin) |
compute.securityPolicies.update |
SecurityPolicies patchSecurityPolicies addRuleSecurityPolicies patchRuleSecurityPolicies removeRule |
Administrador de segurança do Compute (roles/compute.securityAdmin) |
Criar políticas de segurança
Use o console do Cloud de Confiance , a Google Cloud CLI ou a API REST para configurar
políticas, regras e expressões de segurança do Cloud Armor. Ao usar
a CLI gcloud, use a flag --type para especificar se a política de
segurança é de back-end ou de borda.
Se você não estiver familiarizado com a configuração da política de segurança, consulte os exemplos de políticas de segurança.
Exemplos de expressões
Veja a seguir expressões de exemplo. Para mais informações, consulte a referência de linguagem de regras personalizadas do Cloud Armor.
Se a regra ou expressão usar códigos de país ou região ISO 3166-1 alfa-2, o Cloud Armor vai tratar cada código de maneira independente. As regras e expressões do Cloud Armor usam esses códigos para permitir ou negar solicitações.
A expressão a seguir corresponde a solicitações do endereço IP
1.2.3.4que contêm a stringexampleno cabeçalhoUser-Agent:inIpRange(origin.ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')Como alternativa, faça a correspondência com o intervalo de endereços IP de um cabeçalho de endereço IP de cliente personalizado usando o atributo
origin.user_ip:inIpRange(origin.user_ip, '1.2.3.4/32') && has(request.headers['user-agent']) && request.headers['user-agent'].contains('example')A expressão a seguir corresponde a solicitações que têm um cookie com um valor específico:
has(request.headers['cookie']) && request.headers['cookie'].contains('cookie_name=cookie_value')A expressão a seguir corresponde a solicitações da região
AU:origin.region_code == 'AU'
A expressão a seguir corresponde a solicitações da região
AUque não estão no intervalo de IP especificado:origin.region_code == "AU" && !inIpRange(origin.ip, '1.2.3.0/24')
A expressão a seguir corresponde a solicitações com um caminho de variável numerada para um arquivo específico caso o URI corresponda a uma expressão regular:
request.path.matches('/path/[0-9]+/target_file.html')A expressão a seguir corresponde a solicitações se o valor decodificado em Base64 do cabeçalho
user-idcontiver um valor específico:has(request.headers['user-id']) && request.headers['user-id'].base64Decode().contains('myValue')A expressão a seguir usa um conjunto de expressões pré-configuradas para corresponder a ataques SQLi:
evaluatePreconfiguredWaf('sqli-stable')
Travessia de caminhos e normalização
Normalize o conteúdo nas suas regras baseadas em caminhos para gerenciar a travessia de caminhos e as regras de codificação, além de criar regras generalizadas que evitam o uso de maiúsculas ou codificação específica de conteúdo.
Ao escrever regras que usam startsWith, endsWith ou contains para corresponder a request.path, use lower e urlDecode para normalizar o caminho antes da correspondência. Isso ajuda a evitar bypasses que usam codificação de URL ou variações de maiúsculas e minúsculas.
Por exemplo, para bloquear o acesso ao diretório /admin, use a seguinte expressão:
request.path.lower().urlDecode().startsWith('/admin')
Essa regra bloqueia solicitações de /admin, /Admin, /a%64min e outras variações.
Ao escrever regras que usam matches para corresponder a request.path, considere o caractere de barra invertida (\) na sua expressão regular.
Por exemplo, para bloquear o acesso ao diretório /admin, use a seguinte expressão para bloquear bypasses que usam a barra invertida (\):
request.path.matches(r'^/\\*admin')
Combine isso com urlDecode para processar a codificação de URL e os escapes de barra invertida (\):
request.path.urlDecode().matches(r'^/\\*admin')