きめ細かいアクセス制御の概要

Spanner のきめ細かいアクセス制御は、Identity and Access Management(IAM)の利点と従来の SQL ロールベース アクセス制御を組み合わせたものです。きめ細かいアクセス制御では、データベース ロールを定義して、ロールに権限を付与し、IAM ポリシーを作成してデータベース ロールに対する権限を IAM プリンシパルに付与します。

管理者は、個々の IAM プリンシパルに対するきめ細かいアクセス制御を有効にする必要があります。きめ細かいアクセス制御が有効になっているプリンシパル(「きめ細かなアクセス制御ユーザー」)は、Spanner リソースにアクセスするためのデータベース ロールを想定する必要があります。

細かいアクセス制御ではないユーザーのためのリソース アクセスは、IAM データベース レベルのロールで管理されます。細かいアクセス制御は、完全な互換性をもって既存の IAM データベース レベルのアクセス制御と共存できます。 これを使用して、個々のデータベース オブジェクトにアクセスできます。データベース全体へのアクセスを制御するには、IAM ロールを使用します。

きめ細かいアクセス制御により、テーブル、列、ビュー、変更ストリームへのアクセスを制御できます。

きめ細かいアクセス制御を管理するには、次の DDL ステートメントを使用します。

  • データベース ロールを作成および削除するための CREATE ステートメントおよび DROP ステートメント。データベースのロールは、特権の集合です。1 つのデータベース用に最大 100 個のロールを作成できます。
  • データベース ロールへのおよびデータベース ロールからの権限を付与および取り消す GRANT ステートメントおよび REVOKE ステートメント。権限には、SELECTINSERTUPDATEDELETEEXECUTE などがあります。権限名は、同様の名前の SQL ステートメントに対応しています。たとえば、INSERT 権限を持つロールは、GRANT ステートメントで指定されたテーブルに対して INSERT SQL ステートメントを実行できます。

    次の DDL ステートメントは、テーブル employees に対する SELECThr_rep データベース ロールに付与します。

    GoogleSQL

    CREATE ROLE hr_rep;
    GRANT SELECT ON TABLE employees TO ROLE hr_rep;
    

    PostgreSQL

    CREATE ROLE hr_rep;
    GRANT SELECT ON TABLE employees TO hr_rep;
    

    権限の詳細については、細かいアクセス制御の権限のリファレンスをご覧ください。

  • 他のロールにロールを付与してロールの階層を作成し、権限を継承できるようにする GRANT ステートメント。

ユースケース

細かいアクセス制御のユースケース例を以下に示します。

  • 販売報酬アナリスト、営業管理者、人事アナリストのロールそれぞれがデータに対して異なるアクセスレベルを持つ、人事情報システム。たとえば、販売報酬アナリストや営業管理者は社会保障番号を確認できません。
  • 相乗りユーザーと運転手向けに異なるサービス アカウントと権限を持つライドシェアリング アプリケーション。
  • SELECTINSERT オペレーションは許可されるが、UPDATEDELETE オペレーションは許可されない台帳。

Spanner リソースとその権限

Spanner リソースと、それらに付与できるきめ細かいアクセス制御権限の一覧を次に示します。

スキーマ
スキーマに対する USAGE 権限を特定のデータベース ロールに付与できます。デフォルト以外のスキーマの場合、データベース オブジェクトにアクセスするには、データベース ロールに USAGE 権限が必要です。権限チェックは次のようになります。

スキーマに USAGE があるか。

いいえ: アクセスを拒否します。

はい: テーブルの適切な権限をお持ちですか?

いいえ: アクセスを拒否します。

はい: テーブルにアクセスできます。

