Configurazione dei criteri di sicurezza

Media CDN utilizza i criteri di sicurezza di Google Cloud Armor per impedire che il traffico indesiderato raggiunga i suoi servizi. Puoi consentire o negare le richieste in base a quanto segue:

  • Indirizzi e intervalli IPv4 e IPv6 (CIDR)
  • Codice paese (area geografica)
  • Filtro di livello 7

Queste funzionalità consentono di limitare i download di contenuti agli utenti in località specifiche in cui sono previste limitazioni relative alle licenze dei contenuti, di consentire solo agli indirizzi IP aziendali di accedere agli endpoint di test o di gestione temporanea e di negare un elenco di indirizzi IP client non validi noti.

Puoi decorare le richieste consentite da Google Cloud Armor inserendo intestazioni personalizzate con nomi e valori configurabili.

I criteri di sicurezza di Google Cloud Armor si applicano a tutti i contenuti pubblicati da Media CDN, inclusi i contenuti e i fallimenti della cache.

I criteri di sicurezza di Google Cloud Armor vengono configurati in base al servizio Media CDN: per tutte le richieste destinate all'indirizzo IP (o ai nomi host) di quel servizio, il criterio di sicurezza viene applicato in modo coerente. A servizi diversi possono essere applicati criteri di sicurezza diversi ed è possibile creare più servizi per aree geografiche diverse in base alle esigenze.

Per una protezione più granulare dei contenuti a livello di utente, ti consigliamo di utilizzare URL e cookie firmati insieme a un criterio Google Cloud Armor.

Media CDN non prende in considerazione l'intestazione referer durante la valutazione delle regole dei criteri di sicurezza perimetrale del filtro dell'intestazione di livello 7 se è impostata su uno qualsiasi dei seguenti valori:

  • Più URL
  • Un URL relativo
  • Un URL assoluto valido contenente informazioni sugli utenti o un componente di frammenti

Configurazione dei criteri di sicurezza

Segui le istruzioni riportate di seguito per configurare un criterio di sicurezza.

Prima di iniziare

Per collegare un criterio di sicurezza Google Cloud Armor a un servizio Media CDN, verifica quanto segue:

Devi inoltre disporre delle seguenti autorizzazioni di Identity and Access Management per autorizzare, creare e collegare criteri di sicurezza a un servizio Media CDN:

  • compute.securityPolicies.addAssociation
  • compute.securityPolicies.create
  • compute.securityPolicies.delete
  • compute.securityPolicies.get
  • compute.securityPolicies.list
  • compute.securityPolicies.update
  • compute.securityPolicies.use

Gli utenti che devono collegare un certificato esistente a un servizio Media CDN richiedono solo le seguenti autorizzazioni IAM:

  • compute.securityPolicies.get
  • compute.securityPolicies.list
  • compute.securityPolicies.use

Il ruolo roles/networkservices.edgeCacheUser include tutte queste autorizzazioni.

Crea un criterio di sicurezza

I criteri di sicurezza di Google Cloud Armor sono composti da diverse regole e ciascuna regola definisce un insieme di criteri di corrispondenza (un'espressione) per una richiesta e un'azione. Ad esempio, un'espressione può contenere logica di corrispondenza per i clienti che si trovano in India, con l'azione associata allow. Se una richiesta non corrisponde alla regola, Google Cloud Armor continua a valutare la regola successiva fino a quando non vengono tentati tutti i tentativi.

I criteri di sicurezza hanno una regola predefinita con un'azione allow. La regola predefinita consente le richieste che non corrispondono alle regole precedenti. Puoi passare a una regola deny quando vuoi allow solo le richieste che corrispondono alle regole precedenti e rifiutare tutte le altre.

L'esempio seguente mostra come creare una regola che blocchi tutti i client che si trovano geograficamente in Australia con un errore HTTP 403 e consenta tutte le altre richieste.

gcloud

Per creare un nuovo criterio di tipo CLOUD_ARMOR_EDGE, utilizza il comando gcloud compute security-policies create:

gcloud compute security-policies create block-australia \
    --type="CLOUD_ARMOR_EDGE" --project="PROJECT_ID"

Viene creato un criterio con una regola di autorizzazione predefinita alla priorità più bassa (priority: 2147483647):

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/securityPolicies/block-australia].

