Spanner スケールでのきめ細かいアクセス制御の管理
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_NAME
、INSTANCE_ID
、DATABASE_NAME
を置き替えます。これで GoogleSQL 言語データベースが作成されます。次に、データベース スキーマに必要なテーブルを作成します。使用するアプリケーション スキーマには 2 つのテーブル、Product
と InventoryLedger
があります。Terraform でサポートされるスキーマ管理は限られているため、スキーマ管理には Liquibase のようなスキーマ バージョニング ツールを使用することをおすすめします。
きめ細かいロールと権限を設定する
次の表に示すように、アプリケーションにはデータベースに対するさまざまなレベルのアクセス権を持つ複数のユーザーがあります。
次に、データベース ロールを作成して、それらに必要な権限を付与しましょう。そのためには、次の 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
ロールから継承されます。
きめ細かいアクセス制御ユーザーを設定する
次に、IAM プリンシパル(ユーザー、サービス アカウント、グループ、ワークスペース アカウント、Cloud Identity ドメイン)がデータベースに対するきめ細かいアクセス権を持つように設定します(「きめ細かいアクセス制御ユーザー」)。ドキュメントに記載されているように、IAM ポリシーは gcloud または Google Cloud コンソールで管理することもできます。条件付き 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 から継承します。{} で囲まれた権限は、親 / 祖先から継承されます。そのため、INSERT
と UPDATE
が、ロール seven に直接付与され、ロール seven は SELECT
をその親(ロール three)から継承します。このシナリオでは、Users
テーブルに対するすべての権限が付与されます。ロール 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_PRIVILEGES
と INFORMATION_SCHEMA.ROLE_GRANTEES
に対する複数のクエリに分割します。
Spanner できめ細かいアクセス制御を開始する
きめ細かいアクセス制御は、 IAM の利点と従来の SQL ロールベースのアクセス制御を組み合わせることで、強力で洗練された、より柔軟な認証モデルを提供します。きめ細かいアクセス制御により、在庫台帳、バンキング アプリケーション、分析など、より詳細なレベルでのアクセス制御を必要とする重要なユースケースの可能性が広がります。今日からすぐにお試しいただけます。
Spanner を始めるには、データベースを作成するか、Spanner の Qwiklab でお試しください。
きめ細かいアクセス制御の詳細については、Cloud Spanner ロールベースのアクセス制御、またはドキュメントをご覧ください。
- Google Cloud シニア ソフトウェア エンジニア Harshit Mehrotra