Skip to content
Last updated

論理ビューのセキュリティモード

論理ビューは、ビューによって参照されるテーブルへのアクセス時に権限がどのように評価されるかを制御する2つのセキュリティモードをサポートしています: DEFINERINVOKERです。

概要

セキュリティモードは、ビューが基盤となるテーブルにアクセスする際に、誰の権限が使用されるかを決定します。

  • DEFINERモード: ビューはビューオーナーの権限で実行されます
  • INVOKERモード: ビューはクエリ実行者の権限で実行されます

デフォルトのセキュリティモードはDEFINERで、これはほとんどのデータベースシステムで使用される標準規約に従っています。

ビューがビューと同じデータベースに保存されているテーブルのみを参照する場合、セキュリティモードは重要ではありません。これは、アクセス制御がデータベースレベルで実行されるためです。セキュリティモードは、ビューが異なるデータベース間でテーブルを参照する場合に関連します。

DEFINERモード(デフォルト)

DEFINERモードでは、ビューに対するクエリは、クエリを実行するユーザーではなく、ビューを作成した(所有する)ユーザーの権限を使用して実行されます。

DEFINERモードを使用する場合

以下の場合にDEFINERモードを使用します:

  • 機密データへの制御されたアクセスを提供: 基盤となるテーブルへの直接アクセスを許可することなく、ユーザーが特定の列またはフィルタリングされた行をクエリできるようにします
  • パーミッション管理を簡素化: ビューをクエリする必要があるすべてのユーザーに権限を付与する代わりに、ビューオーナーに一度だけ権限を付与します
  • 抽象化レイヤーを作成: 複雑なセキュリティロジックをシンプルなビューインターフェースの背後に隠します

CREATE VIEW filtered_data.customers
SECURITY DEFINER
AS
SELECT customer_id, customer_name, country
FROM source_data.customers
WHERE country IN ('US', 'CA', 'MX');

この例では:

  • ビューはfiltered_dataデータベースに作成され、参照されるテーブルはsource_dataデータベースにあります
  • ビューオーナーはsource_data.customersテーブルへのアクセス権限を持っています
  • filtered_data.customersをクエリするユーザーは、source_dataデータベースまたはsource_data.customersテーブルへの直接的な権限は不要です
  • すべてのユーザーは、自身の権限に関係なく、US、CA、またはMXの顧客のみを表示します
  • ビューはオーナーの権限で実行されます。この権限には、source_data.customersテーブル全体へのアクセスが含まれます

アクセス制御はデータベースレベルで行われるため、DEFINERセキュリティモードを効果的に活用するには、ビューは参照テーブルが保存されているデータベースとは異なるデータベースに定義する必要があります。

ネストされたビューでのDEFINERモード

ビューが他のビューを参照する場合、各ビューのセキュリティモードは独立して評価されます:

-- view_aはtable_cを参照
CREATE VIEW view_a
SECURITY DEFINER
AS SELECT * FROM table_c;

-- view_bはview_aを参照
CREATE VIEW view_b
SECURITY DEFINER
AS SELECT * FROM view_a;

クエリがSELECT * FROM view_bを実行すると:

  1. view_bは、view_bのオーナーの権限でアクセスされます(DEFINERモード)
  2. view_aは、view_aのオーナーの権限でアクセスされます(DEFINERモード)
  3. table_cは、view_aのオーナーの権限でアクセスされます(DEFINERモード)

INVOKERモード

INVOKERモードでは、ビューに対するクエリは、ビューオーナーではなく、クエリを実行しているユーザーの権限を使用して実行されます。

INVOKERモードを使用する場合

以下の場合にINVOKERモードを使用します:

  • ユーザーレベルの権限を強制: 各ユーザーが、自身の権限に基づいてアクセスを許可されたデータのみを表示できるようにします
  • セキュリティを変更せずにクエリロジックを簡素化: 既存の権限モデルを維持しながら、再利用可能なクエリテンプレートを提供します
  • 誰が何にアクセスしたかを監査: ビューオーナーではなく、実際のクエリ実行者に基づいてアクセスを追跡します