Dopodiché puoi aggiungere una regola con una priorità più alta:

gcloud compute security-policies rules create 1000 \
    --security-policy=block-australia --description "block AU" \
    --expression="origin.region_code == 'AU'" --action="deny-403"

L'output è il seguente:

Updated [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/securityPolicies/block-australia].

Terraform

resource "google_compute_security_policy" "default" {
  name        = "block-australia"
  type        = "CLOUD_ARMOR_EDGE"
  description = "block AU"

  rule {
    action      = "deny(403)"
    description = "block AU"
    priority    = "1000"
    match {
      expr {
        expression = "origin.region_code == 'AU'"
      }
    }
  }
  rule {
    action   = "allow"
    priority = "2147483647"
    match {
      versioned_expr = "SRC_IPS_V1"
      config {
        src_ip_ranges = ["*"]
      }
    }
    description = "default rule"
  }
}

Se controlli il criterio, puoi vedere le due regole: la prima blocca le richieste provenienti dall'Australia (origin.region_code == 'AU') e la seconda regola con priorità più bassa, consente tutto il traffico che non corrisponde alla regola (o alle regole) con priorità più alta.

kind: compute#securityPolicy
name: block-australia
rules:
- action: deny(403)
  description: block AU
  kind: compute#securityPolicyRule
  match:
    expr:
      expression: origin.region_code == 'AU'
  preview: false
  priority: 1000
- action: allow
  description: default rule
  kind: compute#securityPolicyRule
  match:
    config:
      srcIpRanges:
      - '*'
    versionedExpr: SRC_IPS_V1
  preview: false
  priority: 2147483647
  ruleNumber: '1'
type: CLOUD_ARMOR_EDGE

Aggiungi regole a un criterio di sicurezza

I criteri di sicurezza di Google Cloud Armor sono insiemi di regole corrispondenti agli attributi di livello 7 per proteggere le applicazioni o i servizi rivolti all'esterno. Ogni regola viene valutata in base al traffico in entrata.

Questi attributi possono essere utilizzati per le richieste HTTP nei criteri di sicurezza: request.headers, request.method, request.path, request.scheme e request.query. Per ulteriori informazioni sulla scrittura di espressioni per le regole dei criteri di sicurezza, consulta la documentazione di riferimento sul linguaggio delle regole personalizzate di Google Cloud Armor.

Una regola del criterio di sicurezza di Google Cloud Armor è composta da una condizione di corrispondenza e da un'azione da eseguire quando questa condizione è soddisfatta.

gcloud

Per creare una regola per un criterio di sicurezza, utilizza il comando gcloud compute security-policies rules create PRIORITY. Sostituisci PRIORITY con la priorità della regola nel criterio:

gcloud compute security-policies rules create PRIORITY \
    --security-policy POLICY_NAME \
    --description DESCRIPTION \
    --src-ip-ranges IP_RANGES | --expression EXPRESSION \
    --action=[ allow | deny-403 | deny-404 | deny-502 ] \
    --preview

Collega un criterio a un servizio

gcloud

Per collegare un criterio Google Cloud Armor esistente a un servizio Media CDN, utilizza il comando gcloud edge-cache services update:

gcloud edge-cache services update MY_SERVICE \
    --edge-security-policy=SECURITY_POLICY

Aggiorna una regola in un criterio di sicurezza

Utilizza queste istruzioni per aggiornare una singola regola in un criterio di sicurezza di Google Cloud Armor. In alternativa, puoi aggiornare atomicamente più regole in un criterio di sicurezza.

gcloud

Usa il comando gcloud compute security-policies rules update:

gcloud compute security-policies rules update PRIORITY [ \
    --security-policy POLICY_NAME  \
    --description DESCRIPTION  \
    --src-ip-ranges IP_RANGES  | --expression EXPRESSION \
    --action=[ allow | deny-403 | deny-404 | deny-502 ]  \
    --preview
  ]
  