テーブル
テーブルに対する SELECTINSERTUPDATEDELETE の権限をデータベース ロールに付与できます。インターリーブされたテーブルの場合、親テーブルに付与された権限は子テーブルには伝播されません。
テーブル内の列のサブセットに SELECTINSERTUPDATE を付与できます。そうすると、権限はそれらの列に対してのみ有効です。DELETE は列レベルでは許可されません。
ビュー
ビューに対して SELECT 権限を付与できます。ビューでは SELECT のみがサポートされます。Spanner は、呼び出し元の権限ビューと定義者の権限ビューの両方をサポートしています。呼び出し元の権限でビューを作成する場合、ビューにクエリを実行するには、データベース ロール、またはユーザーにビューの SELECT 権限とビューで参照される基になるオブジェクトへの SELECT 権限も必要です。定義者の権限でビューを作成する場合、ビューにクエリを実行するには、データベース ロール、またはユーザーにビューの SELECT 権限のみが必要です。詳細については、ビューの概要をご覧ください。
変更ストリーム
変更ストリームに SELECT を付与できます。また、変更ストリームに関連付けられた読み取り関数に EXECUTE を付与する必要があります。詳細については、変更ストリームのきめ細かなアクセス制御をご覧ください。
シーケンス
シーケンスに SELECTUPDATE を付与できます。詳細については、シーケンスのきめ細かいアクセス制御をご覧ください。
モデル
モデルに EXECUTE を付与できます。詳細については、モデルのきめ細かいアクセス制御をご覧ください。

細かいアクセス制御システムロール

きめ細かいアクセス制御では、データベースごとに事前定義されたシステムロールがあります。ユーザー定義のデータベース ロールと同様に、システムロールも Spanner リソースへのアクセスを制御できます。

たとえば、きめ細かいアクセス制御ユーザーに spanner_sys_reader システムロールを付与して Key Visualizer にアクセスする必要があり、INFORMATION_SCHEMA テーブルをクエリする時に、spanner_info_reader システムのロールがフィルタされていない結果を表示できるようにする必要があります。

詳細については、きめ細かいアクセス制御システムロールをご覧ください。

データベース ロールの階層と継承

データベース ロールの階層を作成すると、子ロールが親ロールの権限を継承します。子のロールは、親のロールのメンバーと呼ばれます。

たとえば、次の GRANT ステートメントについて考えてみましょう。

GoogleSQL

GRANT SELECT ON TABLE employees TO ROLE pii_access;
GRANT ROLE pii_access TO ROLE hr_manager, hr_director;

PostgreSQL

GRANT SELECT ON TABLE employees TO pii_access;
GRANT pii_access TO hr_manager, hr_director;

hr_managerhr_director は、ロール pii_access のメンバーであり、テーブル employees に対する SELECT 権限を継承します。

権限の継承

hr_managerhr_director には、メンバーを含めることができ、それらのメンバーは employeesSELECT 権限を継承します。

ロール階層の深さに制限はありませんが、深くて広い階層構造ではクエリのパフォーマンスが低下する可能性があります。

バックアップと復元

Spanner バックアップには、データベース ロールの定義が含まれます。データベースをバックアップから復元すると、付与されたロールでデータベース ロールが再作成されます。ただし、IAM ポリシーはデータベース バックアップの一部ではないため、復元したデータベースのプリンシパルにデータベース ロールへのアクセス権を再付与する必要があります。

細かいアクセス制御の設定の概要

きめ細かいアクセス制御によってデータの保護を開始するための大まかな手順は次のとおりです。詳細については、細かいアクセス制御の構成をご覧ください。

これらのタスクを実行するには、roles/spanner.admin または roles/spanner.databaseAdmin IAM ロールが付与されている必要があります。

  1. データベース ロールを作成し、そのロールに権限を付与します。
  2. 省略可: 他のロールにロールを付与して、継承されたロールの階層を作成します。
  3. 細かいアクセス制御ユーザーとなるプリンシパルごとに、次の手順を実行します。
    1. プリンシパルに対する細かいアクセス制御を有効にします。その後、プリンシパルには public データベース ロールが自動的に付与されます。このロールには、デフォルトで権限はありません。これは、プリンシパルごとに 1 回だけ行うオペレーションです。
    2. 1 つ以上のデータベース ロールに対する IAM 権限をプリンシパルに付与します。
    3. プリンシパルに必要なすべてのデータベース ロールが付与された後、プリンシパルにデータベース レベルの IAM ロールがある場合は、データベース レベルのロールを取り消すことで、プリンシパルのアクセス制御が 1 つの方法のみによって管理されるようにすることを検討してください。

制限事項

  • エクスポート オペレーションでは、データベースのロールと権限はエクスポートされません。インポート オペレーションでは、それらをインポートできません。インポートが完了したら、ロールと権限を手動で設定する必要があります。
  • Google Cloud コンソールで、[テーブル] ページの [データ] タブでは、細かいアクセス制御ユーザーを使用できません。
  • UPDATE オペレーションと DELETE オペレーションでは、すべてのキー列に対して SELECT が必要です。

次のステップ

詳しくは以下をご覧ください。