署名付き URL

このページでは、署名付き URL の概要を示します。これを使用すると、Google アカウントを持っているかどうかにかかわらず、URL を所有しているユーザーに、期限付きのリソース アクセス権を提供できます。署名付き URL を作成する方法については、Cloud Storage Tools を使用した V4 署名プロセスと、独自プログラムを使用した V4 署名プロセスをご覧ください。バケットとオブジェクトへのアクセスを制御するその他の方法については、アクセス制御の概要をご覧ください。

概要

署名付き URL は、リクエスト時における制限付きの権限と有効期限が設定された URL です。署名付き URL のクエリ文字列には認証情報が含まれているため、認証情報を持たないユーザーでもリソースに対して特定の操作を実行できます。署名付き URL を生成する際には、署名付き URL によるリクエストを実行するのに十分な権限を持っているユーザーまたはサービス アカウントを指定します。署名付き URL を生成すると、その URL を所有するすべての人が、指定された期間内に、その署名付き URL を使用してオブジェクトの読み取りなどの指定されたアクションを実行できます。

署名付き URL を使用する必要がある場合

シナリオによっては、ユーザーの Google アカウントによって Cloud Storage へのアクセスを制御することが望ましくなく、むしろアプリケーション固有のロジックを使ってアクセスを制御したい場合があります。このような場合には、一般にユーザーに署名付き URL を提供し、ユーザーにそのリソースについて期間限定で読み取り、書き込み、削除のアクセス権を与えることで対処します。URL が期限切れになるまで、URL を知っている人であれば誰でもそのリソースにアクセスできます。署名付き URL を作成するときには、有効期限を指定します。

署名付き URL を生成するためのオプション

Cloud Storage では、署名付き URL を生成するいくつかの方法がサポートされています。

  • サービス アカウント認証による V4 署名ベータ版: この署名メカニズムについては後述します。

  • サービス アカウント認証による V2 署名: この署名メカニズムの詳細については、こちらをご覧ください。

  • HMAC 認証による署名: Amazon Simple Storage Service(Amazon S3)ユーザーの場合は、既存のワークフローを使用して Cloud Storage の署名付き URL を生成できます。Cloud Storage リソースとホスト storage.googleapis.com を指定してから、署名付き URL を生成するプロセスにおいて Google HMAC の認証情報を使用します。

署名付き URL の例

次は、サービス アカウント認証を使用した V4 署名プロセスに従って作成された署名付き URL の例です。

https://storage.googleapis.com/example-bucket/cat.jpeg?X-Goog-Algorithm=
GOOG4-RSA-SHA256&X-Goog-Credential=example%40example-project.iam.gserviceaccount
.com%2F20181026%2Fus-central-1%2Fstorage%2Fgoog4_request&X-Goog-Date=20181026T18
1309Z&X-Goog-Expires=900&X-Goog-SignedHeaders=host&X-Goog-Signature=247a2aa45f16
9edf4d187d54e7cc46e4731b1e6273242c4f4c39a1d2507a0e58706e25e3a85a7dbb891d62afa849
6def8e260c1db863d9ace85ff0a184b894b117fe46d1225c82f2aa19efd52cf21d3e2022b3b868dc
c1aca2741951ed5bf3bb25a34f5e9316a2841e8ff4c530b22ceaa1c5ce09c7cbb5732631510c2058
0e61723f5594de3aea497f195456a2ff2bdd0d13bad47289d8611b6f9cfeef0c46c91a455b94e90a
66924f722292d21e24d31dcfb38ce0c0f353ffa5a9756fc2a9f2b40bc2113206a81e324fc4fd6823
a29163fa845c8ae7eca1fcf6e5bb48b3200983c56c5ca81fffb151cca7402beddfc4a76b13344703
2ea7abedc098d2eb14a7

この署名付き URL により、バケット example-bucket 内の cat.jpeg オブジェクトの読み取りアクセスが提供されます。この署名付き URL の基になったクエリ パラメータは次のとおりです。

  • X-Goog-Algorithm: URL の署名に使用されるアルゴリズム。

  • X-Goog-Credential: 署名付き URL の作成に使用される認証情報。

  • X-Goog-Date: 署名付き URL が使用可能になる日付と時刻。ISO 8601 の基本形式(YYYYMMDD'T'HHMMSS'Z')で表示されます。

  • X-Goog-Expires: 署名付き URL が有効である時間の長さ。X-Goog-Date に格納された値からの秒数で表されます。

  • X-Goog-SignedHeaders: 署名付き URL を使用するリクエストの一部として含める必要があるヘッダー。

  • X-Goog-Signature: cat.jpeg へのアクセスに、署名付き URL を使用したリクエストを許可する認証文字列。

再開可能なアップロードでの署名付き URL の使用

