Google Cloud Storage の認証

Cloud Storage で実行するほとんどのオペレーションは認証される必要があります。唯一の例外は、匿名アクセスが許可されているオブジェクトに対するオペレーションです。allUsers グループに READ 権限がある場合は、オブジェクトに匿名でアクセスできます。allUsers グループには、インターネット上のすべての人が含まれます。

OAuth 2.0

認証

Google Cloud Storage は、OAuth 2.0 を使って API の認証と承認を行います。認証は、クライアントの身元を確認する処理です。認証の詳細は、Google Cloud Storage へのアクセス方法によって変わりますが、一般的に以下の 2 種類のいずれかになります。

  • サーバー中心のフローでは、認証を完了するためのサービス アカウントの認証情報を、アプリケーションが直接保持します。このフローは、アプリケーションがユーザーデータではなく自身のデータを操作する場合に使用します。Google Cloud Platform プロジェクトでは、デフォルト サービス アカウントを使用するか、新しいサービス アカウントを作成できます。

  • ユーザー中心のフローでは、アプリケーションがエンドユーザーから認証情報を取得できます。ユーザーは、認証を完了するためにサインインします。このフローは、アプリケーションがユーザーデータにアクセスする必要がある場合に使用します。ユーザー中心のフローが適しているシナリオについては、このページで後述するユーザー アカウント認証情報のセクションをご覧ください。

両方の種類の認証を 1 つのアプリケーションで使用できることができます。認証の詳しい背景情報については、Google Cloud Platform Auth ガイドをご覧ください。

スコープ

承認は、認証されたユーザーが、指定のリソースに対してどのような権限を持つかを判定する処理です。OAuth では、認証されたユーザーを承認するかどうかを判定するために、スコープを使用します。アプリケーションは認証情報(ユーザー中心の認証フローやサーバー中心の認証フローで取得したもの)と、1 つ以上のスコープを使って、保護されたリソースにアクセスするためのアクセス トークンを Google 承認サーバーに要求します。たとえば、スコープが read-only のアクセス トークンを持つアプリケーション A は読み取りのみが可能ですが、スコープが read-write のアクセス トークンを持つアプリケーション B は、データの読み取りと変更を行うことができます。どちらのアプリケーションも、オブジェクトとバケットのアクセス制御リストの読み取りと変更はできません。それができるのは、full-control のスコープを持つアプリケーションだけです。

タイプ 説明 スコープの URL
read-only バケットの一覧表示を含め、データを読み取るためのアクセスのみを許可します。 https://www.googleapis.com/auth/devstorage.read_only
read-write データの読み取りと変更のアクセスは許可しますが、IAM ポリシーなどのメタデータへのアクセスは許可しません。 https://www.googleapis.com/auth/devstorage.read_write
full-control IAM ポリシーの変更を含め、データに対するフル コントロールを許可します。 https://www.googleapis.com/auth/devstorage.full_control
cloud-platform.read-only Google Cloud Platform サービス全体のデータを表示します。Google Cloud Storage では、これは devstorage.read-only と同じです。 https://www.googleapis.com/auth/cloud-platform.read-only
cloud-platform すべての Google Cloud Platform サービスにわたるデータを表示して管理します。Google Cloud Storage では、これは devstorage.full-control と同じです。 https://www.googleapis.com/auth/cloud-platform

gsutil 認証

gsutilCloud SDK からインストールした場合、ユーザー アカウント認証情報かサービス アカウント認証情報で認証できます。

サービス アカウント認証情報を使用する

  1. 既存のサービス アカウントを使用するか、新規サービス アカウントを作成し、関連付けられている秘密鍵をダウンロードします。

  2. gcloud auth activate-service-account を使い、サービス アカウントを使用して認証します。

    gcloud auth activate-service-account
    

ユーザー アカウント認証情報を使用する

gcloud auth application-default login を使い、ユーザー アカウント認証情報を使用して認証します。

