Questa pagina fornisce una panoramica dei cookie firmati e le istruzioni per utilizzarli con Cloud CDN. I cookie firmati consentono di accedere a una serie di file a tempo limitato, indipendentemente dal fatto che gli utenti dispongano di un Account Google.
I cookie firmati rappresentano un'alternativa agli URL firmati. I cookie firmati proteggono l'accesso se la firma separata di centinaia o URL per ciascun utente non è possibile nella tua applicazione.
I cookie firmati ti consentono di:
- Autorizza un utente e forniscigli un token a tempo limitato per accedere ai 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 solo ai contenuti protetti all'interno di quel prefisso URL. - Mantieni invariati gli URL e i manifest multimediali, semplificando la pipeline di confezionamento e migliorando la memorizzazione nella cache.
Se vuoi invece limitare l'accesso a URL specifici, valuta la possibilità di utilizzare gli URL firmati.
Prima di iniziare
Prima di utilizzare i cookie firmati, procedi nel seguente modo:
Assicurati che Cloud CDN sia abilitato; per le istruzioni, consulta la pagina relativa all'utilizzo di Cloud CDN. Puoi configurare i cookie firmati su un backend prima di abilitare Cloud CDN, ma non avrà alcun effetto finché Cloud CDN non verrà abilitato.
Se necessario, esegui l'aggiornamento all'ultima versione di Google Cloud CLI:
gcloud components update
Per una panoramica, vedi URL firmati e cookie firmati.
Configurazione delle chiavi di richiesta firmate
La creazione di chiavi per gli URL firmati o per 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 è stata firmata.
- Cloud CDN non è abilitato per il servizio di backend o il bucket di backend per la richiesta.
Le richieste firmate devono essere sempre convalidate nell'origine prima di pubblicare la risposta. Ciò si verifica 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 ricerca
Signature
o un cookie HTTPCloud-CDN-Cookie
. Rifiuta le richieste con parametri di richiesta non validi (o altrimenti non validi). - Quando la tua applicazione rileva una firma non valida, assicurati che risponda con un codice di risposta
HTTP 403 (Unauthorized)
.HTTP 403
codici di risposta non possono essere memorizzati nella cache. - Le risposte alle richieste firmate e non firmate vengono memorizzate separatamente nella cache, quindi una risposta corretta a una richiesta firmata non viene mai utilizzata per gestire una richiesta non firmata.
- Se la tua applicazione invia un codice di risposta memorizzabile nella cache a una richiesta non valida, le richieste future valide potrebbero essere rifiutate in modo errato.
Per i backend di Cloud Storage, assicurati di rimuovere l'accesso pubblico, in modo che Cloud Storage possa rifiutare le richieste senza una firma valida.
La tabella riportata di seguito riassume il comportamento.
La richiesta contiene una firma | Hit cache | Comportamento |
---|---|---|
No | No | Inoltra a origine del backend. |
No | Sì | Pubblica dalla cache. |
Sì | No | Convalida firma. Se valido, inoltra all'origine del backend. |
Sì | Sì | Convalida firma. Se valido, servi dalla cache. |
Crea chiavi di richiesta firmate
Attivi il supporto per gli URL firmati e i cookie firmati di Cloud CDN creando una o più chiavi in un servizio di backend, un bucket di backend abilitato per Cloud CDN o entrambi.
Per ogni servizio di backend o bucket di backend puoi creare ed eliminare chiavi in base alle esigenze di sicurezza. Ogni backend può avere configurato fino a tre chiavi alla volta. Ti suggeriamo di ruotare periodicamente le chiavi eliminando le meno recenti, aggiungendone una nuova e utilizzando la nuova chiave quando firmi URL o cookie.
Puoi utilizzare lo stesso nome di chiave in più servizi e bucket di backend perché ogni set 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 tenerle al sicuro perché chiunque abbia una delle tue chiavi può creare URL firmati o cookie firmati che Cloud CDN accetta finché la chiave non viene eliminata da Cloud CDN. Le chiavi vengono memorizzate sul computer in cui generi gli URL firmati o i cookie firmati. Cloud CDN archivia anche le chiavi per verificare le firme delle richieste.
Per mantenere segrete le chiavi, i valori delle chiavi non sono inclusi nelle risposte alle richieste API. Se perdi una chiave, devi crearne una nuova.
Per creare una chiave di richiesta firmata, segui questi passaggi.
Console
- Nella console Google Cloud, vai alla pagina Cloud CDN.
- Fai clic sul nome dell'origine a cui vuoi aggiungere la chiave.
- Nella pagina Dettagli origine, fai clic sul pulsante Modifica.
- Nella sezione Nozioni di base sull'origine, 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 cache.
- Nella sezione Contenuti con limitazioni, seleziona Limita l'accesso utilizzando gli URL firmati e i 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 entrare, quindi specifica un valore chiave di firma.
Nella prima opzione, copia la coppia chiave-valore di generazione automatica in un file privato, che puoi utilizzare per creare URL firmati.
Fai clic su Fine.
Nella sezione Età massima voce voce cache, inserisci un valore, quindi seleziona un'unità di tempo.
Fai clic su Fine.
gcloud
Lo strumento a riga di comando gcloud
legge le chiavi da un file locale da te specificato. Il file della chiave deve essere creato generando 128 bit molto casuali,
codificandoli con Base64 e sostituendo il carattere +
con -
e sostituendo il carattere /
con _
. Per ulteriori informazioni, consulta
RFC 4648.
È fondamentale che la chiave sia assolutamente casuale. In un sistema simile a UNIX, puoi generare una chiave fortemente casuale e archiviarla 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 per Cloud Storage
Se utilizzi Cloud Storage e hai limitato gli utenti che possono leggere gli oggetti, devi concedere a Cloud CDN l'autorizzazione a leggere gli oggetti aggiungendo l'account di servizio Cloud CDN agli 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 progetto. In caso contrario, il comando non riesce e viene restituito un errore perché l'account di servizio di riempimento della cache Cloud CDN non viene creato finché non si aggiungono una o più chiavi per il progetto. Sostituisci PROJECT_NUM
con il numero del progetto e BUCKET
con il bucket di archiviazione.
gsutil iam ch \ serviceAccount:service-PROJECT_NUM@cloud-cdn-fill.iam.gserviceaccount.com:objectViewer \ gs://BUCKET
L'account di servizio Cloud CDN
service-PROJECT_NUM@cloud-cdn-fill.iam.gserviceaccount.com
non viene visualizzato nell'elenco degli account di servizio nel progetto. Questo perché l'account di servizio Cloud CDN è di proprietà di Cloud CDN, non il tuo progetto.
Per ulteriori informazioni sui numeri di progetto, consulta Individuare l'ID e il numero del progetto nella documentazione della guida di Google Cloud Console.
Personalizzare il tempo massimo della cache
Cloud CDN memorizza nella cache le risposte per le richieste firmate a prescindere dall'intestazione Cache-Control
del backend. Il tempo massimo in cui le risposte possono essere memorizzate nella cache senza riconvalida è impostato dal flag signed-url-cache-max-age
, che per impostazione predefinita è di un'ora e può essere modificato come mostrato qui.
Per impostare la durata massima 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 di richiesta firmati
Per elencare le chiavi su un servizio o bucket di backend, esegui uno dei seguenti comandi:
gcloud compute backend-services describe BACKEND_NAME
gcloud compute backend-buckets describe BACKEND_NAME
Elimina chiavi di richiesta firmate
Quando gli URL firmati da una determinata chiave non devono più essere rispettati, 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 relativi ai cookie firmati sono una serie di key-value
coppie (delimitati dal carattere :
), simili ai parametri di ricerca utilizzati in un URL firmato.
Per alcuni esempi, vedi Rilascio di cookie per gli utenti.
I criteri rappresentano i parametri per i quali è valida una richiesta. I criteri vengono firmati utilizzando un codice HMAC (Hash-based Message Authentication Code) che Cloud CDN convalida su ogni richiesta.
Definizione del formato dei criteri e dei campi
Esistono quattro campi obbligatori che devi definire nel seguente ordine:
URLPrefix
Expires
KeyName
Signature
Le coppie key-value
in un criterio relativo ai cookie firmati sono sensibili alle maiuscole.
Prefisso URL
URLPrefix
indica un prefisso URL con codifica Base64 sicuro per l'URL che include tutti i percorsi per cui la firma deve essere valida.
Un URLPrefix
codifica uno schema (http://
o https://
), un nome di dominio completo e un percorso facoltativo. Terminare il percorso con /
è facoltativo ma consigliato. Il prefisso non deve includere parametri di ricerca o frammenti come ?
o #
.
Ad esempio, https://media.example.com/videos
associa le richieste a entrambi i seguenti casi:
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 rigorosamente come percorso della directory.
Ad esempio, il prefisso https://example.com/data
concede l'accesso a entrambi i seguenti elementi:
/data/file1
/database
Per evitare questo errore, consigliamo di terminare tutti i prefissi con /
, a meno che tu non scelga intenzionalmente di terminare il prefisso con un nome file parziale, ad esempio https://media.example.com/videos/123
, per concedere l'accesso ai seguenti elementi:
/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).
NomeChiave
KeyName
è il nome della chiave creata per un bucket di backend o un servizio di backend. I nomi delle chiavi sono sensibili alle maiuscole.
Firma
Signature
è la firma HMAC-SHA-1 codificata in base64 con protezione dell'URL dei campi che compongono il criterio dei cookie. Questa operazione viene convalidata per 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 in modo programmatico i cookie firmati.
Go
Java
Python
Convalidare i cookie firmati
Il processo di convalida di un cookie firmato è essenzialmente lo stesso della generazione di un cookie firmato. Ad esempio, supponiamo che tu voglia convalidare la seguente intestazione di 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 quindi verificare che corrisponda a SIGNATURE
.
Produzione di cookie per gli utenti
La tua applicazione deve generare ed emettere a ogni utente (client) un unico 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 dei cookie con il formato seguente, tenendo presente che sia il nome sia il valore fanno distinzione tra maiuscole e minuscole:
Name: Cloud-CDN-Cookie Value: URLPrefix=$BASE64URLECNODEDURLORPREFIX:Expires=$TIMESTAMP:KeyName=$KEYNAME:Signature=$BASE64URLENCODEDHMAC
Esempio di intestazione
Set-Cookie
: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 in modo esplicito gli attributi
Domain
ePath
in modo che corrispondano al dominio e al prefisso del percorso da cui intendi pubblicare i contenuti protetti, che potrebbe differire 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 perché ciò potrebbe impedire l'accesso ai contenuti in altre sessioni del browser (finestre o schede).
Imposta i flag
Secure
eHttpOnly
, ove applicabile.Secure
assicura che il cookie venga inviato solo tramite connessioni HTTPS.HttpOnly
impedisce di rendere il cookie disponibile a JavaScript.Gli attributi cookie
Expires
eMax-Age
sono facoltativi. Se le ometti, esiste il cookie mentre esiste la sessione del browser (scheda, finestra).In caso di riempimento o fallimento della cache, il cookie firmato viene passato all'origine definita nel servizio di backend. Assicurati di convalidare il valore del cookie firmato su ogni richiesta prima di pubblicare i contenuti.