このページでは、Spanner 変更ストリームでのきめ細かいアクセス制御の仕組みについて説明します。
細かいアクセス制御をするユーザーの場合、次の権限付与を使用して、変更ストリーム データへの読み取りアクセスを許可します。両方の権限付与は必須です。
変更ストリームに
SELECT
を付与します。GoogleSQL
GRANT SELECT ON CHANGE STREAM CHANGE_STREAM_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT SELECT ON CHANGE STREAM CHANGE_STREAM_NAME TO ROLE_NAME;
変更ストリームに自動的に作成される読み取り関数に
EXECUTE
を付与します。読み取りストリーム関数を使用して、変更ストリームのレコードを読み取ります。GoogleSQL
GRANT EXECUTE ON TABLE FUNCTION READ_FUNCTION_NAME TO ROLE ROLE_NAME;
PostgreSQL
GRANT EXECUTE ON FUNCTION READ_FUNCTION_NAME TO ROLE_NAME;
変更ストリームの読み取り関数の命名規則と、返される情報の形式については、次のトピックをご覧ください。
変更ストリームの INFORMATION_SCHEMA
ビュー
次のビューは、変更ストリームのデータベース ロールと権限の情報を示しています。
- GoogleSQL 言語データベース:
INFORMATION_SCHEMA.CHANGE_STREAM_PRIVILEGES
- PostgreSQL 言語データベース:
information_schema.change_stream_privileges
これらのビューの行は、変更ストリームに対する現在のデータベース ロールの権限に基づいてフィルタリングされます。これにより、プリンシパルはアクセス権を持つロール、権限、変更ストリームのみを表示できます。
行のフィルタリングは、次の変更ストリーム関連のビューにも適用されます。
GoogleSQL
INFORMATION_SCHEMA.CHANGE_STREAMS
INFORMATION_SCHEMA.CHANGE_STREAM_TABLES
INFORMATION_SCHEMA.CHANGE_STREAM_COLUMNS
INFORMATION_SCHEMA.CHANGE_STREAM_OPTIONS
システムロール spanner_info_reader
とそのメンバーには、常にフィルタされていない INFORMATION_SCHEMA
が表示されます。
PostgreSQL
information_schema.change_streams
information_schema.change_stream_tables
information_schema.change_stream_columns
information_schema.change_stream_options
システムロール spanner_info_reader
とそのメンバーには、フィルタされていない information_schema
が表示されます。
行フィルタリングは、変更ストリームの読み取り関数に関する次のメタデータ ビューにも適用されます。
GoogleSQL
PostgreSQL
注意点
変更ストリームは、メタデータ データベースを使用して内部状態を維持します。メタデータ データベースは、アプリケーション データベースと同じ場合もあれば、異なる場合もあります。別のデータベースを使用することをおすすめします。ただし、きめ細かいアクセス制御ユーザーの場合は、メタデータ データベースをアプリケーション データベースと同じにすることはできません。これは、Dataflow ジョブを実行する IAM プリンシパルに、メタデータ データベースのデータベース レベルで読み取り/書き込みアクセス権が必要なためです。これにより、アプリケーション データベース用に構成されたきめ細かいアクセス制御権限がオーバーライドされます。
詳細については、別のメタデータ データベースを検討するをご覧ください。
変更ストリームには、トラックされたテーブルと列からデータのコピーが個別に含まれているため、変更ストリームへのアクセス権をユーザーに付与する際は注意が必要です。変更ストリームのリーダーは、テーブルと列に対する
SELECT
権限がなくても、追跡するテーブルおよび列からのデータ変更を表示できます。変更ストリームと追跡対象テーブルおよび列には別々の制御を設定できますが、潜在的なリスクがあるため、それに応じてデータベースのロールと権限を構造化する必要があります。たとえば、テーブルに対するSELECT
権限を含むロールを取り消す場合は、変更ストリームでもSELECT
を取り消す(および関連する読み取り関数でもEXECUTE
を取り消す)ことを検討してください。すべてのテーブルを追跡する変更ストリームに
SELECT
を付与すると、付与対象は今後追加されたテーブルのデータ変更を表示できます。