gcloud auth application-default login

gcloud auth は、アクセス トークンを取得するときに、cloud-platform 範囲を使用します。

gsutil を Cloud SDK とは独立してインストールした場合は、gsutil のインストール ページで、ユーザー アカウントやサービス アカウントを使って認証する方法を確認してください。

クライアント ライブラリの認証

クライアント ライブラリは、アプリケーションのデフォルト認証情報を使うことによって、Google API で簡単に認証を行い、これら API にリクエストを送信することができます。アプリケーションのデフォルト認証情報により、ローカルでアプリケーションのテストを行い、基本となるコードを変更することなくアプリケーションを導入できるようになります。コードのサンプルを含む、詳しい情報は、Google Cloud Platform Auth ガイドをご覧ください。

アプリケーションのデフォルト認証情報は、Google Cloud Storage にアクセスするために使用できるクライアント ライブラリの一部です。デフォルト認証情報は、ユーザー認証情報またはデフォルト サーバー アカウントを使ってアプリケーションを識別します。ライブラリを使用するときには、コードを実行する環境の種類に基づいて認証情報を選ぶのが一般的です。

環境の初期化

ローカル開発環境

ローカル開発環境を初期化するために、Google Cloud SDK を使ってユーザー認証情報で認証できます。Linux/Mac OS X では、次のスクリプトを使います。

curl https://sdk.cloud.google.com | bash
インストールすると、独自のユーザー アカウント認証情報をプロキシとして使い、次のコマンドを実行することでローカルマシンから API を呼び出すコードをテストできます。
gcloud auth application-default login
このコマンドは、cloud-platform スコープを使用してアクセス トークンを要求します。

Google Cloud Platform

Google App Engine または Google Compute Engine でアプリケーションを実行している場合は、環境内でサービス アカウントの認証情報がすでに用意されているため、追加の設定は不要です。Compute Engine の場合、サービス アカウントのスコープは、インスタンスを作成した方法に依存します。インスタンスに対するサービス アカウント アクセスのスコープの設定をご覧ください。App Engine では cloud-platform スコープが使用されます。

その他の環境

Google Cloud Platform の外部の本番環境では、環境変数を通じてサービス アカウントの認証情報を指定し、スコープはコード内に設定されます。詳しくは、アプリケーションのデフォルト認証情報の仕組みをご覧ください。サービス アカウントの作成については、このページで後述します。

アプリケーションのデフォルト認証情報の使用例

C#

Cloud Storage クライアントのインストールと作成の詳細については、Cloud Storage クライアント ライブラリをご覧ください。

using Google.Cloud.Storage.V1;
using System;
using System.Diagnostics;

namespace GoogleCloudSamples
{
    class StorageQuickstart
    {
        static void Main(string[] args)
        {
            // Your Google Cloud Platform project ID.
            string projectId = "YOUR-PROJECT-ID";

            // Instantiates a client.
            StorageClient storageClient = StorageClient.Create();

            // The name for the new bucket.
            string bucketName = projectId + "-test-bucket";
            try
            {
                // Creates the new bucket.
                storageClient.CreateBucket(projectId, bucketName);
                Console.WriteLine($"Bucket {bucketName} created.");
            }
            catch (Google.GoogleApiException e)
            when (e.Error.Code == 409)
            {
                // The bucket already exists.  That's fine.
                Console.WriteLine(e.Error.Message);
            }
        }
    }
}

Go

Cloud Storage クライアントのインストールと作成の詳細については、Cloud Storage クライアント ライブラリをご覧ください。

// Sample storage-quickstart creates a Google Cloud Storage bucket.
package main

import (
	"fmt"
	"log"

	// Imports the Google Cloud Storage client package.
	"cloud.google.com/go/storage"
	"golang.org/x/net/context"
)

