Cette page présente les URL signées et décrit comment les utiliser avec Cloud CDN. Les URL signées fournissent un accès aux ressources limité dans le temps à toute personne en possession de l'URL, qu'elle ait ou non un compte Google.
Une URL signée est une URL qui fournit une autorisation et une durée limitées pour effectuer une requête. Les URL signées contiennent des informations d'authentification dans leur chaîne de requête, ce qui permet aux utilisateurs sans identifiants d'effectuer des actions spécifiques sur une ressource. Lorsque vous générez une URL signée, vous spécifiez un utilisateur ou un compte de service qui doit disposer d'autorisations suffisantes pour effectuer la requête associée à l'URL.
Une fois l'URL signée générée, toute personne qui en dispose peut l'utiliser pour effectuer des actions spécifiées, telles que la lecture d'un objet, dans un délai spécifié.
Les URL signées acceptent également un paramètre URLPrefix facultatif, qui vous permet d'accorder un accès à plusieurs URL en fonction d'un préfixe commun.
Si vous souhaitez limiter l'accès à un préfixe d'URL spécifique, envisagez d'utiliser des cookies signés.
Avant de commencer
Avant d'utiliser des URL signées, procédez comme suit :
Assurez-vous que Cloud CDN est activé. Pour obtenir des instructions, consultez la page Utiliser Cloud CDN. Vous pouvez configurer des URL signées sur un backend avant d'activer Cloud CDN, mais elles sont sans effet jusqu'à l'activation de Cloud CDN.
Si nécessaire, installez la dernière version de la Google Cloud CLI :
gcloud components update
Pour en savoir plus, consultez la page Cookies et URL signés.
Configurer des clés de requête signées
La création de clés pour vos URL ou cookies signés nécessite plusieurs étapes, décrites dans les sections suivantes.
Points à noter concernant la sécurité
Cloud CDN ne valide pas les requêtes dans les cas suivants :
- La requête n'est pas signée.
- Cloud CDN n'est pas activé sur le service de backend ou le bucket backend de la requête.
Les requêtes signées doivent toujours être validées à l'origine avant de diffuser la réponse. Ceci est dû au fait que les origines peuvent servir à diffuser un mélange de contenu signé et non signé, et qu'un client peut accéder directement à l'origine.
- Cloud CDN ne bloque pas les requêtes n'utilisant ni le paramètre de requête
Signature, ni le cookie HTTPCloud-CDN-Cookie. Cloud CDN rejette les requêtes dont les paramètres sont incorrects (ou ne sont pas rédigés correctement). - Lorsque votre application détecte une signature non valide, assurez-vous qu'elle répond avec un code de réponse
HTTP 403 (Unauthorized). Les codes de réponseHTTP 403ne peuvent pas être mis en cache. - Les réponses aux requêtes signées et non signées sont mises en cache séparément. Par conséquent, une réponse réussie à une requête signée valide n'est jamais utilisée pour diffuser une requête non signée.
- Si votre application envoie un code de réponse pouvant être mis en cache à une requête non valide, les futures requêtes valides risquent d'être rejetées par erreur.
Pour les backends Cloud Storage, assurez-vous de supprimer l'accès public afin que Cloud Storage puisse rejeter les requêtes ne contenant pas de signature valide.
Le tableau suivant récapitule le comportement.
| La requête comporte une signature | Succès de cache (hit) | Comportement |
|---|---|---|
| Non | Non | La requête est transférée vers l'origine du backend. |
| Non | Oui | La requête est diffusée à partir du cache. |
| Oui | Non | La signature est validée. Si la requête est valide, elle est transférée vers l'origine du backend. |
| Oui | Oui | La signature est validée. Si la requête est valide, elle est diffusée à partir du cache. |
Créer des clés de requête signées
Pour pouvoir exploiter les URL et cookies signés de Cloud CDN, vous devez créer une ou plusieurs clés sur un service de backend et/ou un bucket backend compatibles avec Cloud CDN.
Pour chaque service de backend ou bucket backend, vous pouvez créer et supprimer des clés selon vos besoins en termes de sécurité. Chaque backend peut comporter jusqu'à trois clés configurées à la fois. Nous vous suggérons d'effectuer régulièrement une rotation des clés : supprimez la clé la plus ancienne, ajoutez-en une nouvelle et utilisez-la pour la signature des URL ou cookies.
Vous pouvez utiliser le même nom de clé dans plusieurs services de backend et buckets backend, car chaque ensemble de clés est indépendant des autres. Les noms de clé peuvent comporter jusqu'à 63 caractères. Pour nommer vos clés, utilisez les caractères A-Z, a-z, 0-9, _ (trait de soulignement) et - (trait d'union).
Lorsque vous créez des clés, veillez à les sécuriser, car toute personne qui en possède une peut créer des URL ou cookies signés acceptés par Cloud CDN jusqu'à ce que la clé soit supprimée du réseau de diffusion de contenu. Les clés sont stockées sur l'ordinateur sur lequel vous générez les URL ou cookies signés. Cloud CDN stocke également les clés pour valider les signatures de requête.
Pour garder les clés secrètes, les valeurs de clé ne sont pas incluses dans les réponses aux requêtes API. Si vous perdez une clé, vous devez en créer une nouvelle.
Pour créer une clé de requête signée, procédez comme suit.
Console
- Dans la console Google Cloud , accédez à la page Cloud CDN.
- Cliquez sur le nom de l'origine à laquelle vous souhaitez ajouter la clé.
- Sur la page Détails de l'origine, cliquez sur le bouton Modifier.
- Dans la section Blocs de base de l'origine, cliquez sur Suivant pour ouvrir la section Règles d'hôte et de chemin d'accès.
- Dans la section Règles d'hôte et de chemin d'accès, cliquez sur Suivant pour ouvrir la section Performances des caches.
- Dans la section Contenu soumis à des restrictions, sélectionnez Restreindre l'accès à l'aide des URL et des cookies signés.
Cliquez sur Ajouter une clé de signature.
- Spécifiez un nom unique pour la nouvelle clé de signature.
Dans la section Méthode de création de clé, sélectionnez Générer automatiquement. Vous pouvez également cliquer sur Saisir la clé, puis spécifier une valeur de clé de signature.
Pour la première option, copiez la valeur de la clé de signature générée automatiquement dans un fichier privé, que vous pourrez utiliser pour créer des URL signées.
Cliquez sur OK.
Dans la section Âge maximal de l'entrée de cache, saisissez une valeur, puis sélectionnez une unité de temps.
Cliquez sur OK.
gcloud
L'outil de ligne de commande gcloud lit les clés à partir d'un fichier local que vous spécifiez. Le fichier de clé doit être créé en générant une valeur de 128 bits fortement aléatoire, en l'encodant en base64, puis en remplaçant le caractère + par - et le caractère / par _. Pour plus d'informations, consultez la norme RFC 4648.
Il est essentiel que la clé soit fortement aléatoire. Sur un système de type UNIX, vous pouvez générer une clé fortement aléatoire et la stocker dans le fichier de clés à l'aide de la commande suivante :
head -c 16 /dev/urandom | base64 | tr +/ -_ > KEY_FILE_NAME
Pour ajouter la clé à un service de backend, utilisez la commande suivante :
gcloud compute backend-services \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
Pour ajouter la clé à un bucket backend, utilisez la commande ci-dessous :
gcloud compute backend-buckets \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
Configurer les autorisations Cloud Storage
Si vous utilisez Cloud Storage et que vous avez restreint l'accès en lecture aux objets, vous devez autoriser Cloud CDN à lire les objets en ajoutant le compte de service Cloud CDN aux listes de contrôle d'accès Cloud Storage.
Vous n'avez pas besoin de créer le compte de service. Il est créé automatiquement la première fois que vous ajoutez une clé au bucket backend d'un projet.
Avant d'exécuter la commande suivante, ajoutez au moins une clé à un bucket backend de votre projet. Si vous ne respectez pas cette condition, la commande échoue et renvoie une erreur, car le compte de service du remplissage du cache Cloud CDN n'est pas créé tant que vous n'avez pas ajouté au moins une clé pour le projet.
gcloud storage buckets add-iam-policy-binding gs://BUCKET \ --member=serviceAccount:service-PROJECT_NUMBER@cloud-cdn-fill.iam.gserviceaccount.com \ --role=roles/storage.objectViewer
Remplacez PROJECT_NUMBER par le numéro de votre projet et BUCKET par votre bucket de stockage.
Le compte de service Cloud CDN, service-PROJECT_NUMBER@cloud-cdn-fill.iam.gserviceaccount.com, ne figure pas dans la liste des comptes de service de votre projet. Ceci est dû au fait qu'il appartient à Cloud CDN, et non à votre projet.
Pour en savoir plus sur les numéros de projet, consultez Localiser l'ID et le numéro de projet dans la documentation d'aide de la console Google Cloud .
Personnaliser le délai de cache maximal
Cloud CDN met en cache les réponses aux requêtes signées, quel que soit l'en-tête Cache-Control du backend. Le délai maximal de mise en cache des réponses sans revalidation est défini par l'option signed-url-cache-max-age, qui prend la valeur par défaut d'une heure, et peut être modifié comme indiqué ici.
Pour définir la durée maximale de mise en cache d'un service de backend ou d'un bucket backend, exécutez l'une des commandes suivantes :
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
Lister les noms des clés de requête signées
Pour répertorier les clés d'un service de backend ou d'un bucket backend, exécutez l'une des commandes suivantes :
gcloud compute backend-services describe BACKEND_NAME
gcloud compute backend-buckets describe BACKEND_NAME
Supprimer des clés de requête signées
Lorsque les URL signées par une clé spécifique ne doivent plus être honorées, exécutez l'une des commandes suivantes pour supprimer cette clé du service de backend ou du bucket 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
Signer des URL
La dernière étape consiste à signer les URL et à les distribuer. Vous pouvez signer des URL à l'aide de la commande gcloud compute sign-url ou d'un code que vous écrivez vous-même.
Si vous avez besoin d'un grand nombre d'URL signées, le code personnalisé offre de meilleures performances.
Créer des URL signées
Suivez ces instructions pour créer des URL signées à l'aide de la commande gcloud compute sign-url. Pour cette étape, nous partons du principe que vous avez déjà créé les clés.
Console
Vous ne pouvez pas créer d'URL signées à l'aide de la console Google Cloud . Vous pouvez utiliser la Google Cloud CLI ou écrire du code personnalisé à partir des exemples suivants.
gcloud
La Google Cloud CLI inclut une commande pour la signature d'URL. La commande met en œuvre l'algorithme décrit dans la section sur l'écriture de votre code.
gcloud compute sign-url \ "URL" \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME \ --expires-in TIME_UNTIL_EXPIRATION \ [--validate]
Cette commande lit et décode la valeur de clé encodée en base64url de KEY_FILE_NAME, puis génère une URL signée utilisable pour les requêtes GET ou HEAD pour l'URL donnée.
Exemple :
gcloud compute sign-url \ "https://example.com/media/video.mp4" \ --key-name my-test-key \ --expires-in 30m \ --key-file sign-url-key-file
L'URL URL doit être valide et posséder un composant de chemin. Par exemple, https://example.com/ et https://example.com/whatever sont deux URL valides, contrairement à http://example.com.
Si l'option --validate facultative est spécifiée, cette commande envoie une requête HEAD avec l'URL générée et affiche le code de réponse HTTP. Si l'URL signée est correcte, le code de réponse est le même que le code de résultat envoyé par le backend. Si le code de réponse diffère, revérifiez KEY_NAME et le contenu du fichier spécifié, puis assurez-vous que la valeur de TIME_UNTIL_EXPIRATION est d'au moins plusieurs secondes.
Si l'option --validate n'est pas précisée, les éléments suivants ne sont pas vérifiés :
- Les entrées
- L'URL générée
- L'URL signée générée
Créer des URL signées de façon programmatique
Les exemples de code suivants montrent comment créer des URL signées par programmation.