アプリの所有者権限と呼び出し元権限の使用¶
このトピックでは、所有者の権限と制限された呼び出し元の権限を使用するようにアプリを構成する方法について説明します。
アプリのオーナー権・呼び出し元制限権について¶
アプリのコンテキストでは、次のタイプの実行可能ファイルがサポートされています。
アプリが所有するストアドプロシージャ
コンテナー搭載アプリで利用可能なサービス
これらのタイプの実行可能ファイルはそれぞれ、所有者の権限または制限された呼び出し元権限のいずれかを使用するように構成できます。
- 所有者の権限:
デフォルトでは、アプリ内の実行可能ファイルは所有者の権限を使用します。つまり、実行可能ファイルの所有者(アプリ自体)に付与された権限で実行されます。
たとえば、所有者の権限は、実行可能ファイルがプロバイダーアカウントのデータにアクセスし、そのデータをコンシューマーに提示することを許可します。ただし、コンシューマーがデータに直接アクセスすることは許可されません。
たとえば、CREATE PROCEDURE コマンドは、デフォルトで所有者の権限を使用するストアドプロシージャを作成します 。コンシューマーは、アプリケーションロールを使用してアクセス権を付与されている場合、ストアドプロシージャを呼び出すことができます。アプリが操作を実行する権限を持っている場合、ストアドプロシージャはその操作を実行できます。
所有者の権限に関する一般情報については、呼び出し元権限と所有者権限のストアドプロシージャについて をご参照ください。
- 制限された呼び出し元権限:
制限付き呼び出し元権限は、呼び出し元権限で実行ファイルを実行することを許可しますが、 実行ファイルがどの呼び出し元権限で実行されるかを制限します。呼び出し元権限が制限されている場合、コンシューマーアカウントの管理者が GRANT CALLER コマンドを使用して明示的に許可しない限り、アプリが所有する実行ファイルを特定の権限で実行することはできません。
注釈
アプリの実行可能ファイルが安全であることを保証するため、Snowflake Native Apps は無制限の呼び出し元権限をサポートしていません。
制限された呼び出し元権限に関する一般的な情報については、 制限された呼び出し元権限 をご参照ください。
アプリにおける制限された呼び出し元権限の範囲¶
Snowflakeでは、コンシューマーがコンシューマーアカウントの特定のオブジェクトではなく、コンテナレベルで呼び出し元グラントを付与することを推奨しています。
- スキーマレベル:
スキーマに呼び出し元権限を付与しますが、スキーマ内のオブジェクトには権限を付与しません。たとえば、スキーマで CALLER USAGE 呼び出し元グラントを付与すると、スキーマで USAGE 権限のみを付与します。関数などの特定のオブジェクトへのアクセスを付与するには、GRANT INHERITED CALLER USAGE ON ALL FUNCTIONS IN SCHEMA を使用します。
- データベースレベル:
データベースレベルで呼び出し元グラントを付与すると、実行可能ファイルはデータベースとデータベース内のすべてのスキーマにのみアクセスできるようになります。たとえば、CALLER USAGE 呼び出し元グラントを付与すると、データベースで USAGE 権限を付与します。ただし、特定のオブジェクトへのアクセスを付与するには、次のコマンドを使用する必要があります。
GRANT INHERITED CALLER USAGE ON ALL FUNCTIONS IN DATABASE;
- アカウントレベル:
アカウントレベルで呼び出し元グラントを付与すると、実行可能ファイルはアカウントレベルの操作を実行できるようになります。CALLER USAGE 呼び出し元グラントを付与すると、実行可能ファイルはアカウントにアクセスできるようになりますが、アカウント内のオブジェクトへのアクセスは付与されません。
特定のオブジェクトへのアクセスを許可するには、そのアカウントで特定の型のオブジェクトへのアクセスを付与します。たとえば、CREATE DATABASE 呼び出し元グラントを付与すると、次の例に示すように、実行可能ファイルがコンシューマーアカウントでデータベースを作成できるようになります。
GRANT CALLER CREATE DATABASE ON ACCOUNT TO my_app;
アプリに付与できるアカウントレベルの呼び出し元グラント¶
プロバイダーは、以下のアカウントレベルの呼び出し元グラントを使用するように、アプリ内の実行可能ファイルを構成できます。
CREATE DATABASE
EXECUTE ALERT
EXECUTE MANAGED TASK
EXECUTE TASK
READ SESSION
VIEW に LINEAGE
注釈
アプリにアカウントレベルの呼び出し元グラントを付与する場合、コンシューマーは注意を払う必要があります。
アプリのアクセス要件の決定¶
Snowflake Native Apps は、アプリが管理するデータや実行可能ファイルへのアクセスを構成する際、プロバイダーに柔軟性をもたらします。次のテーブルは、アプリのアクセス要件に応じてどのメカニズムを使用するかのガイドラインを提供しています。
アクセス必須 |
アクセス方法 |
|---|---|
アプリが所有するデータまたは関数 |
デフォルトで所有者権限を使用します。プロバイダーは、アプリが所有するオブジェクトを作成したりアクセスしたりするために、コンシューマーにアクセスをリクエストする必要はありません。 |
コンシューマー・アカウントの特定のテーブル、表示、または関数 |
コンシューマーからのリファレンスのリクエスト |
他のユーザーまたはロールが所有するテーブル、ビュー、関数、行ポリシー。 |
コンシューマーがこれらのオブジェクトにアクセスできるようにする、制限付き呼び出し元権限を使用します。 |
コンシューマーが所有するデータベースへの幅広いアクセス |
データベースロール付与の使用 |
コンシューマーデータとプロバイダーデータの組み合わせにアクセスするクエリ |
リファレンスと所有者権限の併用 |
アカウントレベルのオブジェクト |
特定のオブジェクトに権限を付与するための GRANT コマンドを含むカスタムスクリプトをプロバイダーとして提供します。 |
データベースの作成やタスクの実行など、アカウントレベルの操作を実行します。 |
制限された呼び出し元の権限を使用します。これにより、コンシューマーはこれらのアクションを実行するためのアクセス権を有効にすることができます。 |
マニフェストに restricted_callers_rights プロパティを追加します。¶
プロバイダーとして、制限された呼び出し元権限を使用するようにアプリ内の実行可能ファイルを構成する場合、Snowflakeでは、次の例で示すように restricted_callers_rights をマニフェストファイルに追加することを推奨します。
restricted_callers_rights:
enabled: true
description: This app includes stored procedure that uses restricted caller's rights.
restricted_callers_rights は必須ではありませんが、これが存在し、 enabled が true, Snowsight にセットされている場合、アプリのリストに Restricted caller's rights というセクションが含まれます。
制限された呼び出し元権限を使用するプロシージャまたはサービスの構成¶
制限された呼び出し元権限を使用するストアドプロシージャを作成するには、次の例に示すように、アプリが実行可能ファイルを作成するときに EXECUTE AS RESTRICTED CALLER 句を使用します。
CREATE OR REPLACE PROCEDURE CORE.HELLO()
RETURNS STRING
LANGUAGE SQL
EXECUTE AS RESTRICTED CALLER
AS
BEGIN
RETURN 'Hello Snowflake!';
END;
詳細については、 CREATE PROCEDURE をご参照ください。
コンテナを使用するアプリにおける制限された呼び出し元権限サービスの使用¶
制限された呼び出し元権限を使用するサービスの構成に関する詳細情報については、 呼び出し元権限を使用したコンテナー内部からのSnowflakeへの接続 をご参照ください。
コンテナを使用するアプリでは、Snowpark Container Services サービスは、アプリの権限(所有者の権限)またはサービスの呼び出し元の権限(制限された呼び出し元権限)で実行できます。ただし、service _user_ roleではなく、 service _owner_ roleがアプリです。呼び出し元グラントを付与する場合、コンシューマーは次の例に示すように、TO APPLICATION 句を使用してアプリを指定します。
GRANT CALLER USAGE ON DATABASE consumer_db TO APPLICATION hello_snowflake_app;
この例では、 consumer_db データベースへのアクセスに呼び出し側のロールを使用するために、呼び出し側の権限を制限してサービスを実行することができます。
アプリ内の制限された呼び出し元権限の制限¶
アプリ内で制限された呼び出し元権限を使用する場合、以下の制限が適用されます。
制限された呼び出し元の権限に関する一般的な制限¶
実行可能ファイルに対する制限付き呼び出し元権限の一般的な制限については、 呼び出し元権限が制限された実行ファイルの制限事項 をご参照ください。そこにリストされている制限は、アプリにも適用されます。
アプリの追加制限¶
制限された呼び出し元の権限に関する一般的な制限に加えて、アプリには以下の制限があります。
アプリ内の実行ファイルでは、 制限のない の呼び出し元権限はサポートされていません。
以下のコマンドを実行できません。
SHOW ROLES
SHOW USERS
SHOW [CALLER] GRANTS
SHOW AVAILABLE LISTINGS
以下の関数を実行できません:.
ALL_USER_NAMES
GET_USERS_FOR_COLLABORATION
CURRENT_IP_ADDRESS
CURRENT_AVAILABLE_ROLES
CURRENT_SECONDARY_ROLES
SYSTEM$ALLOWLIST (または、非推奨の SYSTEM$WHITELIST)
永続リファレンス関数はサポートされていません。
ステージ上のオブジェクトへの相対パスはサポートされていません。
制限された呼び出し元権限の実行可能ファイルは、アプリ内部のオブジェクトにアクセスできません。
所有者権限を持つ実行ファイルは、無制限の呼び出し元権限を使用する他の実行ファイルを呼び出すことはできません。
アプリケーションが所有する所有者権限を持つ実行可能ファイルは、制限された呼び出し元権限を持つ実行可能ファイルを呼び出すことができますが、これらの実行可能ファイルもアプリが所有している必要があります。たとえば、所有者権限を持つアプリのストアドプロシージャは、制限された呼び出し元権限を持つコンシューマーのストアドプロシージャを呼び出すことはできません。
アプリ内の制限された呼び出し元権限プロシージャからの請求関数の呼び出し¶
SYSTEM$CREATE_BILLING_EVENT や SYSTEM$CREATE_BILLING_EVENTS のような請求関数を RCR 実行ファイルから呼び出すことはできません。アプリ内の実行可能ファイル(RCR)からこれらの関数を呼び出すには、所有者の権限プロシージャにこれらの関数を含め、制限された呼び出し元の権限プロシージャからプロシージャを呼び出します。
知的財産権の保護と呼び出し元の権限制限¶
所有者権限のストアドプロシージャを含むアプリは、アプリの内部実装に関する情報を冗長化します。詳細については、 プロバイダーの知的財産を保護する をご参照ください。
制限された呼び出し元権限を持つストアドプロシージャでは、アプリに関する内部情報もマスキングされます。特にこれは、次のコマンド、ビュー、および関数に適用され、多くの情報がマスキングされます。
DESCRIBE PROCEDURE コマンド
Information Schemaの PROCEDURES ビュー
Account Information Schemaの PROCEDURES ビュー
GET_DDL 関数
しかし、所有者権限を持つストアドプロシージャとは異なり、制限された呼び出し元権限を使用するプロシージャは、クエリ履歴とクエリプロファイルからの情報を再編集しません。
制限された呼び出し元権限を使用するアプリの開発¶
一般に、MANAGE CALLER GRANTS 権限が付与されたロールのみが、実行可能ファイルに呼び出し元グラントを付与することができます。ただし、Snowflake Native App の開発ライフサイクル中は、プロバイダーがアプリを頻繁に作成してドロップしなければならないことがあります。Snowflake Native Apps は、:ref:` 開発モードのアプリ <label-native_apps_dev_mode>` の呼び出し元グラントを作成するためのメカニズムを提供します。
プロバイダーは、 MANAGE CALLER GRANTS を使用せずにロールを使用して、アプリに発信者権限を付与することができます。ただし、そのためには以下のすべてが必要です:
アプリは 開発モード で作成する必要があります。
現在のロールは、ロール階層内のアプリ所有者ロールを持っています。
アプリ所有者ロールは、付与される呼び出し元グラントのスーパーセットを持っています。
注釈
ALL CALLER PRIVILEGES 権限は、どのような発信者権限セットの上位セットです。
スーパーセットの要件は、 INHERITED CALLER を通して、通常、特定のコンテナーの下にある特定のタイプの現在および将来のすべてのオブジェクトを対象とする補助金では満たすことができません。詳細については、 GRANT CALLER をご参照ください。
この要件を満たすには、付与される呼び出し元グラントは、アプリ所有者ロールに付与される呼び出し元グラントによって明示的にカバーされなければなりません。
アプリ開発者が開発モードのアプリに呼び出し元権限を付与できるようにします。¶
アプリ所有者ロールが開発モードのアプリに特定の呼び出し元グラントのセットを許可するには、 ACCOUNTADMIN ロールまたは MANAGE CALLER GRANTS 権限を付与されたロールを持つユーザーが、まずアプリ所有者ロールにグラントのセットをカバーする呼び出し元グラントを許可する必要があります。
次の例は、アカウント内のデータベースに対して必要な呼び出し権限をグラントする方法を示しています:
GRANT ALL INHERITED CALLER PRIVILEGES
ON ALL DATABASES IN ACCOUNT
TO ROLE app_dev_role;
このコマンドはすべてのデータベース上のすべての呼び出し元グラントを app_dev_role ロールにグラントします。
注釈
このコマンドは発呼側グラントのみを付与します。アプリ開発者がまだアクセスを許可されていないオブジェクトにアクセスすることはできません。
開発モードのアプリに対する追加のセキュリティ対策¶
MANAGE CALLER GRANTS 権限なしでアプリ開発者にオーナーロールを許可することは、アプリ開発プロセスを合理化しますが、潜在的なセキュリティリスクももたらします。このようなリスクを最小限に抑えるため、Snowflakeはアプリの所有者がアプリに必要な発信者Grantを継続して持っているかどうかを確認します。アプリのオーナーが必要な発信者グラントを失うと、アプリもそれを失います。