func main() {
	ctx := context.Background()

	// Sets your Google Cloud Platform project ID.
	projectID := "YOUR_PROJECT_ID"

	// Creates a client.
	client, err := storage.NewClient(ctx)
	if err != nil {
		log.Fatalf("Failed to create client: %v", err)
	}

	// Sets the name for the new bucket.
	bucketName := "my-new-bucket"

	// Creates a Bucket instance.
	bucket := client.Bucket(bucketName)

	// Creates the new bucket.
	if err := bucket.Create(ctx, projectID, nil); err != nil {
		log.Fatalf("Failed to create bucket: %v", err)
	}

	fmt.Printf("Bucket %v created.\n", bucketName)
}

Java

Cloud Storage クライアントのインストールと作成の詳細については、Cloud Storage クライアント ライブラリをご覧ください。

// Imports the Google Cloud client library
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class QuickstartSample {
  public static void main(String... args) throws Exception {
    // Instantiates a client
    Storage storage = StorageOptions.getDefaultInstance().getService();

    // The name for the new bucket
    String bucketName = args[0];  // "my-new-bucket";

    // Creates the new bucket
    Bucket bucket = storage.create(BucketInfo.of(bucketName));

    System.out.printf("Bucket %s created.%n", bucket.getName());
  }
}

Node.js

Cloud Storage クライアントのインストールと作成の詳細については、Cloud Storage クライアント ライブラリをご覧ください。

// Imports the Google Cloud client library
const Storage = require('@google-cloud/storage');

// Your Google Cloud Platform project ID
const projectId = 'YOUR_PROJECT_ID';

// Instantiates a client
const storage = Storage({
  projectId: projectId,
});

// The name for the new bucket
const bucketName = 'my-new-bucket';

