コンテンツに移動
データベース

Spanner スケールでのきめ細かいアクセス制御の管理

2023年5月17日
Google Cloud Japan Team

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

Cloud Spanner は、強整合性、優れたスケーラビリティ、最大 99.999% の可用性を備えた Google Cloud のフルマネージド リレーショナル データベースで、金融サービス、ゲーム、小売、ヘルスケアなどの業界におけるあらゆる規模のアプリケーションで活用されています。

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

しかし、在庫台帳や分析など、データベース レベルよりもさらに細かいレベルでのロールを必要とするユースケースも数多くあります。このため、Google では数か月前に、スキーマ オブジェクトの粒度でのアクセス制御を可能にする、Spanner 向けのきめ細やかなアクセス制御(FGAC)のプレビュー版をリリースしました。FGAC は、テーブル、列、ビュー、変更ストリームに対するアクセス権を提供することで、これらのユースケースに対応します。

そしてこのたび、Spanner 向け FGAC の一般提供を開始いたします。FGAC は、Identity and Access Management(IAM)のメリットと、従来の SQL ロールベースのアクセス制御を組み合わせたものです。

Spanner でのきめ細かいアクセス制御の詳細については、Cloud Spanner ロールベースのアクセス制御をご覧ください。このブログでは、スキーマ オブジェクトへのきめ細かいアクセスの設定方法、および在庫台帳アプリケーションの使用における権限の問題のトラブルシューティングについて紹介します。

使ってみる

データベースとスキーマを設定する

ここでは Terraform を使用して Cloud Spanner データベースとその IAM ポリシーを管理します。Spanner での Terraform の使用にまだ不慣れな場合は、Terraform を使用した Cloud Spanner の Codelab および Terraform を使用した Cloud Spanner のプロビジョニング ブログをご覧ください。インスタンスのプロビジョニングや、データベースの作成と変更について詳しく説明しています。

まず、Cloud Spanner のインスタンスとデータベースを作成する Terraform 構成を作成します(存在しない場合)。構成内の PROJECT_NAMEINSTANCE_IDDATABASE_NAME を置き替えます。これで GoogleSQL 言語データベースが作成されます。
読み込んでいます...

次に、データベース スキーマに必要なテーブルを作成します。使用するアプリケーション スキーマには 2 つのテーブル、ProductInventoryLedger があります。Terraform でサポートされるスキーマ管理は限られているため、スキーマ管理には Liquibase のようなスキーマ バージョニング ツールを使用することをおすすめします。

読み込んでいます...

きめ細かいロールと権限を設定する

次の表に示すように、アプリケーションにはデータベースに対するさまざまなレベルのアクセス権を持つ複数のユーザーがあります。

https://storage.googleapis.com/gweb-cloudblog-publish/images/1_Managing_Fine-Grained_Access.max-1300x1300.png

次に、データベース ロールを作成して、それらに必要な権限を付与しましょう。そのためには、次の DDL ステートメントを実行します。なお、spanner_sys_reader は Cloud Spanner で事前定義されているシステムロールで、SPANNER_SYS スキーマ内のすべてのテーブルに対する読み取りアクセス権を付与します。

読み込んでいます...

上記の DDL ステートメントにより、次のロールと権限の設定が作成されます。

  • データベース ロール product_admin は、SELECT 権限、INSERT 権限、UPDATE 権限、DELETE 権限を PRODUCT テーブルに対して適用します。

  • データベース ロール inventory_viewer は、SELECT 権限を InventoryLedger テーブルに対して適用します。

  • データベース ロール inventory_manager は、SELECT 権限と INSERT 権限を InventoryLedger テーブルに対して適用します。SELECT 権限は、inventory_viewer ロールから継承されます。

  • データベース ロール inventory_superuser は、SELECT 権限、INSERT 権限、UPDATE 権限、DELETE 権限を InventoryLedger テーブルに対して適用します。SELECT 権限と INSERT 権限は、inventory_manager ロールから継承されます。

https://storage.googleapis.com/gweb-cloudblog-publish/images/2_Managing_Fine-Grained_Access.max-1000x1000.png

きめ細かいアクセス制御ユーザーを設定する

次に、IAM プリンシパル(ユーザー、サービス アカウント、グループ、ワークスペース アカウント、Cloud Identity ドメイン)がデータベースに対するきめ細かいアクセス権を持つように設定します(「きめ細かいアクセス制御ユーザー」)。ドキュメントに記載されているように、IAM ポリシーは gcloud または Google Cloud コンソールで管理することもできます。
https://storage.googleapis.com/gweb-cloudblog-publish/images/3_Managing_Fine-Grained_Access.max-800x800.png
読み込んでいます...