CREATE VIEW analytics.all_customer_orders
SECURITY INVOKER
AS
SELECT o.order_id, o.customer_id, o.amount, c.customer_name
FROM source_data.orders o
JOIN source_data.customers c ON o.customer_id = c.customer_id;

この例では:

  • ビューはanalyticsデータベースに作成され、参照されるテーブルはsource_dataデータベースにあります
  • ユーザーは、source_data.ordersテーブルとsource_data.customersテーブルの両方へのアクセス権限を持っている必要があります
  • 各ユーザーは、自身の権限に基づいてアクセスを許可されたデータのみを表示します
  • ユーザーがsource_data.customersテーブルへの権限を持っていない場合、クエリは失敗します

ネストされたビューでのINVOKERモード

ビューがINVOKERモードで他のビューを参照する場合:

-- view_aはtable_cを参照
CREATE VIEW view_a
SECURITY INVOKER
AS SELECT * FROM table_c;

-- view_bはview_aを参照
CREATE VIEW view_b
SECURITY INVOKER
AS SELECT * FROM view_a;

クエリがSELECT * FROM view_bを実行すると:

  1. view_bは、クエリ実行者の権限でアクセスされます(INVOKERモード)
  2. view_aは、クエリ実行者の権限でアクセスされます(INVOKERモード)
  3. table_cは、クエリ実行者の権限でアクセスされます(INVOKERモード)

ネストされたビューの制限事項

DEFINERセキュリティモードの論理ビューは、INVOKERセキュリティモードの論理ビューを参照すべきではありません。この組み合わせは予期しない権限動作を引き起こす可能性があり、推奨されません。

比較表

側面DEFINERモードINVOKERモード
使用される権限ビューオーナーの権限クエリ実行者の権限
ユースケース機密データへの制御されたアクセスユーザーレベルの権限強制
権限設定ビューオーナーにのみ権限を付与すべてのユーザーに権限を付与
セキュリティ上のメリット特定の列/行へのデータアクセスを制限既存の権限モデルを強制
デフォルトはいいいえ

セキュリティモードの指定

ビュー作成時

ビューを作成する際は、CREATE VIEWステートメントでセキュリティモードを指定します:

-- DEFINERモード(デフォルト)
CREATE VIEW view_name
SECURITY DEFINER
AS
SELECT * FROM table_name;

-- INVOKERモード
CREATE VIEW view_name
SECURITY INVOKER
AS
SELECT * FROM table_name;

セキュリティモードを指定しない場合、デフォルトでDEFINERが使用されます。

セキュリティモードの変更

セキュリティモードは、Data Workbench UIまたはSQLを使用して変更できます。

UIを使用する場合:

  1. Data Workbenchでビュー詳細ページに移動します
  2. メニュー(⋯)を選択し、詳細を編集を選択します
  3. 論理ビューの詳細を編集ダイアログで、以下を選択します:
    • Definer: ビュー作成者の権限を使用します
    • Invoker: 現在のユーザーの権限を使用します
  4. 確認を選択して変更を適用します

論理ビューの詳細を編集ダイアログ

SQLを使用する場合:

セキュリティモードをSQLで変更するには、CREATE OR REPLACE VIEWを使用します:

-- INVOKERモードに変更
CREATE OR REPLACE VIEW view_name
SECURITY INVOKER
AS
SELECT * FROM table_name;

CREATE OR REPLACE VIEWを使用する場合、完全なクエリ定義を再指定する必要があります。

重要な考慮事項

DEFINERモードではビューのオーナーシップが重要

  • DEFINERモードを使用する場合、ビューオーナーの権限が重要です
  • ビューオーナーが削除されると、DEFINERモードのビューは機能しなくなります
  • DEFINERビューを所有するユーザーを削除する前に、適切な権限を持つ別のユーザーにオーナーシップを委譲してください

列レベルセキュリティの制限

  • 論理ビューの列には、データ分類のタグを付けることはできません
  • ユーザーがカラムパーミッション(タグ付けされていない列を表示できない)を持っている場合、クエリで論理ビューを使用できません
  • この制限は、セキュリティモードに関係なく適用されます

次のステップ

  • 論理ビュー - 論理ビューの作成、表示、管理に関する完全ガイド