再開可能アップロードで署名付き URL を使用してオブジェクトをバケットにアップロードする場合、署名付き URL を使用する必要があるのは最初の POST リクエストだけです。POST リクエストではデータはアップロードされません。その場合、リクエストは、データをアップロードするための後続の PUT リクエストで使用されるセッション URI を返します。セッション URI 自体が実質的な認証トークンとなるため、PUT リクエストにおいては元の署名付き URL を使用する必要はなくなります。この動作によりサーバーによる POST リクエストの処理が許可され、クライアント自身が署名付き URL を処理する必要が回避されます。

再開可能なアップロードは、アップロードが開始されたリージョンで必ず行われます。たとえば、米国で作成された再開可能なアップロード URL がアジアのクライアントに渡された場合でも、アップロード自体は米国で実行されます。そのため、再開可能なアップロードを開始したリージョンとは異なるリージョンで実行すると、アップロードに時間がかかる可能性があります。この状況を回避するには、最初の POST リクエストの作成と署名をサーバーで実行した後、署名付き URL をクライアントに渡してアップロードがそのロケーションから開始されるようにします。アップロードが開始されたら、クライアントは得られたセッション URI を通常どおり使用して、署名が不要な PUT リクエストを発行できます。

署名付き URL の考慮事項

署名付き URL を使用する際は、次の点に注意してください。

  • 一般的には、あらゆる種類の XML API リクエストに対して、署名付き URL を使用できます。ただし、現在 Node.js の Cloud Storage クライアント ライブラリでは、個々のオブジェクトに対してだけ署名付き URL を作成します。たとえば、バケット内のオブジェクトを一覧表示する署名付き URL を作成することはできません。

  • また現在、Python と Go の Cloud Storage クライアント ライブラリでは、V4 署名付き URL をサポートしていません。

  • response-content-dispositionresponse-content-type などのクエリ文字列パラメータは、署名によって検証されません。レスポンスにおける Content-Disposition や Content-Type の値を固定するには、これらのパラメータをオブジェクト メタデータに設定します

  • 認証情報を指定するときに、メールアドレスを使用してサービス アカウントを特定することをおすすめします。ただし、サービス アカウント ID の使用もサポートされています。

正規リクエスト

正規リクエストには、署名付き URL を使用する際にユーザーが実行するリクエストが定義されます。具体的には、署名付き URL を使用するリクエストで必要とされる HTTP 動詞、クエリ文字列パラメータ、ヘッダーなどの情報、署名付き URL によってアクセス可能なオブジェクト、バケットなどのリソースが含まれます。

HTTP 動詞

署名付き URL は、次の HTTP 動詞と併用できます。

リソースパス

正規リクエストには、署名付き URL が適用されるリソースへのパスが含まれます。このパスは、ホスト名の後からクエリ文字列の前までの部分です。

たとえば、Cloud Storage URL が https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg?userProject=my-project である場合、リソースへのパスは /example-bucket/cat-pics/tabby.jpeg です。

一方、https://example-bucket.storage.googleapis.com/cat-pics/tabby.jpeg?userProject=my-project など、代替の Cloud Storage URL を使用する場合、リソースへのパスは /cat-pics/tabby.jpeg になります。

署名付き URL で使用できるその他の URL エンドポイントについては、XML API リクエスト エンドポイントをご覧ください。

リソースパスを定義する際に、次のような予約済み文字をパーセント エンコードする必要があります。?=!#$&'()*+,:;@[]."。URL で使用されている他のパーセント エンコーディングもリソースパスに含める必要があります。

クエリ文字列

正規リクエストに含まれるのは、署名付き URL を使用するリクエストの一部に含める必要があるクエリ文字列パラメータです。クエリ文字列は、リソースパスの末尾の疑問符(?)の後に続く部分です。

たとえば、Cloud Storage URL が https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg?userProject=my-project の場合、userProject=my-project がクエリ文字列になります。

正規リクエストでは、クエリ文字列のすべてのパラメータをコードポイント値により辞書のように並べ替える必要があります。また、すべてのパラメータを & で区切る必要があります。

必須のクエリ文字列パラメータ

クエリ文字列パラメータの多く(alt など)は必要な場合にのみ追加されますが、次に示すクエリ文字列パラメータはすべての署名付き URL に含める必要があります。

  • X-Goog-Algorithm: URL の署名に使用されたアルゴリズム。有効な値は GOOG4-RSA-SHA256GOOG4-HMAC-SHA256 です。
  • X-Goog-Credential: URL の署名に使用された認証情報。認証情報は、承認者と認証情報スコープで構成し、[AUTHORIZER]%2F[CREDENTIAL_SCOPE] の形式で表示します。承認者には、サービス アカウント名または HMAC アクセスキーを指定します。
  • X-Goog-Date: 現在の日付と時刻。ISO 8601 の基本形式(YYYYMMDD'T'HHMMSS'Z')で表示します。
  • X-Goog-Expires: 署名付き URL の有効期間。X-Goog-Date に格納された値からの秒数で表されます。
  • X-Goog-SignedHeaders: 署名付き URL によるリクエストに含める必要があるヘッダー名をセミコロンで区切ったリスト。これらのヘッダーのうちの 1 つは、host でなければなりません。
  • X-Goog-Signature: リクエストを認証する署名。

