このページでは、Cloud Spanner データベースの詳細なアクセス制御を構成する方法について説明します。
詳細なアクセス制御については、詳細なアクセス制御についてをご覧ください。
詳細なアクセス制御の設定手順は次のとおりです。
きめ細かいアクセス制御機能のユーザーは、データベースに対してクエリ、DML、または行オペレーションを実行するために、データベースのロールを指定する必要があります。
準備
きめ細かいアクセス制御ユーザーになる各プリンシパルに Cloud Spanner Viewer
IAM ロール(roles/spanner.viewer
)が付与されていることを確認します。このロールは、Google Cloud コンソールの Spanner リソースとやり取りする必要があるユーザーにプロジェクト レベルで推奨されます。
手順については、プリンシパルに権限を付与するをご覧ください。
データベース ロールを作成し権限を付与する
データベース ロールは、詳細なアクセス権限のコレクションです。データベースごとに最大 100 個のデータベース ロールを作成できます。
データベースのロールとロール階層を決定し、DDL でエンコードします。Spanner での他のスキーマの変更と同様に、スキーマの変更は個別にではなく、バッチで発行することを強くおすすめします。詳細については、スキーマ更新の頻度を制限するをご覧ください。
コンソール
データベース ロールを作成し、詳細なアクセス権限を付与するには、次の手順に沿って操作します。
Google Cloud コンソールの [インスタンス] ページに移動します。
ロールを追加するデータベースを含むインスタンスを選択します。
データベースを選択します。
[概要] ページで、[Spanner Studio] をクリックします。
[Spanner Studio] ページで、作成して権限を付与するデータベースのロールごとに、次の手順を行います。
ロールを作成するには、次のステートメントを入力します。
CREATE ROLE ROLE_NAME;
まだ [送信] はクリックしないでください。
ロールに権限を付与するには、
CREATE ROLE
ステートメントの後の次の行にGRANT
ステートメントを入力します。GRANT
ステートメントの構文の詳細については、GoogleSQL データ定義言語をご覧ください。権限については、きめ細かいアクセス制御の権限をご覧ください。たとえば、テーブル
employees
とcontractors
に対するSELECT
、INSERT
、UPDATE
をデータベース ロールhr_manager
に付与するには、次のステートメントを入力します。GoogleSQL
GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_manager;
PostgreSQL
GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO hr_manager;
DDL テンプレートは
GRANT
ステートメントに使用できます。[エクスプローラ] ペインで、権限を付与するロールに移動します。 [アクションを表示] をクリックし、このロールに対してアクセス権を付与する権限のタイプを選択します。新しいエディタタブにGRANT
テンプレート ステートメントが入力されます。
[送信] をクリックします。
DDL にエラーがある場合は、Google Cloud コンソールからエラーが返されます。
gcloud
データベース ロールを作成し、きめ細かいアクセス権限を付与するには、CREATE ROLE
ステートメントと GRANT
ステートメントで gcloud spanner databases ddl update
コマンドを使用します。
CREATE ROLE
ステートメントと GRANT
ステートメントの構文の詳細については、GoogleSQL データ定義言語をご覧ください。
たとえば、次のコマンドを使用してデータベース ロールを作成し、1 つ以上のテーブルに対する権限を付与することができます。
GoogleSQL
gcloud spanner databases ddl update DATABASE_NAME --instance=INSTANCE_NAME \ --ddl='CREATE ROLE ROLE_NAME; GRANT PRIVILEGES ON TABLE TABLES TO ROLE ROLE_NAME;'
PostgreSQL
gcloud spanner databases ddl update DATABASE_NAME --instance=INSTANCE_NAME \ --ddl='CREATE ROLE ROLE_NAME; GRANT PRIVILEGES ON TABLE TABLES TO ROLE_NAME;'
以下を置き換えます。
PRIVILEGES
は、詳細なアクセス制御の権限のカンマ区切りリストです。権限の詳細については、きめ細かいアクセス制御権限をご覧ください。TABLES
は、テーブルのカンマ区切りのリストです。
たとえば、SELECT
、INSERT
およびUPDATE
、employees
~contractors
テーブルへのデータベース ロールhr_analyst
データベースhrdb1
インスタンス内hr
次のステートメントを入力します。
GoogleSQL
gcloud spanner databases ddl update hrdb1 --instance=hr \ --ddl='CREATE ROLE hr_analyst; GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_analyst;'
PostgreSQL
gcloud spanner databases ddl update hrdb1 --instance=hr \ --ddl='CREATE ROLE hr_analyst; GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO hr_analyst;'
クライアント ライブラリ
これらのコードサンプルでは、データベース ロールの作成と削除の両方を行います。
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
継承されたロールの階層を作成します。
あるデータベース ロールを別のデータベース ロールに付与することで、データベース ロールの階層を作成できます。子のロール(メンバーのロール)は親から権限を継承します。
データベース ロールを別のデータベース ロールに付与するには、次のステートメントを使用します。
GoogleSQL
GRANT ROLE role1 TO ROLE role2;
PostgreSQL
GRANT role1 TO role2;
詳細については、データベース ロールの階層と継承をご覧ください。
IAM プリンシパルにデータベース ロールへのアクセス権を付与する
プリンシパルがデータベース ロールを使用して Spanner リソースにアクセスするには、プリンシパルにデータベース ロールへのアクセス権を付与する必要があります。
コンソール
データベース ロールへのアクセス権を IAM プリンシパルに付与するには、次の手順に沿って操作します。
データベースの [概要] ページで、[情報パネル] がまだ開いていない場合は、[情報パネルを表示] をクリックします。
[プリンシパルを追加] をクリックします。
プリンシパルを追加するの下のdatabase_nameへのアクセスを許可パネルで、1 つ以上の IAM プリンシパルを指定します。
ロールを選択メニューのロールを割り当てるで、Cloud Spanner > Cloud Spanner のきめ細かいアクセス制御ユーザーを選択します。
このロールは、プリンシパルごとに 1 回のみ付与する必要があります。これにより、プリンシパルはきめ細かなアクセス制御のユーザーになります。
[別のロールを追加] をクリックします。
[ロールを選択] メニューで、[Cloud Spanner] > [Cloud Spanner データベース ロールユーザー] を選択します。
付与するロールを指定する IAM 条件を作成するには、次の手順に沿って操作します。
Cloud Spanner データベース ロールのユーザー ロールの横にある [IAM 条件を追加] をクリックします。
[条件の追加] パネルで、条件のタイトルとオプションの説明を入力します。
単一のデータベース ロールを付与する場合は、通常、条件のタイトルにロール名を含めます。複数のロールを付与する場合は、一連のロールを指定します。
[条件エディタ] をクリックします。
[式] フィールドに次のコードを入力します。
resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/ROLE")
ROLE
は、ロール名に置き換えます。また、プリンシパルに複数のロールへのアクセス権を付与するには、次の例に示すように、OR 演算子(
||
)を使用して条件を追加します。resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))
このコードでは 2 つのロールを付与します。
ROLE1
とROLE2
はロール名に置き換えます。3 つ以上のロールを付与するには、or 条件を追加します。IAM でサポートされている条件式を使用できます。詳細については、IAM 条件の概要をご覧ください。
[保存] をクリックします。
前のパネルに戻って、[ロール] フィールドの横にある [IAM の条件] 列に条件が表示されていることを確認します。
[保存] をクリックします。
情報パネルの [ロール / プリンシパル] に戻り、定義された各条件の [Cloud Spanner データベース ロールユーザー] が表示されます。
条件の横にあるかっこ内の数字は、その条件によってデータベース ロールが付与されるプリンシパルの数を示します。展開矢印をクリックすると、プリンシパルのリストを表示できます。
データベース ロールの名前や条件を修正する場合や、プリンシパルにデータベース ロールを追加する場合は、次の手順に沿って操作します。
必要な条件を一覧表示する [Cloud Spanner データベース ロールユーザー] エントリを展開します。
プリンシパルの横にある [編集](鉛筆)アイコンをクリックします。
[database_name] に対する編集アクセス権パネルで、次のいずれかを行います。
[別のロールを追加] をクリックします。
条件を編集するには、条件名の横にある [編集](鉛筆)アイコンをクリックします。次に [条件の編集] ページで [条件エディタ] をクリックし、条件を修正して、[保存] を 2 回クリックします。
gcloud
データベース ロールへのアクセス権を IAM プリンシパルに付与するには、次の手順に沿って操作します。
プリンシパルに対する詳細なアクセス制御を有効にするには、次のように
gcloud spanner databases add-iam-policy-binding
コマンドを使用します。gcloud spanner databases add-iam-policy-binding DATABASE_NAME \ --instance=INSTANCE_NAME \ --role=roles/spanner.fineGrainedAccessUser \ --member=MEMBER_NAME \ --condition=None
MEMBER_NAME
は、プリンシパルの識別子です。形式はuser|group|serviceAccount:email
またはdomain:domain
にする必要があります。このコマンドにより、プリンシパルはきめ細かなアクセス制御のユーザーになります。このコマンドは、プリンシパルごとに 1 回だけ送信します。
成功した場合、コマンドはデータベースのポリシー全体を出力します。
次のように
gcloud spanner databases add-iam-policy-binding
コマンドを使用して、1 つ以上のデータベース ロールを使用する権限を付与します。gcloud spanner databases add-iam-policy-binding DATABASE_NAME \ --instance=INSTANCE_NAME \ --role=roles/spanner.databaseRoleUser \ --member=MEMBER_NAME \ --condition=CONDITION
MEMBER_NAME
は、プリンシパルの識別子です。形式はuser|group|serviceAccount:email
またはdomain:domain
にする必要があります。CONDITION
は、プリンシパルに付与するロールを指定する IAM 条件式です。CONDITION
の形式は次のとおりです。--condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/ROLE1")),title=TITLE,description=DESCRIPTION'
また、プリンシパルに複数のロールへのアクセス権を付与するには、次の例に示すように、OR 演算子(
||
)を使用して条件を追加します。--condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))),title=TITLE,description=DESCRIPTION'
このコードでは 2 つのロールを付与します。
ROLE1
とROLE2
はロール名に置き換えます。3 つ以上のロールを付与するには、||
演算子を使用して or 条件を追加します。IAM でサポートされている条件式を使用できます。詳細については、IAM 条件の概要をご覧ください。
成功した場合、コマンドはデータベースのポリシー全体を出力します。
次の例では、データベース ロール
hr_rep
とhr_manager
をプリンシパルjsmith@example.com
に付与します。gcloud spanner databases add-iam-policy-binding myDatabase \ --instance=myInstance \ --role=roles/spanner.databaseRoleUser \ --member=user:jsmith@example.com \ --condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/hr_rep") || resource.name.endsWith("/hr_manager"))),title=HR roles,description=Grant permissions on HR roles'
クライアント ライブラリ
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
データベース ロールの使用を開始するようにユーザーとデベロッパーに通知する
最初のきめ細かなアクセス制御構成が完了したら、ユーザーとアプリケーション デベロッパーにデータベース ロールの使用を開始する必要があることを通知します。
細かいアクセス制御ユーザーは、Google Cloud コンソールまたは Google Cloud CLI を使用して Spanner データベースにアクセスするときに、データベース ロールの指定を開始する必要があります。
細かいアクセス制御を使用するアプリケーションは、データベースへのアクセス時にデータベースのロールを指定する必要があります。
詳細については、細かいアクセス制御を使用してデータベースにアクセスするをご覧ください。
プリンシパルを詳細なアクセス制御に移行する
IAM プリンシパルをデータベース レベルのアクセス制御からきめ細かなアクセス制御に移行するには、次の手順に沿って操作します。
プリンシパルに対する詳細なアクセス制御を有効にし、必要なすべてのデータベース ロールへのアクセス権を付与します(IAM プリンシパルにデータベース ロールへのアクセス権を付与するをご覧ください)。
このプリンシパルとして実行されるすべてのアプリケーションを更新します。クライアント ライブラリのメソッドの呼び出しで、適切なデータベース ロールを指定します。
プリンシパルから IAM データベース レベルのロールをすべて取り消します。これにより、プリンシパルのアクセス権が 1 つの方法でのみ管理されます。
例外: Google Cloud コンソールで Spanner リソースを操作するには、すべてのユーザーに
roles/spanner.viewer
IAM ロールが必要です。IAM データベース レベルのロールを取り消すには、データベース レベルの権限の削除の手順に沿って操作してください。
データベース ロールを一覧表示する
データベースに関連付けられているデータベース ロールを一覧表示できます。
コンソール
データベース ロールを一覧表示するには、データベースの Spanner Studio ページで次のクエリを入力します。
GoogleSQL
SELECT * FROM INFORMATION_SCHEMA.ROLES;
PostgreSQL
SELECT * FROM information_schema.enabled_roles;
レスポンスには、現在のロールと、現在のロールが継承によって使用できる権限が含まれています。すべてのロールを取得するには、Google Cloud CLI のコマンドを使用します。
gcloud
フィルタされていないデータベース ロールのリストを取得するには、次のコマンドを入力します。それには spanner.databaseRoles.list
権限が必要です。
gcloud spanner databases roles list --database=DATABASE_NAME --instance=INSTANCE_NAME
クライアント ライブラリ
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
データベース ロールに付与された権限を表示する
ロールに付与された権限を表示するには、次のクエリを実行します。
GoogleSQL
SELECT * FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE grantee = 'ROLE_NAME'; SELECT * FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES WHERE grantee = 'ROLE_NAME'; SELECT * FROM INFORMATION_SCHEMA.CHANGE_STREAM_PRIVILEGES WHERE grantee = 'ROLE_NAME';
INFORMATION_SCHEMA.TABLE_PRIVILEGES
は、テーブルとビューの両方の権限を返します。TABLE_PRIVILEGES
の SELECT
、INSERT
、UPDATE
の権限も COLUMN_PRIVILEGES
に表示されています。
PostgreSQL
SELECT * FROM information_schema.table_privileges WHERE grantee = 'ROLE_NAME'; SELECT * FROM information_schema.column_privileges WHERE grantee = 'ROLE_NAME'; SELECT * FROM information_schema.change_stream_privileges WHERE grantee = 'ROLE_NAME';
information_schema.table_privileges
は、テーブルとビューの両方の権限を返します。table_privileges
の SELECT
、INSERT
、UPDATE
の権限も column_privileges
に表示されています。
きめ細かいアクセス制御ユーザーを表示する
きめ細かいアクセス制御ユーザーであるプリンシパルのリストを表示するには、次のコマンドを実行します。コマンドを実行するには、プロジェクトで Cloud Asset API を有効にしてあることと、cloudasset.assets.searchAllIamPolicies
IAM 権限が必要です。
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles=roles/spanner.fineGrainedAccessUser AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' \ --flatten=policy.bindings[].members[] \ --format='table(policy.bindings.members)'
出力は次のようになります。
MEMBERS user:222larabrown@gmail.com user:baklavainthebalkans@gmail.com serviceAccount:cs-fgac-sa-1@cloud-spanner-demo.google.com.iam.gserviceaccount.com serviceAccount:cs-fgac-sa-2@cloud-spanner-demo.google.com.iam.gserviceaccount.com
詳細については、Google Cloud プロジェクトでの API の有効化をご覧ください。
データベース ロールへのアクセス権のある IAM プリンシパルを表示する
特定のデータベース ロールへのアクセス権が付与されているプリンシパルのリストを表示するには、次のコマンドを実行します。コマンドを実行するには、プロジェクトで Cloud Asset API を有効にしてあることと、cloudasset.assets.searchAllIamPolicies
IAM 権限が必要です。
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles=roles/spanner.databaseRoleUser AND policy:"resource.name" AND policy:/ROLE_NAME AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' \ --flatten=policy.bindings[].members[] \ --format='table(policy.bindings.members)'
出力は次のようになります。
MEMBERS 222larabrown@gmail.com
プリンシパルの IAM 条件を表示する
Cloud Spanner Database Role User のロールをプリンシパルに付与する際に指定された IAM 条件のリストを表示するには、次のコマンドを実行します。
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles=roles/spanner.databaseRoleUser AND policy:resource.name AND policy:"PRINCIPAL_IDENTIFIER" AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' \ --flatten=policy.bindings[] \ --format='table(policy.bindings.condition.expression)'
ここで、PRINCIPAL_IDENTIFIER は次のようになります。
{ user:user-account-name | serviceAccount:service-account-name }
PRINCIPAL_IDENTIFIER 例:
user:222larabrown@gmail.com serviceAccount:cs-fgac-sa-1@cloud-spanner-demo.google.com.iam.gserviceaccount.com
次のサンプル出力は、2 つの条件式を示しています。
EXPRESSION resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/hr_analyst") resource.type == "spanner.googleapis.com/DatabaseRole" && resource.name.endsWith("/hr_manager")
欠落しているデータベース ロールの条件について IAM ポリシーを確認する
プリンシパルにデータベース ロールへのアクセス権を付与したら、各 IAM バインディングに条件が指定されていることを確認することをおすすめします。
この確認を実行するには、次のコマンドを実行します。
gcloud asset search-all-iam-policies \ --scope=projects/PROJECT_NAME \ --query='roles:roles/spanner.databaseRoleUser AND resource=//spanner.googleapis.com/projects/PROJECT_NAME/instances/INSTANCE_NAME/databases/DATABASE_NAME' --flatten=policy.bindings[].members[]
出力は次のようになります。
ROLE MEMBERS EXPRESSION roles/spanner.databaseRoleUser serviceAccount:cs-fgac-sa-1@... roles/spanner.databaseRoleUser serviceAccount:cs-fgac-sa-2@... resource.type == "spanner…"
最初の結果には条件がないため、このバインディングのプリンシパルはすべてのデータベース ロールへのアクセス権があることに注意してください。
データベース ロールを削除する
データベース ロールを削除すると、そのロールから他のロールのメンバーシップが自動的に取り消され、他のロールでのそのロールのメンバーシップが取り消されます。
データベースのロールを削除するには、まず次のことを行う必要があります。
- ロールからきめ細かいアクセス制御権限をすべて取り消します。
- そのロールを参照する IAM ポリシー バインディングをすべて削除すると、同じ名前で後で作成されたデータベース ロールはこれらのバインディングを継承しません。
コンソール
データベースのロールを削除するには、次の手順に沿って操作します。
データベースの [概要] ページで、[Spanner Studio] をクリックします。
ロールから権限を取り消すには、
REVOKE
ステートメントを入力します。GoogleSQL
REVOKE
ステートメントの構文の詳細については、GoogleSQL データ定義言語をご覧ください。権限については、きめ細かいアクセス制御の権限をご覧ください。たとえば、データベース ロール
hr_manager
からテーブルemployees
とcontractors
のSELECT
、INSERT
、UPDATE
を取り消すには、次のステートメントを入力します。REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM ROLE hr_manager;
PostgreSQL
REVOKE
ステートメントの構文の詳細については、PostgreSQL データ定義言語をご覧ください。権限については、きめ細かいアクセス制御の権限をご覧ください。たとえば、データベース ロール
hr_manager
のemployees
テーブルとcontractors
テーブルに対するSELECT
、INSERT
、UPDATE
権限を取り消すには、次のステートメントを入力します。REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM hr_manager;
DDL テンプレートは
REVOKE
ステートメントに使用できます。[エクスプローラ] ペインで、権限を取り消すロールに移動します。 [アクションを表示] をクリックし、このロールに対してアクセス権を取り消す権限のタイプを選択します。新しいエディタタブにREVOKE
テンプレート ステートメントが入力されます。ロールに関連付けられた IAM 条件を削除します。
情報パネルのロールのリストで、条件のタイトルに隣接する Cloud Spanner データベース ロールユーザーのロールを見つけます。次に、ロールを展開して、役割にアクセスできるプリンシパルを表示します。
プリンシパルの 1 つについて、[プリンシパルを編集](鉛筆)アイコンをクリックします。
[アクセス権を編集] ページで、Cloud Spanner Database Role User ロールの横にある [ロールを削除](ゴミ箱)アイコンをクリックします。
[保存] をクリックします。
条件に一覧表示される他のプリンシパルに対して、前の 3 つの手順を繰り返します。
ロールを削除するには、[Spanner Studio] ページに移動して、次のステートメントを入力します。
DROP ROLE ROLE_NAME;
[送信] をクリックします。
gcloud
ロールのすべての権限を取り消してからロールを削除するには、次のように
gcloud spanner databases ddl update
コマンドを使用します。GoogleSQL
gcloud spanner databases ddl update DATABASE_NAME \ --instance=INSTANCE_NAME \ --ddl='REVOKE PERMISSIONS ON TABLE TABLE_NAME FROM ROLE ROLE_NAME; DROP ROLE ROLE_NAME;'
PostgreSQL
gcloud spanner databases ddl update DATABASE_NAME \ --instance=INSTANCE_NAME \ --ddl='REVOKE PERMISSIONS ON TABLE TABLE_NAME FROM ROLE_NAME; DROP ROLE ROLE_NAME;'
PERMISSIONS
の有効な値は、SELECT
、INSERT
、UPDATE
、DELETE
です。関連する IAM 条件を削除するには、次のように
gcloud spanner databases remove-iam-policy-binding
コマンドを使用します。gcloud spanner databases remove-iam-policy-binding DATABASE_NAME \ --instance=INSTANCE_NAME \ --role=ROLE_NAME \ --member=MEMBER_NAME \ --condition=CONDITION
MEMBER_NAME
は、プリンシパルの識別子です。形式はuser|group|serviceAccount:email
またはdomain:domain
にする必要があります。CONDITION
は、プリンシパルに付与するロールを指定する IAM 条件式です。CONDITION
の形式は次のとおりです。--condition='expression=(resource.type == "spanner.googleapis.com/DatabaseRole" && (resource.name.endsWith("/ROLE1") || resource.name.endsWith("/ROLE2"))),title=TITLE,description=DESCRIPTION'
条件の仕様全体は、権限を付与したコマンドで使用されている条件仕様(タイトルや説明など)と完全に一致する必要があります。
クライアント ライブラリ
これらのコードサンプルでは、データベース ロールの作成と削除の両方を行います。
C++
C#
Go
Java
Node.js
PHP
Python
Ruby