// Creates the new bucket
storage
  .createBucket(bucketName)
  .then(() => {
    console.log(`Bucket ${bucketName} created.`);
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

PHP

Cloud Storage クライアントのインストールと作成の詳細については、Cloud Storage クライアント ライブラリをご覧ください。

# Includes the autoloader for libraries installed with composer
require __DIR__ . '/vendor/autoload.php';

# Imports the Google Cloud client library
use Google\Cloud\Storage\StorageClient;

# Your Google Cloud Platform project ID
$projectId = 'YOUR_PROJECT_ID';

# Instantiates a client
$storage = new StorageClient([
    'projectId' => $projectId
]);

# The name for the new bucket
$bucketName = 'my-new-bucket';

# Creates the new bucket
$bucket = $storage->createBucket($bucketName);

echo 'Bucket ' . $bucket->name() . ' created.';

Python

Cloud Storage クライアントのインストールと作成の詳細については、Cloud Storage クライアント ライブラリをご覧ください。

# Imports the Google Cloud client library
from google.cloud import storage

# Instantiates a client
storage_client = storage.Client()

# The name for the new bucket
bucket_name = 'my-new-bucket'

# Creates the new bucket
bucket = storage_client.create_bucket(bucket_name)

print('Bucket {} created.'.format(bucket.name))

Ruby

Cloud Storage クライアントのインストールと作成の詳細については、Cloud Storage クライアント ライブラリをご覧ください。

# Imports the Google Cloud client library
require "google/cloud/storage"

# Your Google Cloud Platform project ID
project_id = "YOUR_PROJECT_ID"

# Instantiates a client
storage = Google::Cloud::Storage.new project: project_id

# The name for the new bucket
bucket_name = "my-new-bucket"

# Creates the new bucket
bucket = storage.create_bucket bucket_name

puts "Bucket #{bucket.name} was created."

API の認証

OAuth 2.0 を使って Google Cloud Storage の XML APIJSON API に対するリクエストを行う場合は、認証が必要なすべてのリクエストの Authorization ヘッダーにアプリケーションのアクセス トークンを指定します。

Authorization: Bearer <oauth2_token>

以下に、バケット内のオブジェクトを一覧表示するリクエストの例を示します。

JSON API

Objects リソースの list メソッドを使用します。

GET /storage/v1/b/example-bucket/o HTTP/1.1
Host: www.googleapis.com
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

XML API

List objects リクエストを使用します。

GET / HTTP/1.1
Host: example-bucket.storage.googleapis.com
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

アクセス トークンを管理したり更新したりするのは複雑であり、暗号化アプリケーションを直接扱うにはリスクがあるため、検証済みのクライアント ライブラリを使用することを強くおすすめします。

Amazon S3 との相互運用可能なアクセスのために XML API で使用するためのデベロッパー キーを探している場合は、単純な移行でのデベロッパー キーの管理をご覧ください。

Cookie ベースの認証

Cloud Storage では、Google アカウントは持っているが、Cloud Storage アカウントを持っているとは限らないユーザー向けに、ブラウザベースの認証によるダウンロードを行うことができます。そのためには、オブジェクトを含むバケットに Google アカウント ベースの IAM ポリシーを適用し、そのオブジェクトを範囲とする URL をユーザーに提供します。ブラウザベースの認証によるダウンロード用の URL は次のようになります:

https://storage.cloud.google.com/bucket/object

たとえば、Jane が example-travel-maps という名前のバケットにある /europe/france/paris.jpg という名前のオブジェクトをダウンロードできるようにするには、jane@gmail.com にバケット example-travel-mapsstorage.objects.get 権限を付与します。次に、Jane に次の URL を提供します。

https://storage.cloud.google.com/example-travel-maps/europe/france/paris.jpg

Jane がブラウザでこの URL をクリックすると、Jane の Google アカウントへのログインを求めるメッセージが自動的に表示されます(Jane がまだログインしていない場合)。Jane が認証され、Cookie とカプセル化された ID トークンをブラウザが取得すると、Jane は Cloud Storage リポジトリにあるオブジェクトにリダイレクトされます。Cloud Storage で Jane がオブジェクトの読み取りを許可されていることが確認されて、Jane のパソコンにオブジェクトがダウンロードされます。

次の図に、ブラウザベースの認証によるダウンロードの仕組みを示します。

Cookie 認証を示す図

サービス アカウント認証情報

サービス アカウントとは、ユーザーではなくソフトウェアを表す特殊なアカウントです。これは、アプリケーションが Google Cloud Storage を使用して認証するための最も一般的な方法です。各プロジェクトにはいくつかのサービス アカウントが関連付けられています。これらは、さまざまな認証シナリオで使用できるほか、署名付き URLPOST を使用したブラウザへのアップロードなど、高度な機能を有効にする場合にも使用することができます。

サービス アカウントを使用してアプリケーションを認証する場合は、ユーザーを認証してアクセス トークンを取得する必要はありません。代わりに、Google Cloud Platform Console から秘密鍵を取得でき、このキーを使用してアクセス トークンの署名付きリクエストを送信します。これで、通常と同じようにアクセス トークンを使用できます。詳細は、Google Cloud Platform Auth ガイドをご覧ください。

サービス アカウント認証情報の生成

サービス アカウントの OAuth クライアント ID を作成することにより、Cloud Platform Console で秘密鍵を作成できます。秘密鍵は、JSON 形式と PKCS12 形式で取得できます。

  • JSON 鍵は、Google Cloud Platform の外部の本番環境でアプリケーション デフォルト認証情報を使用する場合に必要です。JSON 鍵は他の形式に変換できません。
  • PKCS12 は、多くのプログラミング言語とライブラリでサポートされています。必要に応じて、OpenSSL を使って鍵を他の形式に変換できます(秘密鍵の他の形式への変換をご覧ください)。ただし、PKCS12 鍵は JSON 形式に変換できません。

JSON 形式か PKCS12 形式で秘密鍵を生成するには:

  1. Google Cloud Platform Console で認証情報のリストを開きます。

    認証情報のリストを開く

  2. [認証情報を作成する] をクリックします。
  3. [サービス アカウント キー] を選択します。

    [サービス アカウント キーの作成] ウィンドウが開きます。

  4. [サービス アカウント] の下にあるプルダウン ボックスをクリックし、[新しいサービス アカウント] をクリックします。
  5. [名前] にサービス アカウントの名前を入力します。
  6. デフォルトのサービス アカウント ID を使用するか、別の ID を作成します。
  7. [キーのタイプ] で JSON または P12 を選択します。
  8. [作成] をクリックします。

    [サービス アカウントの作成] ウィンドウが表示され、選択したキーのタイプの秘密鍵が自動的にダウンロードされます。P12 キーを選択した場合は、秘密鍵のパスワード(「notasecret」)が表示されます。

  9. [閉じる] をクリックします。

プロジェクトのセキュリティと ID の詳細については、Google Cloud Platform Console のヘルプをご覧ください。

サービス認証情報の詳細

サービス アカウントの OAuth クライアント ID は、認証に使用されるアカウントを一意に識別します。サービス アカウントのクライアント ID を作成した後(サービス アカウント認証情報の生成をご覧ください)、以下の情報が表示されます。

  • クライアント ID
  • メールアドレス
  • 証明書フィンガープリント

サービス アカウントには、クライアント IDメールアドレスの 2 つの ID があるので注意してください。署名付き URL(クエリ文字列認証)などの RSA 署名にはメールアドレスを使用する必要があります。

サービス アカウント認証情報の他の形式への変換

サービス アカウントのクライアント ID を作成し(サービス アカウント認証情報の生成をご覧ください)、秘密鍵を PKCS12 形式でダウンロードした後、OpenSSL を使って、必要に応じて鍵を他の形式に変換できます。たとえば、鍵を PKCS1(PEM)に変換するには、次のようにします。

# Convert the key from pkcs12 to pkcs1 (PEM).
cat /path/to/xxxx-privatekey.p12 | openssl pkcs12 -nodes -nocerts -passin pass:notasecret | openssl rsa > /path/to/secret.pem

次に、openssl を使って、データの署名ダイジェストを生成できます。

# Generate a signature digest using the PEM key.
openssl dgst -sign path/to/key.pem -sha256 path/to/data_to_sign | base64 -w0

また、openssl を使って PEM ファイル形式を DER 形式に変換することもできます。一部のライブラリ(PyCrypto など)では、鍵が DER 形式になっている必要があります。

# Convert the key from pkcs1 (PEM) to DER.
openssl rsa -in path/to/key.pem -inform PEM -out path/to/key.der -outform DER

JSON の秘密鍵は他の形式に変換できません。

ユーザー アカウント認証情報

認証のためのユーザー アカウント認証情報は、アプリケーションがユーザーの代わりにデータにアクセスする必要がある場合に使用します。それ以外の場合はサービス アカウント認証情報を使用します。以下は、ユーザー アカウント認証情報を使用できるシナリオの例です。

  • ウェブサーバー アプリケーション
  • インストールされたアプリケーションとデスクトップ アプリケーション
  • モバイルアプリ
  • クライアント側の JavaScript
  • 入力が限られた端末上のアプリケーション

これらのシナリオの詳細については、OAuth のシナリオをご覧ください。

エンドユーザー向けに複数の認証オプションをサポートするアプリケーションを設計している場合は、Firebase 認証を使用します。メールとパスワードによる認証に加えて、Google、Facebook、Twitter、GitHub などの ID プロバイダを使用した連携サインインがサポートされています。

ユーザー中心の認証フローで、エンドユーザーによりアクセス トークンが許可されている場合、そのアクセス トークンは、トークンを許可するユーザーが使用できる権限のみを持ちます。たとえば、jane@gmail.com が example-bucket への read-only アクセス権を持っている場合、Jane が read-write アクセスを許可したアプリケーションは、本人の代わりに example-bucket に対して書き込みを行うことはできません。

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

Cloud Storage ドキュメント