コンテンツに移動
Spanner

Spanner でデータを保護する新しい方法として Cloud Spanner にきめ細かなアクセス制御を導入

2022年9月27日
Google Cloud Japan Team

※この投稿は米国時間 2022 年 9 月 16 日に、Google Cloud blog に投稿されたものの抄訳です。

無制限のスケーリング、強整合性、最大 99.999% の可用性を備えた Google Cloud のフルマネージド リレーショナル データベースとして、Cloud Spanner は金融サービス、ゲーム、小売、ヘルスケアなどの業界におけるあらゆる規模のアプリケーションを強化します。本日、Spanner 向けのきめ細かなアクセス制御のプレビューを発表します。この機能により、Spanner のデータへのアクセスをテーブルと列のレベルで承認することが可能になります。また、きめ細かなアクセス制御により、Spanner でトランザクション データを保護し、データへのアクセスを許可する際に適切な制御を行うことが、これまで以上に容易になります。

この投稿では、Spanner の現在のアクセス制御モデルできめ細かいアクセス制御のユースケースを検討します。また、Spanner アプリケーションで、この新しい機能を使用する方法についても見ていきます。

Spanner のアクセス制御モデルの現在

Spanner では、Identity and Access Management(IAM)によるアクセス制御を利用できます。IAM によって、Google Cloud のすべてのサービスにシンプルで一貫性のあるアクセス制御インターフェースが提供されています。組み込みの監査証跡やコンテキストアウェア アクセスなどの機能により、Spanner のユーザーに対してインスタンスおよびデータベース レベルの権限を簡単に付与できます。

IAM のモデルは、次の 3 つの主要な要素で構成されています。

  • ロール。ロールは権限の集合です。Spanner ではこれらの権限により、Spanner のプロジェクト、インスタンス、またはデータベースに対して特定のアクションを実行できます。たとえば、spanner.instances.create は新しいインスタンスを作成し、spanner.databases.select ではデータベースに対して SQL の select ステートメントを実行できます。Spanner には利便性を目的に、spanner.databases.readspanner.databases.write の権限を持つ roles/spanner.databaseUser などの事前定義ロールが用意されていますが、独自のカスタムロールを定義することもできます。

  • IAM プリンシパル。プリンシパルは、リソースへのアクセスが許可されている Google アカウント(エンドユーザー向け)、サービス アカウント(アプリケーションまたはコンピューティング ワークロード向け)、Google グループ、Google Workspace アカウントです。各プリンシパルには、一意の識別子(通常はメールアドレス)があります。

  • ポリシー。許可ポリシーは、1 つ以上のプリンシパルを個々のロールにバインドするロール バインディングの集合です。たとえば、roles/spanner.databaseReader を IAM プリンシパル user@abc.xyz にバインドできます。

より強固なアクセス制御の必要性

データベース レベルよりも詳細なレベルでロールを定義する必要があるユースケースが数多くあります。その一部を見てみましょう。

台帳アプリケーション

台帳は、在庫管理、暗号通貨、銀行のアプリケーションに有用で、在庫レベルを調べ、既存の残高に貸方や借方などの更新を適用できます。台帳アプリケーションでは、残高の確認、在庫の追加、在庫の削除ができますが、先週に戻って、在庫レベルを 500 ウィジェットに調整することはできません。これは、SELECT権限(残高の確認)と INSERT 権限(在庫の追加または削除)はあるものの、UPDATE 権限や DELETE 権限はないことを意味します。

アナリティクス ユーザー

アナリティクス ユーザーは Spanner データベースのいくつかのテーブルへの SELECT アクセスを必要とすることがよくあります。しかし、データベースのすべてのテーブルへのアクセス権を持つ必要はありません。また、データベース内のものに対して、INSERTUPDATE または DELETE のアクセス権を持つ必要もありません。これは、データベース内のすべてのテーブルではなく、一部のテーブルに対して SELECT 権限を持つことに相当します。

サービス アカウント

サービス アカウントは特別なタイプの Google アカウントで、Google Cloud のデータにアクセスして認証を受ける必要がある人間以外のユーザーを表します。Spanner のそれぞれのサービス アカウントは、データベース内の特定のテーブルに対して独自の権限を持つ必要があると考えられます。たとえば、ライドシェアリングのアプリケーションで、運転手と乗客のサービス アカウントがある場合を考えてみましょう。運転手のサービス アカウントには、乗客のプロファイル テーブルの特定の列(ユーザーのファースト ネーム、プロフィール写真など)の SELECT 権限が必要で、乗客のメールアドレスやその他の個人情報の更新は許可されるべきではありません。

Spanner におけるきめ細かなアクセス制御の基本

