Spanner のきめ細かいアクセス制御は、Identity and Access Management(IAM)の利点と従来の SQL ロールベース アクセス制御を組み合わせたものです。きめ細かいアクセス制御では、データベース ロールを定義して、ロールに権限を付与し、IAM ポリシーを作成してデータベース ロールに対する権限を IAM プリンシパルに付与します。
管理者は、個々の IAM プリンシパルに対するきめ細かいアクセス制御を有効にする必要があります。きめ細かいアクセス制御が有効になっているプリンシパル(「きめ細かなアクセス制御ユーザー」)は、Spanner リソースにアクセスするためのデータベース ロールを想定する必要があります。
細かいアクセス制御ではないユーザーのためのリソース アクセスは、IAM データベース レベルのロールで管理されます。細かいアクセス制御は、完全な互換性をもって既存の IAM データベース レベルのアクセス制御と共存できます。 これを使用して、個々のデータベース オブジェクトにアクセスできます。データベース全体へのアクセスを制御するには、IAM ロールを使用します。
きめ細かいアクセス制御により、テーブル、列、ビュー、変更ストリームへのアクセスを制御できます。
きめ細かいアクセス制御を管理するには、次の DDL ステートメントを使用します。
- データベース ロールを作成および削除するための
CREATE
ステートメントおよびDROP
ステートメント。データベースのロールは、特権の集合です。1 つのデータベース用に最大 100 個のロールを作成できます。 データベース ロールへのおよびデータベース ロールからの権限を付与および取り消す
GRANT
ステートメントおよびREVOKE
ステートメント。権限には、SELECT
、INSERT
、UPDATE
、DELETE
、EXECUTE
などがあります。権限名は、同様の名前の SQL ステートメントに対応しています。たとえば、INSERT
権限を持つロールは、GRANT
ステートメントで指定されたテーブルに対してINSERT
SQL ステートメントを実行できます。次の DDL ステートメントは、テーブル
employees
に対するSELECT
をhr_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
ステートメント。
ユースケース
細かいアクセス制御のユースケース例を以下に示します。
- 販売報酬アナリスト、営業管理者、人事アナリストのロールそれぞれがデータに対して異なるアクセスレベルを持つ、人事情報システム。たとえば、販売報酬アナリストや営業管理者は社会保障番号を確認できません。
- 相乗りユーザーと運転手向けに異なるサービス アカウントと権限を持つライドシェアリング アプリケーション。
SELECT
とINSERT
オペレーションは許可されるが、UPDATE
とDELETE
オペレーションは許可されない台帳。
Spanner リソースとその権限
Spanner リソースと、それらに付与できるきめ細かいアクセス制御権限の一覧を次に示します。
- スキーマ
- スキーマに対する
USAGE
権限を特定のデータベース ロールに付与できます。デフォルト以外のスキーマの場合、データベース オブジェクトにアクセスするには、データベース ロールにUSAGE
権限が必要です。権限チェックは次のようになります。
スキーマに USAGE
があるか。
いいえ: アクセスを拒否します。
はい: テーブルの適切な権限をお持ちですか?
いいえ: アクセスを拒否します。
はい: テーブルにアクセスできます。
- テーブル
- テーブルに対する
SELECT
、INSERT
、UPDATE
、DELETE
の権限をデータベース ロールに付与できます。インターリーブされたテーブルの場合、親テーブルに付与された権限は子テーブルには伝播されません。 - 列
- テーブル内の列のサブセットに
SELECT
、INSERT
、UPDATE
を付与できます。そうすると、権限はそれらの列に対してのみ有効です。DELETE
は列レベルでは許可されません。 - ビュー
- ビューに対して
SELECT
権限を付与できます。ビューではSELECT
のみがサポートされます。Spanner は、呼び出し元の権限ビューと定義者の権限ビューの両方をサポートしています。呼び出し元の権限でビューを作成する場合、ビューにクエリを実行するには、データベース ロール、またはユーザーにビューのSELECT
権限とビューで参照される基になるオブジェクトへのSELECT
権限も必要です。定義者の権限でビューを作成する場合、ビューにクエリを実行するには、データベース ロール、またはユーザーにビューのSELECT
権限のみが必要です。詳細については、ビューの概要をご覧ください。 - 変更ストリーム
- 変更ストリームに
SELECT
を付与できます。また、変更ストリームに関連付けられた読み取り関数にEXECUTE
を付与する必要があります。詳細については、変更ストリームのきめ細かなアクセス制御をご覧ください。 - シーケンス
- シーケンスに
SELECT
とUPDATE
を付与できます。詳細については、シーケンスのきめ細かいアクセス制御をご覧ください。 - モデル
- モデルに
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_manager
と hr_director
は、ロール pii_access
のメンバーであり、テーブル employees
に対する SELECT
権限を継承します。
hr_manager
と hr_director
には、メンバーを含めることができ、それらのメンバーは employees
の SELECT
権限を継承します。
ロール階層の深さに制限はありませんが、深くて広い階層構造ではクエリのパフォーマンスが低下する可能性があります。
バックアップと復元
Spanner バックアップには、データベース ロールの定義が含まれます。データベースをバックアップから復元すると、付与されたロールでデータベース ロールが再作成されます。ただし、IAM ポリシーはデータベース バックアップの一部ではないため、復元したデータベースのプリンシパルにデータベース ロールへのアクセス権を再付与する必要があります。
細かいアクセス制御の設定の概要
きめ細かいアクセス制御によってデータの保護を開始するための大まかな手順は次のとおりです。詳細については、細かいアクセス制御の構成をご覧ください。
これらのタスクを実行するには、roles/spanner.admin
または roles/spanner.databaseAdmin
IAM ロールが付与されている必要があります。
- データベース ロールを作成し、そのロールに権限を付与します。
- 省略可: 他のロールにロールを付与して、継承されたロールの階層を作成します。
- 細かいアクセス制御ユーザーとなるプリンシパルごとに、次の手順を実行します。
- プリンシパルに対する細かいアクセス制御を有効にします。その後、プリンシパルには
public
データベース ロールが自動的に付与されます。このロールには、デフォルトで権限はありません。これは、プリンシパルごとに 1 回だけ行うオペレーションです。 - 1 つ以上のデータベース ロールに対する IAM 権限をプリンシパルに付与します。
- プリンシパルに必要なすべてのデータベース ロールが付与された後、プリンシパルにデータベース レベルの IAM ロールがある場合は、データベース レベルのロールを取り消すことで、プリンシパルのアクセス制御が 1 つの方法のみによって管理されるようにすることを検討してください。
- プリンシパルに対する細かいアクセス制御を有効にします。その後、プリンシパルには
制限事項
- エクスポート オペレーションでは、データベースのロールと権限はエクスポートされません。インポート オペレーションでは、それらをインポートできません。インポートが完了したら、ロールと権限を手動で設定する必要があります。
- Google Cloud コンソールで、[テーブル] ページの [データ] タブでは、細かいアクセス制御ユーザーを使用できません。
UPDATE
オペレーションとDELETE
オペレーションでは、すべてのキー列に対してSELECT
が必要です。
次のステップ
詳しくは以下をご覧ください。
- きめ細かいアクセス制御でデータベースにアクセスする
- 変更ストリームのきめ細かいアクセス制御
- 細かいアクセス制御を構成する
- 細かいアクセス制御の権限のリファレンス
- 細かいアクセス制御システムロール
- GoogleSQL の
GRANT
ステートメントとREVOKE
ステートメント - PostgreSQL の
GRANT
ステートメントおよびREVOKE
ステートメント - シーケンスのきめ細かいアクセス制御
- モデルのきめ細かいアクセス制御