このページでは、Cloud Spanner データベースの詳細なアクセス制御を構成する方法について説明します。
詳細なアクセス制御については、詳細なアクセス制御についてをご覧ください。
詳細なアクセス制御の設定手順は次のとおりです。
きめ細かいアクセス制御機能のユーザーは、データベースに対してクエリ、DML、または行オペレーションを実行するために、データベースのロールを指定する必要があります。
準備
きめ細かいアクセス制御ユーザーになる各プリンシパルに Cloud Spanner Viewer
IAM ロール(roles/spanner.viewer
)が付与されていることを確認します。このロールは、Google Cloud コンソールの Spanner リソースとやり取りする必要があるユーザーにプロジェクト レベルで推奨されます。
手順については、プリンシパルに権限を付与するをご覧ください。
データベース ロールを作成し権限を付与する
データベース ロールは、詳細なアクセス権限のコレクションです。各データベースに最大 100 個のデータベースロールを作成できます。
データベース内のロールとロール階層を決定し、DDL でエンコードします。Spanner の他のスキーマ変更と同様に、スキーマ変更は個別ではなくバッチで発行することを強くおすすめします。詳細については、スキーマ更新の頻度を制限するをご覧ください。
Console
データベース ロールを作成し、詳細なアクセス権限を付与するには、次の手順に沿って操作します。
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;
GRANT
ステートメントには DDL テンプレートを使用できます。[エクスプローラ] ペインで、権限を付与するロールに移動します。 [アクションを表示] をクリックし、このロールに対してアクセス権を付与する権限のタイプを選択します。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
継承されたロールの階層を作成します。
データベース ロールの階層を作成するには、1 つのデータベース ロールを別のロールに付与します。子のロール(メンバーのロール)は親から権限を継承します。
データベース ロールを別のデータベース ロールに付与するには、次のステートメントを使用します。
GoogleSQL
GRANT ROLE role1 TO ROLE role2;
PostgreSQL
GRANT role1 TO role2;
詳細については、データベース ロールの階層と継承をご覧ください。
IAM プリンシパルにデータベース ロールへのアクセス権を付与する
プリンシパルがデータベース ロールを使用して Spanner リソースにアクセスできるようにするには、データベース ロールへのアクセス権を付与する必要があります。
Console
データベース ロールへのアクセス権を 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
はプリンシパルの ID です。形式は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
はプリンシパルの ID です。形式は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 条件の概要をご覧ください。
成功すると、コマンドはデータベースのポリシー全体を出力します。
次の例では、プリンシパル
jsmith@example.com
にデータベース ロールhr_rep
とhr_manager
を付与します。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 データベース レベルのロールを取り消すには、データベース レベルの権限の削除の手順に沿って操作してください。
データベース ロールを一覧表示する
データベースに関連付けられているデータベース ロールを一覧表示できます。
Console
データベース ロールを表示するには、データベースの 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 ポリシー バインディングをすべて削除すると、同じ名前で後で作成されたデータベース ロールはこれらのバインディングを継承しません。
Console
データベースのロールを削除するには、次の手順に沿って操作します。
データベースの [概要] ページで、[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;
REVOKE
ステートメントには DDL テンプレートを使用できます。[エクスプローラ] ペインで、権限を取り消すロールに移動します。 [アクションを表示] をクリックし、このロールに対してアクセス権を取り消す権限のタイプを選択します。REVOKE
テンプレート ステートメントが新しいエディタタブに入力されます。ロールに関連付けられた IAM 条件を削除します。
情報パネルのロールのリストで、条件のタイトルに隣接する Cloud Spanner データベース ロールユーザーのロールを見つけます。次に、ロールを展開して、役割にアクセスできるプリンシパルを表示します。
いずれかのプリンシパルの「プリンシパルを編集」アイコン(鉛筆のアイコン)をクリックします。
[アクセス権を編集] ページで、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
はプリンシパルの ID です。形式は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