このページでは、Cloud Spanner データベースの詳細なアクセス制御を構成する方法について説明します。
詳細なアクセス制御については、詳細なアクセス制御についてをご覧ください。
詳細なアクセス制御の設定手順は次のとおりです。
きめ細かいアクセス制御ユーザーは、データベースに対してクエリ、DML、または行オペレーションを実行するために、データベースの役割を指定する必要があります。
データベース ロールを作成し権限を付与する
データベース ロールは、詳細なアクセス権限のコレクションです。データベースごとに最大 100 個のデータベース ロールを作成できます。
データベース内の役割と階層を決定し、DDL でエンコードします。Spanner の他のスキーマの変更と同様に、スキーマの変更は個別にではなくバッチで発行することを強くおすすめします。詳細については、スキーマの更新頻度を制限するをご覧ください。
コンソール
データベース ロールを作成し、詳細なアクセス権限を付与するには、次の手順に沿って操作します。
Google Cloud コンソールの [インスタンス] ページに移動します。
ロールを追加するデータベースを含むインスタンスを選択します。
データベースを選択します。
[概要] ページで、[DDL の書き込み] をクリックします。
[DDL ステートメントの書き込み] ページで、権限を作成して権限を付与するデータベース ロールごとに、次の操作を行います。
ロールを作成するには、次のステートメントを入力します。
CREATE ROLE ROLE_NAME;
まだ [Submit] はクリックしないでください。
ロールを付与するには、
CREATE ROLE
ステートメントの次の行にGRANT
ステートメントを入力します。GRANT
ステートメントの構文の詳細については、GoogleSQL データ定義言語をご覧ください。権限の詳細については、きめ細かいアクセス制御権限をご覧ください。たとえば、テーブル
employees
とcontractors
に対するSELECT
、INSERT
、UPDATE
をデータベース ロールhr_manager
に付与するには、次のステートメントを入力します。GRANT SELECT, INSERT, UPDATE ON TABLE employees, contractors TO ROLE hr_manager;
DDL テンプレートは
GRANT
ステートメントに使用できます。[DDL テンプレート] プルダウン メニューで、[データベースのロール] を選択し、[ロールの権限を付与] でテンプレートを選択します。
[送信] をクリックします。
DDL にエラーがある場合は、Google Cloud コンソールからエラーが返されます。
gcloud
データベース ロールを作成してきめ細かなアクセス権を付与するには、CREATE ROLE
ステートメントと GRANT
ステートメントを指定して、gcloud spanner databases ddl update
コマンドを使用します。
CREATE ROLE
ステートメントと GRANT
ステートメントの構文の詳細については、GoogleSQL データ定義言語をご覧ください。
たとえば、次のコマンドを使用してデータベース ロールを作成し、1 つ以上のテーブルに対する権限を付与することができます。
gcloud spanner databases ddl update DATABASE_NAME --instance=INSTANCE_NAME \ --ddl='CREATE ROLE ROLE_NAME; GRANT PRIVILEGES ON TABLE TABLES TO ROLE ROLE_NAME;'
PRIVILEGES
は、詳細なアクセス制御の権限のカンマ区切りリストです。権限の詳細については、きめ細かいアクセス制御権限をご覧ください。TABLES
は、テーブルのカンマ区切りのリストです。
たとえば、SELECT
、
INSERT
およびUPDATE
テーブルemployees
~contractors
データベース ロールhr_analyst
データベースhrdb1
インスタンス内hr
次のステートメントを入力します。
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;'
クライアント ライブラリ
これらのコードサンプルは、データベース ロールの作成と削除の両方を行います。
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
継承を使用してロールの階層を作成する
あるデータベース ロールを別のデータベース ロールに付与することで、データベース ロールの階層を作成できます。子のロール(メンバーのロール)は親から権限を継承します。
データベース ロールを別のデータベース ロールを付与するには、次のステートメントを使用します。
GRANT ROLE role1 TO ROLE role2;
詳細については、データベース ロールの階層と継承をご覧ください。
データベース ロールに対するアクセス権を IAM プリンシパルに付与する
IAM を使用して、データベースのロールへのアクセス権を付与します。
コンソール
データベース ロールに 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 条件の概要をご覧ください。
[保存] をクリックします。
前のパネルに戻り、[Role] フィールドの横にある [IAM Condition] 列に条件が表示されていることを確認します。
[保存] をクリックします。
情報パネルの [ロール / プリンシパル] に戻り、定義された各条件の [Cloud Spanner データベース ロールユーザー] が表示されます。
条件の横にあるかっこ内の数字は、その条件によってデータベース ロールが付与されたプリンシパルの数を示します。展開矢印をクリックすると、プリンシパルのリストが表示されます。
データベース ロールの名前や条件を修正する場合や、プリンシパルにデータベース ロールを追加する場合は、次の手順に沿って操作します。
必要な条件を一覧表示する [Cloud Spanner Database Role User] エントリを展開します。
プリンシパルの横にある [編集](鉛筆)アイコンをクリックします。
[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 つ以上のロールを付与するには、||
演算子を使用して、または条件を追加します。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
プリンシパルを詳細なアクセス制御に移行する
IAM プリンシパルをデータベース レベルのアクセス制御からきめ細かなアクセス制御に移行するには、次の手順に沿って操作します。
プリンシパルに対する詳細なアクセス制御を有効にし、必要なすべてのデータベース ロールへのアクセス権を付与します(IAM プリンシパルにデータベース ロールへのアクセス権を付与するをご覧ください)。
このプリンシパルとして実行されるすべてのアプリケーションを更新します。クライアント ライブラリのメソッドの呼び出しで、適切なデータベース ロールを指定します。
プリンシパルからすべての IAM データベース レベルのロールを取り消します。これにより、プリンシパルのアクセス権が 1 つの方法でのみ管理されます。
IAM データベース レベルのロールを取り消すには、データベース レベルの権限の削除の手順に沿って操作してください。
データベース ロールを一覧表示する
データベースに関連付けられているデータベース ロールを一覧表示できます。
コンソール
データベース ロールを一覧表示するには、データベースの [クエリ] ページで次のクエリを入力します。
SELECT * FROM INFORMATION_SCHEMA.ROLES;
レスポンスには、現在のロールと、現在のロールが継承によって使用できる権限が含まれています。すべてのロールを取得するには、gcloud コマンドを使用します。
gcloud
フィルタリングされていないデータベース ロールのリストを取得するには、次のコマンドを入力します。spanner.databaseRoles.list
権限が必要です。
gcloud spanner databases roles list --database=DATABASE_NAME --instance=INSTANCE_NAME
クライアント ライブラリ
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
データベース ロールに付与されている権限を表示する
ロールに付与された権限を表示するには、次のクエリを実行します。
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 データベース ロールのユーザーを付与するときに指定された 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 ポリシー バインディングをすべて削除します。これにより、同じ名前で作成されたデータベース ロールがこれらのバインディングを継承しません。
コンソール
データベースのロールを削除するには、次の手順に沿って操作します。
データベースの [概要] ページで、[DDL を記述] をクリックします。
ロールから権限を取り消すには、
REVOKE
ステートメントを入力します。REVOKE
ステートメントの構文の詳細については、GoogleSQL データ定義言語をご覧ください。権限の詳細については、きめ細かいアクセス制御権限をご覧ください。たとえば、データベース ロール
hr_manager
からテーブルemployees
とcontractors
のSELECT
、INSERT
、UPDATE
を取り消すには、次のステートメントを入力します。 :REVOKE SELECT, INSERT, UPDATE ON TABLE employees, contractors FROM ROLE hr_manager;
DDL テンプレートは
REVOKE
ステートメントに使用できます。[DDL テンプレート] プルダウン メニューで、[データベースのロール] を選択し、[ロールの権限を取り消す] でテンプレートを選択します。ロールに関連付けられた IAM 条件を削除します。
情報パネルのロールのリストで、条件のタイトルに隣接する Cloud Spanner データベース ロールユーザーのロールを見つけます。次に、ロールを展開して、役割にアクセスできるプリンシパルを表示します。
プリンシパルの 1 つについて、[プリンシパルを編集](鉛筆)アイコンをクリックします。
[アクセス権の編集] ページで、Cloud Spanner データベース ロールのユーザーロールの横にある [ロールを削除](ゴミ箱)アイコンをクリックします。
[保存] をクリックします。
条件に含まれる他のプリンシパルに対して、前の 3 つの手順を繰り返します。
ロールを削除するには、[DDL の書き込み] ページに移動し、次のステートメントを入力します。
DROP ROLE ROLE_NAME;
[送信] をクリックします。
gcloud
ロールのすべての権限を取り消してからロールを取り消すには、次のように
gcloud spanner databases ddl update
コマンドを使用します。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;'
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