Ad esempio, il seguente comando aggiorna una regola con priorità 1111 per consentire il traffico dall'intervallo di indirizzi IP 192.0.2.0/24:

gcloud compute security-policies rules update 1111 \
    --security-policy my-policy \
    --description "allow traffic from 192.0.2.0/24" \
    --src-ip-ranges "192.0.2.0/24" \
    --action "allow"

Per aggiornare la priorità di una regola, devi utilizzare l'API REST. Per ulteriori informazioni, consulta il metodo securityPolicies.patchRule.

Visualizza un allegato ai criteri

Per esaminare quale criterio è associato a un servizio esistente, ispeziona (descrivi) il servizio.

gcloud

Per visualizzare il criterio Google Cloud Armor collegato a un servizio Media CDN, utilizza il comando gcloud edge-cache services describe:

gcloud edge-cache services describe MY_SERVICE

Il campo edgeSecurityPolicy del servizio descrive il criterio allegato:

name: "MY_SERVICE"
edgeSecurityPolicy: "SECURITY_POLICY

Rimuovere un criterio

Per rimuovere un criterio esistente, aggiorna il servizio associato e passa una stringa vuota come criterio.

gcloud

Usa il comando gcloud edge-cache services update:

gcloud edge-cache services update MY_SERVICE 
--edge-security-policy=""

Il campo edgeSecurityPolicy ora è omesso dall'output del comando gcloud edge-cache services describe MY_SERVICE.

Esempi

Considera i seguenti casi d'uso di esempio dettagliati.

Esempio: identificare le richieste bloccate

Per registrare le richieste bloccate, devi aver abilitato il logging per un determinato servizio di cache perimetrale.

Le richieste consentite o rifiutate da un criterio di filtro vengono registrate in Logging. Per filtrare in base alle richieste rifiutate, la seguente query di logging per la configurazione prod-video-service avrebbe il seguente aspetto:

resource.type="edge_cache_service"
jsonPayload.statusDetails="denied_by_security_policy"

Esempio: personalizzare i codici di risposta

Le regole di Google Cloud Armor possono essere configurate in modo che restituiscano un codice di stato specifico come azione associata a una determinata regola. Nella maggior parte dei casi, è preferibile restituire un codice HTTP 403 (deny-403) per indicare chiaramente che il client è stato bloccato dalla regola.

I codici di stato supportati sono:

  • HTTP 403 (non consentito)
  • HTTP 404 (non trovato)
  • HTTP 502 (Gateway non valido)

L'esempio seguente mostra come configurare il codice di stato restituito:

Per specificare uno degli elementi [allow | deny-403 | deny-404 | deny-502] come azione associata alla regola, esegui questo comando. In questo esempio, la regola viene configurata in modo che restituisca un errore HTTP 502.

gcloud compute security-policies rules create 1000 \
    --security-policy=block-australia --description "block AU" \
    --expression="origin.region_code == 'AU'" --action="deny-502"

Ogni regola in un criterio di sicurezza può definire una risposta al codice di stato diversa.

Esempio: rifiutare i client all'esterno di un paese, ad eccezione degli indirizzi IP consentiti

Un caso comune nella pubblicazione di contenuti multimediali è il rifiuto delle connessioni dai client che si trovano al di fuori della regione per la quale disponi di licenze per i contenuti o meccanismi di pagamento.

Ad esempio, potresti voler consentire solo i clienti che si trovano in India, nonché tutti gli indirizzi IP presenti nella lista consentita, inclusi quelli dei partner per i contenuti e i tuoi dipendenti, che rientrano nell'intervallo 192.0.2.0/24 e rifiutare tutti gli altri.

Utilizzando il linguaggio personalizzato di Google Cloud Armor, la seguente espressione raggiunge questo obiettivo:

origin.region_code == "IN" || inIpRange(origin.ip, '192.0.2.0/24')

Questa espressione è configurata come regola allow, con una regola deny predefinita configurata in modo da corrispondere a tutti gli altri client. I criteri di sicurezza hanno sempre una regola predefinita. In genere, la configuri in modo da default deny il traffico che non consenti esplicitamente. In altri casi, puoi scegliere di bloccare una parte del traffico e default allow tutto il resto del traffico.

