Criar e visualizar políticas de segurança do Cloud Armor

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 insert
    • SecurityPolicies delete
    • SecurityPolicies patch
    • SecurityPolicies addRule
    • SecurityPolicies patchRule
    • SecurityPolicies 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 setSecurityPolicy
    • BackendServices list (somente gcloud)

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 get
SecurityPolicies 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:
  • compute.securityPolicies.use
  • compute.backendServices.
    setSecurityPolicy
BackendServices
setSecurityPolicy
Administrador da rede do Compute (roles/compute.networkAdmin)
compute.securityPolicies.update SecurityPolicies patch
SecurityPolicies addRule
SecurityPolicies patchRule
SecurityPolicies removeRule
Administrador de segurança do Compute (roles/compute.securityAdmin)

Criar políticas de segurança

Use o console do Google Cloud , 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.4 que contêm a string example no cabeçalho User-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 AU que 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-id contiver 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')

A seguir