Spanner でデータを保護する新しい方法として Cloud Spanner にきめ細かなアクセス制御を導入
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.read
とspanner.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
アクセスを必要とすることがよくあります。しかし、データベースのすべてのテーブルへのアクセス権を持つ必要はありません。また、データベース内のものに対して、INSERT
、UPDATE
または DELETE
のアクセス権を持つ必要もありません。これは、データベース内のすべてのテーブルではなく、一部のテーブルに対して SELECT
権限を持つことに相当します。
サービス アカウント
サービス アカウントは特別なタイプの Google アカウントで、Google Cloud のデータにアクセスして認証を受ける必要がある人間以外のユーザーを表します。Spanner のそれぞれのサービス アカウントは、データベース内の特定のテーブルに対して独自の権限を持つ必要があると考えられます。たとえば、ライドシェアリングのアプリケーションで、運転手と乗客のサービス アカウントがある場合を考えてみましょう。運転手のサービス アカウントには、乗客のプロファイル テーブルの特定の列(ユーザーのファースト ネーム、プロフィール写真など)の SELECT
権限が必要で、乗客のメールアドレスやその他の個人情報の更新は許可されるべきではありません。
Spanner におけるきめ細かなアクセス制御の基本
他のリレーショナル データベースにおけるロールベースのアクセス制御に慣れている方は、Spanner におけるきめ細かいアクセス制御の重要なコンセプトをよくご存じのはずです。Spanner におけるきめ細かなアクセス制御のモデルを確認してみましょう。
データベース権限。Spanner は
SELECT
、INSERT
、UPDATE
、DELETE
の 4 種類の権限をサポートするようになりました。SELECT
、INSERT
、UPDATE
、DELETE
権限をテーブルに、SELECT
、INSERT
、およびUPDATE
権限をテーブルまたは列に適用できます。データベース ロール。データベースのロールは、特権の集合です。たとえば、
inventory_admin
というロールが付与されている場合、SELECT
権限とINSERT
権限をInventory_Transactions
テーブルに対して適用し、SELECT
権限、INSERT
権限、UPDATE
権限、DELETE
権限をプロダクトの表に対して適用できます。
Spanner では ID とアクセスの管理に IAM が使用されているため、条件付きロール バインディングを管理することによって、適切な IAM プリンシパルにデータベース ロールを割り当てる必要があります。
例を見てみましょう。IAM プリンシパル user@abc.xyz
が Inventory_Transactions
と Products
の 2 つのテーブルにきめ細かくアクセスできるように設定するとします。そのために、inventory_admin
というデータベース ロールを作成し、このロールを user@abc.xyz
に付与します。
ステップ 1: IAM プリンシパルを Cloud Spanner のきめ細かいアクセス制御ユーザーとして設定する
今日まで、IAM プリンシパルにデータベース レベルのアクセスを付与したい場合、roles/spanner.databaseUser ロール、またはそのロールにバンドルされている特権のいずれかを付与する必要がありました。きめ細かいアクセス制御では、代わりに IAM プリンシパルに Cloud Spanner のきめ細かいアクセス制御ユーザーロール(roles/spanner.fineGrainedAccessUser
)を付与できるようになりました。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 つのバッチで発行することをおすすめします。
ステップ 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”)
- また、このデータベース ロールのアクセスをさらに制限するために、時間帯、曜日、有効期限でアクセスをスケジュールするなどの条件を追加することが可能。
きめ細かなアクセス制御への移行
きめ細かいアクセス制御に移行する際は、roles/spanner.databaseUser
と roles/spanner.fineGrainedAccessUser
の両方を IAM プリンシパルに割り当てることをおすすめします。IAM プリンシパルをきめ細かい権限に切り替える準備ができたら、IAM プリンシパルから databaseUser ロールを削除するだけです。
エンドユーザーとしてロールを利用する
エンドユーザーが Spanner にログインすると、付与されたロールを使って、Google Cloud コンソールや gcloud コマンドからデータベースにアクセスできます。また、Go、Java、Node.js、Python のクライアント ライブラリがサポートされているほか、近日中にこのサポートの対象が増える予定です。
詳細
きめ細かなアクセス制御により、ユーザーやロール、所属する組織に応じて、Spanner データベースへのアクセス権を設定できます。現在のプレビュー版では、きめ細かいアクセス制御を追加料金なしで Spanner のすべてのお客様にご利用いただけます。
Spanner の使用を始めるには、インスタンスを作成するか、Spanner Qwiklab で試してみるか、無料のトライアル インスタンスを作成する
Spanner できめ細かいアクセス制御を始めるには、About fine-grained access control(きめ細かいアクセス制御について)を確認するか、Google Cloud コンソールの Write DDL statements から直接アクセスする
- Spanner を始めるには、インスタンスを作成するか、無料で試用するか、Spanner の Qwiklabs を受講する
- Spanner プロダクト マネージャー Mark Donsky