Questa pagina fornisce una panoramica dei cookie firmati e le istruzioni per utilizzarli con Cloud CDN. I cookie firmati forniscono l'accesso alle risorse a tempo limitato a un insieme di file, indipendentemente dal fatto che gli utenti abbiano Account Google.
I cookie firmati sono un'alternativa agli URL firmati. I cookie firmati proteggono l'accesso quando non è possibile firmare separatamente decine o centinaia di URL per ogni utente nella tua applicazione.
I cookie firmati ti consentono di:
- Autorizza un utente e fornisci un token a tempo limitato per accedere ai tuoi contenuti protetti (anziché firmare ogni URL).
- Limita l'accesso dell'utente a un prefisso URL specifico, ad esempio
https://media.example.com/videos/
, e concedi all'utente autorizzato l'accesso ai contenuti protetti solo all'interno di quel prefisso URL. - Mantieni invariati gli URL e i manifest dei contenuti multimediali, semplifica la pipeline di imballaggio e migliora la memorizzazione nella cache.
Se invece vuoi limitare l'accesso a URL specifici, ti consigliamo di utilizzare URL firmati.
Prima di iniziare
Prima di utilizzare i cookie firmati, segui questi passaggi:
Assicurati che Cloud CDN sia abilitato. Per istruzioni, consulta Utilizzare Cloud CDN. Puoi configurare i cookie firmati su un backend prima di attivare Cloud CDN, ma non avranno alcun effetto finché Cloud CDN non sarà attivato.
Se necessario, esegui l'aggiornamento alla versione più recente di Google Cloud CLI:
gcloud components update
Per una panoramica, consulta URL e cookie firmati.
Configurazione delle chiavi per le richieste firmate
La creazione di chiavi per gli URL o i cookie firmati richiede diversi passaggi, descritti nelle sezioni seguenti.
Considerazioni sulla sicurezza
Cloud CDN non convalida le richieste nelle seguenti circostanze:
- La richiesta non è firmata.
- Il servizio di backend o il bucket di backend per la richiesta non ha attivato Cloud CDN.
Le richieste firmate devono sempre essere convalidate all'origine prima di inviare la risposta. Questo perché le origini possono essere utilizzate per pubblicare una combinazione di contenuti firmati e non firmati e perché un client potrebbe accedere direttamente all'origine.
- Cloud CDN non blocca le richieste senza un parametro di query
Signature
o un cookie HTTPCloud-CDN-Cookie
. Rifiuta le richieste con parametri non validi (o con formato non corretto). - Quando l'applicazione rileva una firma non valida, assicurati che risponda con un codice di risposta
HTTP 403 (Unauthorized)
. I codici di rispostaHTTP 403
non sono memorizzabili nella cache. - Le risposte alle richieste firmate e non firmate vengono memorizzate nella cache separatamente, pertanto una risposta positiva a una richiesta firmata valida non viene mai utilizzata per soddisfare una richiesta non firmata.
- Se la tua applicazione invia un codice di risposta memorizzabile in cache a una richiesta non valida, le richieste future valide potrebbero essere rifiutate erroneamente.
Per i backend Cloud Storage, assicurati di rimuovere l'accesso pubblico, in modo che Cloud Storage possa rifiutare le richieste per le quali manca una firma valida.
La seguente tabella riassume il comportamento.
La richiesta ha la firma | Hit della cache | Comportamento |
---|---|---|
No | No | Inoltra all'origine del backend. |
No | Sì | Pubblicazione dalla cache. |
Sì | No | Convalida la firma. Se valido, inoltra all'origine del backend. |
Sì | Sì | Convalida la firma. Se valido, pubblica dalla cache. |
Creare chiavi di richiesta firmate
Per attivare il supporto degli URL e dei cookie firmati di Cloud CDN, crea una o più chiavi su un servizio di backend, un bucket di backend o entrambi abilitati per Cloud CDN.
Per ogni servizio di backend o bucket di backend, puoi creare ed eliminare le chiavi in base alle tue esigenze di sicurezza. Ogni backend può avere fino a tre chiavi configurate contemporaneamente. Ti consigliamo di ruotare periodicamente le chiavi eliminando la più vecchia, aggiungendo una nuova chiave e utilizzandola per firmare gli URL o i cookie.
Puoi utilizzare lo stesso nome della chiave in più servizi e bucket di backend perché ogni insieme di chiavi è indipendente dagli altri. I nomi delle chiavi possono contenere fino a 63 caratteri. Per assegnare un nome alle chiavi, utilizza i caratteri A-Z, a-z, 0-9, _ (trattino basso) e - (trattino).
Quando crei le chiavi, assicurati di mantenerle al sicuro, perché chiunque abbia una delle tue chiavi può creare URL o cookie firmati accettati da Cloud CDN finché la chiave non viene eliminata da Cloud CDN. Le chiavi vengono archiviate sul computer su cui generi gli URL o i cookie firmati. Cloud CDN memorizza anche le chiavi per verificare le firme delle richieste.
Per mantenere le chiavi segrete, i valori delle chiavi non sono inclusi nelle risposte alle richieste dell'API. Se perdi una chiave, devi crearne una nuova.
Per creare una chiave di richiesta firmata:
Console
- Nella Google Cloud console, vai alla pagina Cloud CDN.
- Fai clic sul nome dell'origine a cui vuoi aggiungere la chiave.
- Nella pagina Dettagli dell'origine, fai clic sul pulsante Modifica.
- Nella sezione Nozioni di base sulle origini, fai clic su Avanti per aprire la sezione Regole host e percorso.
- Nella sezione Regole host e percorso, fai clic su Avanti per aprire la sezione Rendimento della cache.
- Nella sezione Contenuti con limitazioni, seleziona Limita accesso con URL e cookie firmati.
Fai clic su Aggiungi chiave di firma.
- Specifica un nome univoco per la nuova chiave di firma.
Nella sezione Metodo di creazione della chiave, seleziona Genera automaticamente. In alternativa, fai clic su Fammi inserire, quindi specifica un valore della chiave di firma.
Per la prima opzione, copia il valore della chiave di firma generata automaticamente in un file privato, che puoi utilizzare per creare URL firmati.
Fai clic su Fine.
Nella sezione Tempo di vita massimo della voce della cache, inserisci un valore e poi seleziona un'unità di tempo.
Fai clic su Fine.
gcloud
Lo strumento a riga di comando gcloud
legge le chiavi da un file locale specificato. Il file della chiave deve essere creato generando 128 bit fortemente casuali, codificandoli con base64 e sostituendo il carattere +
con -
e il carattere /
con _
. Per ulteriori informazioni, consulta
RFC 4648.
È fondamentale che la chiave sia fortemente casuale. Su un sistema UNIX-like, puoi
generare una chiave fortemente casuale e memorizzarla nel file della chiave con il
seguente comando:
head -c 16 /dev/urandom | base64 | tr +/ -_ > KEY_FILE_NAME
Per aggiungere la chiave a un servizio di backend:
gcloud compute backend-services \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
Per aggiungere la chiave a un bucket di backend:
gcloud compute backend-buckets \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
Configura le autorizzazioni Cloud Storage
Se utilizzi Cloud Storage e hai limitato chi può leggere gli oggetti, devi concedere a Cloud CDN l'autorizzazione per leggere gli oggetti aggiungendo l'account di servizio Cloud CDN ai criteri ACL di Cloud Storage.
Non è necessario creare l'account di servizio. L'account di servizio viene creato automaticamente la prima volta che aggiungi una chiave a un bucket di backend in un progetto.
Prima di eseguire il comando seguente, aggiungi almeno una chiave a un bucket di backend nel tuo progetto. In caso contrario, il comando non va a buon fine a causa di un errore perché il account di servizio di compilazione della cache Cloud CDN non viene creato finché non aggiungi una o più chiavi per il progetto.
. Assicurati di riattivare il criterio dopo aver eseguito il comandogcloud storage buckets add-iam-policy-binding
.
gcloud storage buckets add-iam-policy-binding gs://BUCKET \ --member=serviceAccount:service-PROJECT_NUM@cloud-cdn-fill.iam.gserviceaccount.com \ --role=roles/storage.objectViewer
Sostituisci PROJECT_NUM
con il numero del progetto e
BUCKET
con il bucket di archiviazione.
L'account di servizio Cloud CDN
service-PROJECT_NUM@cloud-cdn-fill.iam.gserviceaccount.com
non è presente nell'elenco degli account di servizio del tuo progetto. Questo accade perché
l'account di servizio Cloud CDN è di proprietà di Cloud CDN, non del tuo
progetto.
Per ulteriori informazioni sui numeri di progetto, consulta Trovare l'ID progetto e il numero di progetto nella documentazione della guida della Google Cloud console.
Personalizzare il tempo massimo della cache
Cloud CDN memorizza nella cache le risposte per le richieste firmate indipendentemente dall'intestazione Cache-Control
del backend. Il tempo massimo per cui le risposte possono essere memorizzate nella cache
senza essere convalidate nuovamente è impostato dal flag signed-url-cache-max-age
, che
per impostazione predefinita è pari a un'ora e può essere modificato come mostrato qui.
Per impostare il tempo massimo della cache per un servizio o un bucket di backend, esegui uno dei seguenti comandi:
gcloud compute backend-services update BACKEND_NAME --signed-url-cache-max-age MAX_AGE
gcloud compute backend-buckets update BACKEND_NAME --signed-url-cache-max-age MAX_AGE
Elenca i nomi delle chiavi per le richieste firmate
Per elencare le chiavi in un servizio o un bucket di backend, esegui uno dei seguenti comandi:
gcloud compute backend-services describe BACKEND_NAME
gcloud compute backend-buckets describe BACKEND_NAME
Eliminare le chiavi per le richieste firmate
Quando non è più necessario rispettare gli URL firmati da una determinata chiave, esegui uno dei seguenti comandi per eliminare la chiave dal servizio di backend o dal bucket di backend:
gcloud compute backend-services \ delete-signed-url-key BACKEND_NAME --key-name KEY_NAME
gcloud compute backend-buckets \ delete-signed-url-key BACKEND_NAME --key-name KEY_NAME
Creazione di un criterio
I criteri dei cookie firmati sono una serie di coppie key-value
(delimitate dal carattere :
), simili ai parametri di ricerca utilizzati in un URL firmato.
Per esempi, vedi Emettere cookie per gli utenti.
I criteri rappresentano i parametri per i quali una richiesta è valida. I criteri vengono firmati utilizzando un codice HMAC (Hash-based Message Authentication Code) che Cloud CDN convalida a ogni richiesta.
Definizione del formato e dei campi dei criteri
Esistono quattro campi obbligatori che devi definire nel seguente ordine:
URLPrefix
Expires
KeyName
Signature
Le coppie key-value
in un criterio dei cookie firmati sono sensibili alle maiuscole.
URLPrefix
URLPrefix
indica un prefisso URL con codifica Base64 sicuro per gli URL che comprende tutti i percorsi per i quali la firma deve essere valida.
Un URLPrefix
codifica uno schema (http://
o https://
), un FQDN e un
percorso facoltativo. Terminare il percorso con un /
è facoltativo, ma consigliato. Il prefisso non deve includere parametri di ricerca o frammenti come ?
o #
.
Ad esempio, https://media.example.com/videos
corrisponde alle richieste per entrambi i seguenti elementi:
https://media.example.com/videos?video_id=138183&user_id=138138
https://media.example.com/videos/137138595?quality=low
Il percorso del prefisso viene utilizzato come sottostringa di testo, non come percorso di directory.
Ad esempio, il prefisso https://example.com/data
concede l'accesso a entrambi i seguenti elementi:
/data/file1
/database
Per evitare questo errore, ti consigliamo di terminare tutti i prefissi con /
, a meno che non scelga intenzionalmente di terminare il prefisso con un nome file parziale come https://media.example.com/videos/123
per concedere l'accesso a quanto segue:
/videos/123_chunk1
/videos/123_chunk2
/videos/123_chunkN
Se l'URL richiesto non corrisponde a URLPrefix
, Cloud CDN rifiuta la richiesta e restituisce un errore HTTP 403
al client.
Scadenza
Expires
deve essere un timestamp Unix (il numero di secondi dal 1° gennaio 1970).
KeyName
KeyName
è il nome della chiave creata per il bucket di backend o per il servizio di backend. I nomi delle chiavi sono sensibili alle maiuscole.
Firma
Signature
è la firma HMAC-SHA-1 con codifica Base64 sicura per gli URL dei campi
che costituiscono le norme relative ai cookie. Questo viene convalidato a ogni richiesta; le richieste con una firma non valida vengono rifiutate con un errore HTTP 403
.
Creazione di cookie firmati in modo programmatico
I seguenti esempi di codice mostrano come creare programmaticamente cookie firmati.
Vai
Java
Python
Convalida dei cookie firmati
La procedura di convalida di un cookie firmato è essenzialmente la stessa della generazione di un cookie firmato. Ad esempio, supponiamo che tu voglia convalidare la seguente intestazione del cookie firmata:
Cookie: Cloud-CDN-Cookie=URLPrefix=URL_PREFIX:Expires=EXPIRATION:KeyName=KEY_NAME:Signature=SIGNATURE; Domain=media.example.com; Path=/; Expires=Tue, 20 Aug 2019 02:26:49 GMT; HttpOnly
Puoi utilizzare la chiave segreta denominata da KEY_NAME
per
generare in modo indipendente la firma e poi convalidarne la corrispondenza con
SIGNATURE
.
Emissione di cookie agli utenti
L'applicazione deve generare ed emettere per ogni utente (client) un singolo cookie HTTP contenente un criterio firmato correttamente:
Crea un firmatario HMAC-SHA-1 nel codice dell'applicazione.
Firma il criterio utilizzando la chiave scelta, prendendo nota del nome della chiave che hai aggiunto al backend, ad esempio
mySigningKey
.Crea un criterio relativo ai cookie con il seguente formato, tenendo presente che sia il nome che il valore sono sensibili alle maiuscole:
Name: Cloud-CDN-Cookie Value: URLPrefix=$BASE64URLECNODEDURLORPREFIX:Expires=$TIMESTAMP:KeyName=$KEYNAME:Signature=$BASE64URLENCODEDHMAC
Intestazione
Set-Cookie
di esempio:Set-Cookie: Cloud-CDN-Cookie=URLPrefix=aHR0cHM6Ly9tZWRpYS5leGFtcGxlLmNvbS92aWRlb3Mv:Expires=1566268009:KeyName=mySigningKey:Signature=0W2xlMlQykL2TG59UZnnHzkxoaw=; Domain=media.example.com; Path=/; Expires=Tue, 20 Aug 2019 02:26:49 GMT; HttpOnly
Gli attributi
Domain
ePath
nel cookie determinano se il client invia il cookie a Cloud CDN.
Consigli e requisiti
Imposta esplicitamente gli attributi
Domain
ePath
in modo che corrispondano al prefisso del dominio e del percorso da cui intendi pubblicare i contenuti protetti, che potrebbero essere diversi dal dominio e dal percorso in cui viene emesso il cookie (example.com
rispetto amedia.example.com
o/browse
rispetto a/videos
).Assicurati di avere un solo cookie con un determinato nome per gli stessi
Domain
ePath
.Assicurati di non emettere cookie in conflitto, in quanto ciò potrebbe impedire l'accesso ai contenuti in altre sessioni del browser (finestre o schede).
Imposta i flag
Secure
eHttpOnly
, se applicabili.Secure
garantisce che il cookie venga inviato solo tramite connessioni HTTPS.HttpOnly
impedisce di rendere il cookie disponibile a JavaScript.Gli attributi dei cookie
Expires
eMax-Age
sono facoltativi. Se li ometti, il cookie esiste finché esiste la sessione del browser (scheda, finestra).In caso di riempimento della cache o fallimento della cache, il cookie firmato viene trasmesso all'origine definita nel servizio di backend. Assicurati di convalidare il valore del cookie firmato su ogni richiesta prima di pubblicare i contenuti.