Nell'output del criterio di sicurezza, tieni presente quanto segue:

  • La regola con priorità più alta (priority: 0) consente il traffico dall'India OR dall'elenco definito di indirizzi IP.
  • La regola con priorità più bassa rappresenta un default deny. Il motore delle regole nega a tutti i client che le regole con priorità più elevata non restituiscono true.
  • Puoi combinare più regole utilizzando gli boolean operators.

Il criterio consente il traffico dai client in India, consente i client da un intervallo IP definito e nega tutto il traffico.

Quando visualizzi i dettagli del criterio, l'output è simile al seguente:

kind: compute#securityPolicy
name: allow-india-only
type: "CLOUD_ARMOR_EDGE"
rules:
- action: allow
  description: ''
  kind: compute#securityPolicyRule
  match:
    expr:
      expression: origin.region_code == "IN" || inIpRange(origin.ip, '192.0.2.0/24')
  preview: false
  priority: 0
- action: deny(403)
  description: Default rule, higher priority overrides it
  kind: compute#securityPolicyRule
  match:
    config:
      srcIpRanges:
      - '*'
    versionedExpr: SRC_IPS_V1
  preview: false
  priority: 2147483647

Puoi anche impostare un'intestazione della risposta personalizzata con la variabile di intestazione {region_code}. Questa intestazione può essere controllata con JavaScript e riflessa al client.

Esempio: bloccare i client dannosi in base all'indirizzo e agli intervalli IP

Utilizzando il linguaggio personalizzato di Google Cloud Armor, la seguente espressione raggiunge questo obiettivo:

inIpRange(origin.ip, '192.0.2.2/32') || inIpRange(origin.ip, '192.0.2.170/32')

Puoi bloccare intervalli IP fino a una maschera /8 in IPv4 e /32 in IPv6. Un caso comune per le piattaforme di streaming è il blocco degli intervalli IP in uscita di proxy o provider VPN per ridurre al minimo la circonvenzione delle licenze dei contenuti:

inIpRange(origin.ip, '192.0.2.0/24') || inIpRange(origin.ip, '198.51.100.0/24') || inIpRange(origin.ip, '203.0.113.0/24') || inIpRange(origin.ip, '2001:DB8::B33F:2002/64')

Sono supportati entrambi gli intervalli di indirizzi IPv4 e IPv6.

Esempio: consentire solo un elenco fisso di aree geografiche

Se hai un elenco di codici paese, puoi utilizzare l'operatore booleano O || per combinare le condizioni di corrispondenza.

Se utilizzi il linguaggio personalizzato di Google Cloud Armor, la seguente espressione consente agli utenti identificati come provenienti da Australia o Nuova Zelanda:

origin.region_code == "AU" || origin.region_code == "NZ"

Inoltre, è possibile combinare questa opzione con le espressioni origin.ip o inIpRange(origin.ip, '...') per consentire ai tester, ai partner e ai tuoi intervalli IP aziendali, anche se non si trovano in una delle aree geografiche specificate.

È disponibile il numero documentato di sottoespressioni per ogni regola con un'espressione personalizzata. Per combinare più sottoespressioni, definisci più regole all'interno di un singolo criterio.

Esempio: bloccare i clienti di un insieme specifico di paesi

Un esempio meno comune potrebbe essere il blocco dei clienti da un determinato insieme di paesi, ma altrimenti consentire le richieste da tutti gli altri paesi.

Per farlo, devi creare un criterio che blocca sia il paese sia tutti i clienti per cui non è possibile determinare la loro regione e poi applicare una regola di autorizzazione predefinita per tutte le altre richieste.