条件付き IAM ポリシー バインディングでは、次のように、完全修飾されたデータベース ロール名を指定することもできます。

読み込んでいます...

これで、ユーザー:tim@example.com は次のようにしてデータを読み取ることができるようになりました。

読み込んでいます...

きめ細かいアクセスの IAM 権限に関するトラブルシューティング

きめ細かいアクセス制御ユーザーである IAM プリンシパルを検索する

データベースに対するきめ細かいアクセス制御ユーザーとして設定されている IAM プリンシパルのリストを表示するには、以下のコマンドを使用します。このコマンドを実行するには、プロジェクトで Cloud Asset API を有効にしており、かつ IAM 権限 cloudasset.assets.searchAllIamPolicies を持っている必要があります。
読み込んでいます...

inventory_manager ロールを持つ IAM プリンシパルを検索する

特定のデータベース ロールへのアクセス権を持つ IAM プリンシパルのリストを表示するには、以下のコマンドを使用します。このコマンドを実行するには、プロジェクトで Cloud Asset API を有効にしており、かつ IAM 権限 cloudasset.assets.searchAllIamPolicies を持っている必要があります。

読み込んでいます...

IAM プリンシパルのアクセスを構成するための IAM 条件を表示する

ユーザー「user:mark@example.com」のアクセス権に関する問題のトラブルシューティングを行うには、このユーザーのアクセスを構成するために設定されている条件付きバインディングを表示することをおすすめします。このコマンドを実行するには、プロジェクトで Cloud Asset API を有効にしており、かつ IAM 権限 cloudasset.assets.searchAllIamPolicies を持っている必要があります。

IAM 条件は endsWith 演算子(”resource.name.endsWith('/inventory_viewer')” など)を使用して指定されることがあり、ユーザーがアクセス権を持つ実際のデータベース ロール名を返さない場合があることにご注意ください。
読み込んでいます...

きめ細かいアクセス権限の管理とトラブルシューティング

次のいくつかのシナリオでは、より興味深いロール階層について考えてみましょう。この例では、ロール two と three は、ロール one から権限を継承します。同様に、ロール eight はロール one、three、seven から継承します。{} で囲まれた権限は、親 / 祖先から継承されます。そのため、INSERTUPDATE が、ロール seven に直接付与され、ロール seven は SELECT をその親(ロール three)から継承します。このシナリオでは、Users テーブルに対するすべての権限が付与されます。
https://storage.googleapis.com/gweb-cloudblog-publish/images/4_Managing_Fine-Grained_Access.max-1300x1300.png

ロール seven が権限を継承するすべてのデータベース ロールを検索する

このコマンドを実行するには、IAM ロール roles/spanner.admin または roles/spanner.databaseAdmin、あるいはデータベース ロール seven へのアクセス権が必要です。roles/spanner.admin および roles/spanner.databaseAdmin では、クエリを任意のデータベース ロールとして実行できます。

読み込んでいます...

Users テーブルに対するロール eight のすべての権限を検索する

このコマンドを実行するには、IAM ロール roles/spanner.admin または roles/spanner.databaseAdmin、あるいはデータベース ロール eight へのアクセス権が必要です。
読み込んでいます...

制限事項

Cloud Spanner は、再帰的な共通テーブル式(CTE)をサポートしていません。そのため、簡単なクエリで「どのロールがテーブルに対して SELECT 権限(継承を含む)を持つか」を見つけたり、「ロール foo から権限を継承するすべてのロールを検索」したりすることはできません。このような情報を見つけるには、代わりに、これを INFORMATION_SCHEMA.TABLE_PRIVILEGESINFORMATION_SCHEMA.ROLE_GRANTEES に対する複数のクエリに分割します。

Spanner できめ細かいアクセス制御を開始する

きめ細かいアクセス制御は、 IAM の利点と従来の SQL ロールベースのアクセス制御を組み合わせることで、強力で洗練された、より柔軟な認証モデルを提供します。きめ細かいアクセス制御により、在庫台帳、バンキング アプリケーション、分析など、より詳細なレベルでのアクセス制御を必要とする重要なユースケースの可能性が広がります。今日からすぐにお試しいただけます。


- Google Cloud シニア ソフトウェア エンジニア Harshit Mehrotra
投稿先