ヘッダー

正規のリクエストに含まれるのは、x-goog で始まるカスタム ヘッダーや拡張ヘッダーなど、署名付き URL を使用するリクエストの一部である必要があるヘッダーです。正規リクエスト中のいくつかの箇所でヘッダーを指定します。

  1. X-Goog-SignedHeaders クエリ文字列パラメータに、名前ごとに ; で区切ってヘッダー名を指定します。
  2. 正規リクエストのクエリ文字列の部分の後にヘッダー name:value を指定します。その際、各ペアを改行文字(\n)で区切ります。
  3. name:value ペアのリストの後に改行を入れてからヘッダー名を指定します。各ヘッダー名は ; で区切ります。

ヘッダーに name:value ペアを指定するときは、次の点に注意してください。

  • すべてのヘッダー名を小文字にします。
  • すべてのヘッダー名を、コードポイント値の辞書順で並べ替えます。
  • 重複したヘッダー名は、値をカンマで区切ってリストすることで 1 つのヘッダー名にまとめます。値と値の間に空白文字がなく、カンマで区切られた値の順番がリクエストに表示されるヘッダーの順番と同じであることを確認してください。詳しい情報は、RFC 7230 3.2 条をご覧ください。
  • 折りたたみ空白文字や改行(CRLF または LF)はすべて単一の空白文字に置き換えます。折りたたみ空白文字について詳しくは、RFC 7230 3.2.4 条をご覧ください。
  • ヘッダー名の後のコロンの前後に空白文字があれば削除します。

    たとえば、コロンの後の空白文字を削除せずにカスタム ヘッダー x-goog-acl: private を使用すると、403 Forbidden エラーが返されます。これは、計算したリクエスト署名が、Google によって計算される署名と一致しないためです。

たとえば、次の一連のヘッダーがあるとします。

host: storage.googleapis.com
content-type: text/plain
x-goog-meta-reviewer: jane
x-goog-meta-reviewer: john

正規リクエストの構成は次のようになります。

content-type:text/plain
host:storage.googleapis.com
x-goog-meta-reviewer:jane,john

必須ヘッダー

content-type ヘッダーや拡張ヘッダーなどのほとんどのヘッダーは必要な場合にのみ追加されますが、次に示すヘッダーはすべての署名付き URL に含める必要があります。

  • host: Cloud Storage へのアクセスに使用される URI。

さらに、以下のヘッダーは、正規リクエストで明示的に指定されない限り、署名付き URL を使用するリクエストでは使用できません。

  • x-goog-project-id
  • x-goog-copy-source
  • x-goog-metadata-directive
  • x-amz-copy-source
  • x-amz-metadata-directive

認証情報スコープ

認証情報スコープは、署名する文字列と X-Goog-Credential クエリ文字列パラメータの両方に表示されます。次のような構文で表示されます。

[DATE]/[LOCATION]/storage/goog4_request
  • [DATE]: YYYYMMDD 形式の日付。署名する文字列で使用されている日付と一致する必要があります。
  • [LOCATION]: リソースが存在する、または作成される予定のリージョン。Cloud Storage のリソースの場合、[LOCATION] の値は任意です。[LOCATION] パラメータは、Amazon Simple Storage Service(Amazon S3)との互換性を維持するために提供されています。
  • storage: サービス名。
  • goog4_request: 署名付き URL の種類。

例: 20181102/us/storage/goog4_request

Google Cloud Platform ツールを使用した文字列への署名

プログラムから署名付き URL を生成する場合、GCP が提供するツールを使用して文字列に署名できます。

App Engine の App Identity サービス

App Engine アプリケーション内の署名処理は、App Engine サービス アカウントの認証情報を利用する App Engine の Identity サービスによって実行されます。たとえば、Python App Identity API を使用すると、次のことが可能になります。

  • google.appengine.api.app_identity.sign_blob() を使用して、作成した文字列のバイトに署名する。Signature は、署名付き URL を組み立てるときに必要になります。

  • google.appengine.api.app_identity.get_service_account_name() を使用してサービス アカウント名を取得する。サービス アカウント名 GoogleAccessId は、署名付き URL を組み立てるときに必要になります。

App Engine ではその他の言語もサポートしています。

App Identity サービスは、blob を署名するときに秘密鍵をローテーションします。App Identity サービスで生成された署名付き URL は、少なくとも 1 時間有効であり、リソースへの短時間のアクセスに最適です。

IAM signBlob

IAM signBlob メソッドを使用して署名できます。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。