このページでは、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
を付与すると、付与先は今後追加されるテーブルのデータ変更を確認できます。