他のリレーショナル データベースにおけるロールベースのアクセス制御に慣れている方は、Spanner におけるきめ細かいアクセス制御の重要なコンセプトをよくご存じのはずです。Spanner におけるきめ細かなアクセス制御のモデルを確認してみましょう。

  • データベース権限。Spanner は SELECTINSERTUPDATEDELETE の 4 種類の権限をサポートするようになりました。SELECTINSERTUPDATEDELETE 権限をテーブルに、SELECTINSERT、および UPDATE 権限をテーブルまたは列に適用できます。

  • データベース ロール。データベースのロールは、特権の集合です。たとえば、inventory_admin というロールが付与されている場合、SELECT 権限と INSERT 権限を Inventory_Transactions テーブルに対して適用し、SELECT 権限、INSERT 権限、UPDATE 権限、DELETE 権限をプロダクトの表に対して適用できます。

Spanner では ID とアクセスの管理に IAM が使用されているため、条件付きロール バインディングを管理することによって、適切な IAM プリンシパルにデータベース ロールを割り当てる必要があります。

例を見てみましょう。IAM プリンシパル user@abc.xyzInventory_TransactionsProducts の 2 つのテーブルにきめ細かくアクセスできるように設定するとします。そのために、inventory_admin というデータベース ロールを作成し、このロールを user@abc.xyz に付与します。

ステップ 1: IAM プリンシパルを Cloud Spanner のきめ細かいアクセス制御ユーザーとして設定する

今日まで、IAM プリンシパルにデータベース レベルのアクセスを付与したい場合、roles/spanner.databaseUser ロール、またはそのロールにバンドルされている特権のいずれかを付与する必要がありました。きめ細かいアクセス制御では、代わりに IAM プリンシパルに Cloud Spanner のきめ細かいアクセス制御ユーザーロール(roles/spanner.fineGrainedAccessUser)を付与できるようになりました。
https://storage.googleapis.com/gweb-cloudblog-publish/images/filter_spanner_db.max-1200x1200.jpg

Cloud Spanner のきめ細かいアクセス制御ユーザーは、データベースへの API 呼び出しを許可しますが、public ロールに付与された以外のデータアクセス権限は付与されません。デフォルトでは、public ロールは何の権限も持っておらず、このロールはデータベースへの API 呼び出しを行うためのアクセス権のみを付与しています。データにアクセスするには、きめ細かいアクセス制御ユーザーが希望するデータベース ロールを指定する必要があります。

ステップ 2: データベースのロールを作成する

ロールを作成するには、標準 SQL の CREATE ROLE コマンドを実行します。

CREATE ROLE inventory_admin;

新しく作成されたデータベース ロールは、projects/<project_name>/instances/<instance_name>/databases/<database_name>/databaseRoles/inventory_admin というリソース URI で IAM ポリシーから参照可能です。後ほど、特定の IAM プリンシパルの権限をデータベース ロールとして付与する IAM ポリシーの構成方法を紹介します。

ステップ 3: データベース ロールに権限を割り当てる

次に、このロールに適切な権限を割り当てます。

読み込んでいます...

これらのステートメントは個別に実行することもできますが、Cloud Spanner DDL ステートメントを 1 つのバッチで発行することをおすすめします。

https://storage.googleapis.com/gweb-cloudblog-publish/images/Cloud_Spanner_DDL_statements.max-600x600.jpg

ステップ 4: IAM プリンシパルにロールを割り当てる

最後に user@abc.xyz がデータベース ロール inventory_admin として機能するように、Cloud Spanner データベース ロールのユーザーをデータベース ロールを条件として user@abc.xyz に付与します。これを行うには、データベースの IAM 情報パネルを開き、IAM 条件エディタを使用して次の条件を追加します。

  • resource.type == “spanner.googleapis.com/DatabaseRole” &&
    resource.name.endsWith(“/inventory_admin”)

  • また、このデータベース ロールのアクセスをさらに制限するために、時間帯、曜日、有効期限でアクセスをスケジュールするなどの条件を追加することが可能。
https://storage.googleapis.com/gweb-cloudblog-publish/images/condition_editor.max-2000x2000.jpg

きめ細かなアクセス制御への移行

きめ細かいアクセス制御に移行する際は、roles/spanner.databaseUserroles/spanner.fineGrainedAccessUser の両方を IAM プリンシパルに割り当てることをおすすめします。IAM プリンシパルをきめ細かい権限に切り替える準備ができたら、IAM プリンシパルから databaseUser ロールを削除するだけです。

エンドユーザーとしてロールを利用する

エンドユーザーが Spanner にログインすると、付与されたロールを使って、Google Cloud コンソールや gcloud コマンドからデータベースにアクセスできます。また、Go、Java、Node.js、Python のクライアント ライブラリがサポートされているほか、近日中にこのサポートの対象が増える予定です。

詳細

きめ細かなアクセス制御により、ユーザーやロール、所属する組織に応じて、Spanner データベースへのアクセス権を設定できます。現在のプレビュー版では、きめ細かいアクセス制御を追加料金なしで Spanner のすべてのお客様にご利用いただけます。

- Spanner プロダクト マネージャー Mark Donsky

投稿先