Diese Seite bietet eine Übersicht über signierte URLs und eine Anleitung für deren Verwendung mit Cloud CDN. Signierte URLs gewähren zeitlich begrenzten Ressourcenzugriff für alle Personen, denen die URL bekannt ist, unabhängig davon, ob diese Nutzer ein Google-Konto haben.
Eine signierte URL beschränkt die Berechtigung und die Zeit zum Senden einer Anfrage. Abfragestrings von signierten URLs enthalten Authentifizierungsinformationen, damit Nutzer ohne Anmeldedaten bestimmte Aktionen für eine Ressource ausführen können. Wenn Sie eine signierte URL generieren, geben Sie ein Nutzer- oder Dienstkonto an, das ausreichende Berechtigungen hat, um die mit der URL verknüpfte Anfrage auszuführen.
Nachdem Sie eine signierte URL generiert haben, kann sie von allen Personen, denen sie bekannt ist, innerhalb eines bestimmten Zeitraums genutzt werden, um beispielsweise ein Objekt zu lesen.
Signierte URLs unterstützen auch den optionalen Parameter URLPrefix
, mit dem Sie Zugriff auf mehrere URLs basierend auf einem gemeinsamen Präfix gewähren können.
Wenn Sie den Zugriff auf ein bestimmtes URL-Präfix beschränken möchten, können Sie signierte Cookies verwenden.
Vorbereitung
Führen Sie die folgenden Schritte aus, bevor Sie signierte URLs verwenden:
Achten Sie darauf, dass Cloud CDN aktiviert ist. Eine Anleitung hierzu finden Sie unter Cloud CDN verwenden. Sie können signierte URLs auf einem Backend konfigurieren, bevor Sie Cloud CDN aktivieren. Dies wird jedoch erst wirksam, nachdem Cloud CDN aktiviert wurde.
Aktualisieren Sie bei Bedarf auf die neueste Version der Google Cloud CLI:
gcloud components update
Einen Überblick finden Sie unter Signierte URLs und signierte Cookies.
Schlüssel für signierte Anfragen konfigurieren
Schlüssel für signierte URLs oder signierte Cookies werden in mehreren Schritten erstellt, die in den folgenden Abschnitten beschrieben werden.
Sicherheitsaspekte
In den folgenden Fällen validiert Cloud CDN Anfragen nicht:
- Die Anfrage wurde nicht signiert.
- Bei dem Backend-Dienst oder Backend-Bucket für die Anfrage ist Cloud CDN nicht aktiviert.
Signierte Anfragen müssen immer am Ursprung validiert werden, bevor die Antwort zurückgegeben wird. Dies liegt daran, dass Ursprünge zur Bereitstellung einer Mischung aus signierten und unsignierten Inhalten verwendet werden können und ein Client direkt auf den Ursprung zugreifen kann.
- Cloud CDN blockiert keine Anfragen ohne einen Abfrageparameter
Signature
oder HTTP-CookieCloud-CDN-Cookie
. Anfragen mit ungültigen oder auf sonstige Weise fehlerhaften Anfrageparametern werden abgelehnt. - Wenn die Anwendung eine ungültige Signatur erkennt, prüfen Sie, ob Ihre Anwendung mit dem Antwortcode
HTTP 403 (Unauthorized)
antwortet.HTTP 403
-Antwortcodes können nicht zwischengespeichert werden. - Antworten auf signierte und nicht signierte Anfragen werden separat gespeichert. Eine erfolgreiche Antwort auf eine gültige signierte Anfrage wird daher nie zum Bereitstellen einer unsignierten Anfrage verwendet.
- Wenn Ihre Anwendung einen cachefähigen Antwortcode an eine ungültige Anfrage sendet, werden gültige zukünftige Anfragen eventuell fälschlicherweise abgelehnt.
Achten Sie bei Cloud Storage-Back-Ends darauf, den öffentlichen Zugriff zu entfernen, damit Cloud Storage Anfragen ablehnen kann, denen eine gültige Signatur fehlt.
In der folgenden Tabelle ist die Funktionsweise zusammengefasst.
Anfrage hat Signatur | Cache-Treffer | Verhalten |
---|---|---|
Nein | Nein | An Backend-Ursprung weiterleiten |
Nein | Ja | Aus dem Cache bereitstellen |
Ja | Nein | Signatur validieren. Wenn gültig, an den Backend-Ursprung weiterleiten. |
Ja | Ja | Signatur validieren. Falls gültig, aus dem Cache bereitstellen. |
Schlüssel für signierte Anfragen erstellen
Wenn von Cloud CDN signierte URLs und signierte Cookies unterstützt werden sollen, erstellen Sie einen oder mehrere Schlüssel in einem Backend-Dienst und/oder Backend-Bucket mit aktiviertem Cloud CDN.
Für jeden Backend-Dienst oder -Bucket können Sie entsprechend Ihren Sicherheitsanforderungen Schlüssel erstellen und löschen. Für jedes Backend können gleichzeitig bis zu drei Schlüssel konfiguriert sein. Wir empfehlen, Schlüssel regelmäßig zu rotieren. Löschen Sie dazu den ältesten, fügen einen neuen hinzu und verwenden den neuen Schlüssel beim Signieren von URLs und Cookies.
Sie können denselben Schlüsselnamen in mehreren Backend-Diensten und -Buckets verwenden, da jeder Schlüsselsatz von den anderen unabhängig ist. Schlüsselnamen können bis zu 63 Zeichen lang sein. Verwenden Sie zum Benennen Ihrer Schlüssel die Zeichen A–Z, a–z, 0–9, _ (Unterstrich) und - (Bindestrich).
Bewahren Sie Schlüssel nach dem Erstellen sicher auf. Jeder, der einen Ihrer Schlüssel kennt, kann signierte URLs oder signierte Cookies erstellen, die von Cloud CDN akzeptiert werden, bis der Schlüssel aus Cloud CDN gelöscht wird. Die Schlüssel werden auf dem Computer gespeichert, auf dem Sie die signierten URLs generieren. Cloud CDN speichert die Schlüssel auch, um Anfragesignaturen zu prüfen.
Damit die Schlüssel geheim bleiben, werden die Schlüssel/Wert-Paare nicht in Antworten auf API-Anfragen aufgenommen. Wenn Sie einen Schlüssel verlieren, müssen Sie einen neuen erstellen.
So erstellen Sie einen signierten Anfrageschlüssel:
Console
- Wechseln Sie in der Google Cloud Console zur Seite Cloud CDN.
- Klicken Sie auf den Namen der Quelle, der Sie den Schlüssel hinzufügen möchten.
- Klicken Sie auf der Seite Details zum Ursprung auf die Schaltfläche Bearbeiten.
- Klicken Sie im Bereich Ursprung-Grundlagen auf Weiter, um den Bereich Host- und Pfadregeln zu öffnen.
- Klicken Sie im Abschnitt Host- und Pfadregeln auf Weiter, um den Abschnitt Cacheleistung zu öffnen.
- Wählen Sie im Abschnitt Eingeschränkte Inhalte die Option Mit signierten URLs und signierten Cookies Zugriffe einschränken aus.
Klicken Sie auf Signaturschlüssel hinzufügen.
- Geben Sie einen eindeutigen Namen für den neuen Signaturschlüssel an.
Wählen Sie im Abschnitt Methode zur Schlüsselerstellung die Option Automatisch generieren aus. Alternativ können Sie auf Ich gebe den Wert ein klicken und dann einen Signaturschlüsselwert angeben.
Bei der ersten Option kopieren Sie den automatisch generierten Signaturschlüsselwert in eine private Datei, mit der Sie signierte URLs erstellen können.
Klicken Sie auf Fertig.
Geben Sie im Bereich Höchstalter der Cache-Einträge einen Wert ein und wählen Sie dann eine Zeiteinheit aus.
Klicken Sie auf Fertig.
gcloud
Das gcloud
-Befehlszeilentool liest Schlüssel aus einer von Ihnen angegebenen lokalen Datei. Die Schlüsseldatei muss erstellt werden, indem stark zufällige 128 Bit generiert und mit base64 codiert werden. Anschließend muss das Zeichen „+
“ durch „-
“ und das Zeichen „/
“ durch „_
“ ersetzt werden. Weitere Informationen finden Sie unter RFC 4648.
Es ist besonders wichtig, dass der Schlüssel stark zufällig ist. Auf einem UNIX-ähnlichen System können Sie einen stark zufälligen Schlüssel generieren und mit dem folgenden Befehl in der Schlüsseldatei speichern:
head -c 16 /dev/urandom | base64 | tr +/ -_ > KEY_FILE_NAME
So fügen Sie den Schlüssel zu einem Backend-Dienst hinzu:
gcloud compute backend-services \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
So fügen Sie den Schlüssel zu einem Backend-Bucket hinzu:
gcloud compute backend-buckets \ add-signed-url-key BACKEND_NAME \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME
Cloud Storage-Berechtigungen konfigurieren
Wenn Sie Cloud Storage verwenden und eingeschränkt haben, wer die Objekte lesen kann, müssen Sie Cloud CDN zum Lesen der Objekte berechtigen. Fügen Sie dazu das Cloud CDN-Dienstkonto den ACLs von Cloud Storage hinzu.
Sie müssen das Dienstkonto nicht erstellen. Das Dienstkonto wird automatisch erstellt, wenn Sie einem Backend-Bucket eines Projekts zum ersten Mal einen Schlüssel hinzufügen.
Fügen Sie mindestens einen Schlüssel zu einem Backend-Bucket in Ihrem Projekt hinzu, bevor Sie den folgenden Befehl ausführen. Ansonsten verursacht der Befehl einen Fehler, da das Dienstkonto von Cloud CDN mit Cache-Füllung erst erstellt wird, wenn Sie mindestens einen Schlüssel für das Projekt hinzufügen.
gcloud storage buckets add-iam-policy-binding gs://BUCKET \ --member=serviceAccount:service-PROJECT_NUM@cloud-cdn-fill.iam.gserviceaccount.com \ --role=roles/storage.objectViewer
Ersetzen Sie PROJECT_NUM
durch Ihre Projektnummer und BUCKET
durch Ihren Storage-Bucket.
Das Cloud CDN-Dienstkonto service-PROJECT_NUM@cloud-cdn-fill.iam.gserviceaccount.com
ist nicht in der Liste der Dienstkonten in Ihrem Projekt enthalten. Dies liegt daran, dass das Cloud CDN-Dienstkonto zu Cloud CDN gehört und nicht zu Ihrem Projekt.
Weitere Informationen zu Projektnummern finden Sie in der Hilfe zur Google Cloud Console unter Projekt-ID und Projektnummer finden.
Maximale Cache-Zeit anpassen
Cloud CDN speichert Antworten für signierte Anfragen unabhängig vom Cache-Control
-Header des Back-Ends im Cache. Die maximale Zeit, für die Antworten ohne erneute Validierung im Cache gespeichert werden können, wird durch das Flag signed-url-cache-max-age
festgelegt. Sie beträgt standardmäßig eine Stunde und kann wie hier gezeigt geändert werden.
Führen Sie einen der folgenden Befehle aus, um die maximale Cache-Zeit für einen Backend-Dienst oder -Bucket festzulegen:
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
Schlüsselnamen für signierte Anfragen auflisten
Führen Sie einen der folgenden Befehle aus, um die Schlüssel in einem Backend-Dienst oder -Bucket aufzulisten:
gcloud compute backend-services describe BACKEND_NAME
gcloud compute backend-buckets describe BACKEND_NAME
Schlüssel für signierte Anfragen löschen
Wenn mit einem bestimmten Schlüssel signierte URLs nicht mehr akzeptiert werden sollen, führen Sie einen der folgenden Befehle aus, um diesen Schlüssel aus dem Backend-Dienst oder Backend-Bucket zu löschen:
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
Urls signieren
Im letzten Schritt werden die URLs signiert und verteilt. Sie können URLs mit dem Befehl gcloud compute sign-url
oder durch selbst geschriebenen Code signieren.
Wenn Sie viele signierte URLs benötigen, bietet benutzerdefinierter Code eine bessere Leistung.
Signierte URLs erstellen
Folgen Sie dieser Anleitung, um signierte URLs mit dem Befehl gcloud compute sign-url
zu erstellen. Bei diesem Schritt wird vorausgesetzt, dass Sie die Schlüssel bereits erstellt haben.
Console
Mit der Google Cloud Console können Sie keine signierten URLs erstellen. Sie können die Google Cloud CLI verwenden oder anhand der folgenden Beispiele benutzerdefinierten Code schreiben.
gcloud
Die Google Cloud CLI enthält einen Befehl zum Signieren von URLs. Der Befehl implementiert den im Abschnitt zum Schreiben eigenen Codes beschriebenen Algorithmus.
gcloud compute sign-url \ "URL" \ --key-name KEY_NAME \ --key-file KEY_FILE_NAME \ --expires-in TIME_UNTIL_EXPIRATION \ [--validate]
Durch diesen Befehl wird das base64url-codierte Schlüssel/Wert-Paar aus KEY_FILE_NAME
gelesen und decodiert. Anschließend wird eine signierte URL ausgegeben, die Sie für GET
- oder HEAD
-Anfragen für die entsprechende URL verwenden können.
Beispiel:
gcloud compute sign-url \ "https://example.com/media/video.mp4" \ --key-name my-test-key \ --expires-in 30m \ --key-file sign-url-key-file
Die URL
muss eine gültige URL mit einer Pfadkomponente sein. http://example.com
ist zum Beispiel ungültig, https://example.com/
und https://example.com/whatever
hingegen sind gültige URLs.
Wenn das optionale Flag --validate
angegeben wird, sendet dieser Befehl eine HEAD
-Anfrage mit der resultierenden URL und gibt den HTTP-Antwortcode aus. Wenn die signierte URL korrekt ist, stimmt der Antwortcode mit dem Ergebniscode überein, der von Ihrem Backend gesendet wird. Wenn der Antwortcode nicht identisch ist, prüfen Sie noch einmal KEY_NAME
sowie den Inhalt der angegebenen Datei und achten Sie darauf, dass der Wert von TIME_UNTIL_EXPIRATION
mindestens einige Sekunden beträgt.
Wenn das Flag --validate
nicht angegeben ist, wird Folgendes nicht geprüft:
- Eingaben
- Die generierte URL
- Die generierte signierte URL
Signierte URLs programmatisch erstellen
Die folgenden Codebeispiele zeigen, wie Sie signierte URLs programmatisch erstellen können.
Go
Ruby
.NET
Java
Python
PHP
Signierte URLs programmatisch mit einem URL-Präfix erstellen
Die folgenden Codebeispiele zeigen, wie Sie signierte URLs mit einem URL-Präfix programmatisch erstellen können.
Go
Java
Python
Benutzerdefinierte signierte URLs generieren
Wenn Sie eigenen Code für signierte URLs schreiben, besteht das Ziel darin, URLs im folgenden Format oder Algorithmus zu erstellen. Bei allen URL-Parametern muss die Groß-/Kleinschreibung beachtet werden und sie müssen in dieser Reihenfolge angegeben sein:
https://example.com/foo?Expires=EXPIRATION&KeyName=KEY_NAME&Signature=SIGNATURE
So erstellen Sie signierte URLs:
Achten Sie darauf, dass die URL zum Signieren nicht den Abfrageparameter
Signature
enthält.Ermitteln Sie, wann die URL abläuft, und fügen Sie den Abfrageparameter
Expires
mit dem erforderlichen Ablaufzeitpunkt in UTC-Zeit (Anzahl der Sekunden seit 1970-01-01 00:00:00 UTC) an. Für eine maximale Sicherheit setzen Sie den Wert auf den kürzesten Zeitraum, der für Ihren Anwendungsfall möglich ist. Je länger eine signierte URL gültig ist, desto größer ist die Gefahr, dass der Nutzer, dem Sie die URL zur Verfügung stellen, diese versehentlich oder absichtlich an andere weitergibt.Legen Sie den Schlüsselnamen fest. Die URL muss mit einem Schlüssel des Backend-Dienstes oder Backend-Buckets signiert werden, der die URL bereitstellt. Am besten verwenden Sie den zuletzt hinzugefügten Schlüssel für die Schlüsselrotation. Fügen Sie den Schlüssel der URL hinzu, indem Sie
&KeyName=KEY_NAME
anhängen. Ersetzen SieKEY_NAME
durch den Namen des ausgewählten Schlüssels, den Sie unter Signierte Anfrageschlüssel erstellen erstellt haben.Signieren Sie die URL. Erstellen Sie die signierte URL mit den folgenden Schritten. Beachten Sie die direkt vor Schritt 1 gezeigte Reihenfolge der Abfrageparameter. Auch die Groß-/Kleinschreibung in der signierten URL darf nicht geändert werden.
a. Hashen Sie die gesamte URL, einschließlich
http://
oderhttps://
am Anfang und&KeyName...
am Ende, mit HMAC-SHA1. Verwenden Sie dazu den geheimen Schlüssel, der dem oben gewählten Schlüsselnamen entspricht. Nutzen Sie außerdem den geheimen 16-Rohbyte-Schlüssel und nicht den base64url-codierten Schlüssel. Decodieren Sie den Schlüssel, wenn nötig.b. Codieren Sie das Ergebnis mit base64url.
c. Hängen Sie an die URL
&Signature=
an, gefolgt von der codierten Signatur.
URL-Präfixe für signierte URLs verwenden
Anstatt die vollständige Anfrage-URL mit den Abfrageparametern Expires
und KeyName
zu signieren, können Sie stattdessen nur die Abfrageparameter URLPrefix
, Expires
und KeyName
signieren. Dadurch kann eine bestimmte Kombination aus den Suchparametern URLPrefix
, Expires
, KeyName
und Signature
wortwörtlich für mehrere URLs wiederverwendet werden, die mit dem URLPrefix
übereinstimmen. So muss nicht für jede einzelne URL eine neue Signatur erstellt werden.
Im folgenden Beispiel zeigt der markierte Text die Parameter an, die Sie signieren. Signature
wird wie üblich als abschließender Abfrageparameter angehängt.
https://media.example.com/videos/id/master.m3u8?userID=abc123&starting_profile=1&URLPrefix=aHR0cHM6Ly9tZWRpYS5leGFtcGxlLmNvbS92aWRlb3Mv&Expires=1566268009&KeyName=mySigningKey&Signature=8NBSdQGzvDftrOIa3WHpp646Iis=
Im Gegensatz zum Signieren einer vollständigen Anfrage-URL signieren Sie beim Anmelden mit URLPrefix
keine Abfrageparameter. Daher können Abfrageparameter frei in der URL enthalten sein. Im Gegensatz zu vollständigen Anfrage-URL-Signaturen können diese zusätzlichen Abfrageparameter sowohl vor als auch nach den Abfrageparametern der Signatur erscheinen. Daher ist die folgende URL auch eine gültige URL mit einem signierten URL-Präfix:
https://media.example.com/videos/id/master.m3u8?userID=abc123&URLPrefix=aHR0cHM6Ly9tZWRpYS5leGFtcGxlLmNvbS92aWRlb3Mv&Expires=1566268009&KeyName=mySigningKey&Signature=8NBSdQGzvDftrOIa3WHpp646Iis=&starting_profile=1
URLPrefix
gibt ein URL-sicheres, base64-codiertes URL-Präfix an, das alle Pfade umfasst, für die die Signatur gültig sein soll.
Ein URLPrefix
codiert ein Schema (entweder http://
oder https://
), einen FQDN und einen optionalen Pfad. Den Pfad mit einem /
zu beenden, ist optional, wird jedoch empfohlen. Das Präfix darf keine Suchparameter oder Fragmente wie ?
oder #
enthalten.
Zum Beispiel ordnet https://media.example.com/videos
Anfragen an beide folgenden Plattformen zu:
https://media.example.com/videos?video_id=138183&user_id=138138
https://media.example.com/videos/137138595?quality=low
Der Pfad des Präfixes wird als Text-Teilstring und nicht als Verzeichnispfad verwendet.
Das Präfix https://example.com/data
gewährt beispielsweise Zugriff auf die beiden folgenden Speicherorte:
/data/file1
/database
Wir empfehlen, allen Präfixen am Ende /
hinzuzufügen, um diesen Fehler zu vermeiden, außer Sie lassen das Präfix absichtlich auf einen unvollständigen Dateinamen wie https://media.example.com/videos/123
enden, um Zugriff auf Folgendes zu gewähren:
/videos/123_chunk1
/videos/123_chunk2
/videos/123_chunkN
Wenn die angeforderte URL nicht mit URLPrefix
übereinstimmt, lehnt Cloud CDN die Anfrage ab und gibt den HTTP-Fehler HTTP 403
an den Client zurück.
Signierte URLs überprüfen
Die Validierung einer signierten URL entspricht im Wesentlichen der Erstellung einer signierten URL. Angenommen, Sie möchten die folgende signierte URL validieren:
https://example.com/PATH?Expires=EXPIRATION&KeyName=KEY_NAME&Signature=SIGNATURE
Sie können den Secret-Schlüssel mit dem Namen KEY_NAME
verwenden, um die Signatur für die folgende URL unabhängig zu generieren:
https://example.com/PATH?Expires=EXPIRATION&KeyName=KEY_NAME
Prüfen Sie dann, ob er mit SIGNATURE
übereinstimmt.
Angenommen, Sie möchten eine signierte URL mit einem URLPrefix
validieren, wie hier gezeigt:
https://example.com/PATH?URLPrefix=URL_PREFIX&Expires=EXPIRATION&KeyName=KEY_NAME&Signature=SIGNATURE
Prüfen Sie zuerst, ob der base64-decodierte Wert von URL_PREFIX
ein Präfix von https://example.com/PATH
ist. Wenn ja, können Sie die Signatur für Folgendes berechnen:
URLPrefix=URL_PREFIX&Expires=EXPIRATION&KeyName=KEY_NAME
Sie können überprüfen, ob er mit SIGNATURE
übereinstimmt.
Bei URL-basierten Signaturmethoden, bei denen die Signatur Teil der Abfrageparameter ist oder als URL-Pfadkomponente eingebettet ist, werden die Signatur und die zugehörigen Parameter aus der URL entfernt, bevor die Anfrage an den Ursprung gesendet wird. So wird verhindert, dass die Signatur Routingprobleme verursacht, wenn der Ursprung die Anfrage verarbeitet. Um diese Anfragen zu validieren, kannst du den x-client-request-url
-Anfrageheader prüfen. Er enthält die ursprüngliche (signierte) URL der Clientanfrage vor dem Entfernen der signierten Komponenten.
Öffentlichen Zugriff auf den Cloud Storage-Bucket entfernen
Damit signierte URLs Inhalte ordnungsgemäß schützen können, darf der Ursprungsserver keinen öffentlichen Zugriff auf die entsprechenden Inhalte gewähren. Bei Cloud Storage-Buckets werden Objekte in der Regel vorübergehend zu Testzwecken veröffentlicht. Nachdem die signierten URLs aktiviert wurden, müssen die LESEBERECHTIGUNGEN allUsers
(und ggf. allAuthenticatedUsers
) für den Bucket entfernt werden (mit anderen Worten die Identity and Access Management-Rolle Storage-Objekt-Betrachter).
Wenn Sie den öffentlichen Zugriff auf den Bucket deaktiviert haben, können einzelne Nutzer dennoch auf Cloud Storage ohne signierte URLs zugreifen, sofern sie eine Zugriffsberechtigung haben, z. B. die Berechtigung INHABER:
Wenn Sie den öffentlichen Lesezugriff allUsers
auf einen Cloud Storage-Bucket entfernen möchten, machen Sie die unter Alle Objekte in einem Bucket öffentlich lesbar machen beschriebenen Aktionen rückgängig.
Signierte URLs verteilen und verwenden
Die von der Google Cloud CLI zurückgegebene oder von Ihrem benutzerdefinierten Code erstellte URL kann Ihren Anforderungen entsprechend verteilt werden. Wir empfehlen, nur HTTPS-URLs zu signieren, da HTTPS eine sichere Übertragung gewährleistet und dadurch verhindert, dass die Signature
-Komponente der signierten URL abgefangen wird. Ebenso sollten Sie die signierten URLs über sichere Übertragungsprotokolle wie TLS/HTTPS verteilen.