L'esempio seguente descrive un criterio che blocca i client dal Canada, nonché tutti i client la cui località è sconosciuta, ma consente tutto il resto del traffico:

  kind: compute#securityPolicy
  name: block-canada
  type: "CLOUD_ARMOR_EDGE"
  rules:
  - action: deny(403)
    description: ''
    kind: compute#securityPolicyRule
    match:
      expr:
        expression: origin.region_code == "CA" || origin.region_code == "ZZ"
    preview: false
    priority: 0
  - action: allow
    description: Default rule, higher priority overrides it
    kind: compute#securityPolicyRule
    match:
      config:
        srcIpRanges:
        - '*'
      versionedExpr: SRC_IPS_V1
    preview: false
    priority: 2147483647

Esempio: rifiutare le richieste di contenuti memorizzati nella cache con intestazioni specifiche

Un criterio di sicurezza perimetrale si applica a tutte le richieste destinate a qualsiasi servizio Media CDN a cui il criterio è associato. L'applicazione dei criteri avviene prima di qualsiasi ricerca nella cache. Le richieste non consentite dal criterio di sicurezza perimetrale vengono rifiutate con il codice di stato configurato.

La seguente espressione trova corrispondenze con le richieste dall'indirizzo IP 1.2.3.4 che contengono la stringa user1 nell'intestazione user-agent:

inIpRange(origin.ip, '1.2.3.4/32') && request.headers['user-agent'].contains('user1')

Il comando seguente aggiunge la regola di filtro 105 al criterio di sicurezza perimetrale my-edge-policy, collegato a un servizio Media CDN:

gcloud compute security-policies rules create 105 \
    --security-policy my-edge-policy \
    --expression = "inIpRange(origin.ip, '1.2.3.4/32') && request.headers['user-agent'].contains('charlie')" \
    --action= deny-403 \
    --description="block requests from IP addresses in which the user-agent header contains the string charlie"
    

Misure di applicazione di Logging

Ogni log delle richieste fornisce dettagli sul criterio di sicurezza applicato e se la richiesta è stata consentita (ALLOW) o rifiutata (DENY).

Per abilitare il logging, assicurati che logConfig.enable sia impostato su true nel tuo servizio. I servizi senza log abilitati non registrano gli eventi dei criteri di sicurezza.

Quando un client si trova al di fuori degli Stati Uniti ed è in vigore un criterio di sicurezza denominato deny-non-us-clients che nega le richieste provenienti da paesi diversi dagli Stati Uniti, questa è la voce di log per una richiesta rifiutata:

enforcedSecurityPolicy:
  name: deny-non-us-clients
  outcome: DENY

I servizi a cui non è collegato alcun criterio Google Cloud Armor contengono no_policy come valore di enforcedSecurityPolicy.name e un outcome pari a ALLOW. Ad esempio, una voce di log delle richieste per un servizio senza un criterio associato ha i seguenti valori:

enforcedSecurityPolicy:
  name: no_policy
  outcome: ALLOW

Informazioni sulle classificazioni GeoIP

Media CDN si basa sulle origini dati di classificazione IP interne di Google per ricavare una località (regione, stato, provincia o città) da un indirizzo IP. Se stai eseguendo la migrazione o suddividi il traffico da più provider, a volte un numero ridotto di indirizzi IP potrebbe essere associato a località diverse.

  • Google Cloud Armor utilizza i codici regione ISO 3166-1 alpha 2 per associare un client a una posizione geografica.
  • Ad esempio, US per gli Stati Uniti o AU per l'Australia.
  • In alcuni casi, una regione corrisponde a un paese, ma non sempre. Ad esempio, il codice US include tutti gli stati degli Stati Uniti, un distretto e sei aree periferiche.
  • Per ulteriori informazioni, consulta unicode_region_subtag nell'Unicode Technical Standard.
  • Per i client in cui non è possibile ricavare la località, il origin.region_code è impostato su ZZ.

Puoi aggiungere dati geografici alle intestazioni delle risposte a un endpoint Media CDN (con routing.routeRules[].headerActions[].responseHeadersToAdd[]) o riflettere i dati geografici forniti a una funzione Cloud Functions per convalidare eventuali differenze tra le origini dati geoIP durante l'integrazione e i test iniziali.

Inoltre, i log delle richieste di Media CDN includono clientRegion e altri dati specifici del client che puoi convalidare in base alle origini dati esistenti.

Passaggi successivi