UDFs とプロシージャのセキュリティプラクティス

このトピックでは、セキュアなユーザー定義関数(UDFs)とプロシージャを作成するためのベストプラクティスについて説明します。

このトピックの内容:

UDF ハンドラーのプラクティス

関数またはメソッド(および呼び出すライブラリ関数またはメソッド)は純粋関数として機能する必要があり、受信したデータのみに作用し、そのデータに基づいて、副作用を引き起こすことなく値を返します。コードは、妥当な量のメモリとプロセッサ時間を消費することを除いて、基になるシステムの状態に影響を与える可能性がないようにします。

プロシージャおよび UDF ハンドラーのプラクティス

ハンドラーコードは、制限されたエンジン内で実行されます。使用するコードも、呼び出すライブラリメソッド内のコードも、次のような禁止されているシステムコールを呼び出さないようにしてください。

  • プロセス制御。たとえば、プロセスをフォークすることはできません。(ただし、複数のスレッドは使用可。)

  • ハンドラーが実行されているファイルシステムへのアクセス。

    次の例外を除いて、ハンドラーはファイルを読み取ったり、書き込んだりすることはできません。

    • ハンドラーは、 IMPORTS 句で指定されたステージングされたファイルを読み取ることができます。詳細については、 CREATE FUNCTION または CREATE PROCEDURE をご参照ください。

    • ハンドラーは、ログファイルなどのファイルを /tmp ディレクトリに書き込むことができます。

      各クエリは、独自の /tmp が保存されている独自のメモリバックアップファイルシステムを取得するため、異なるクエリでファイル名が競合することはありません。

      ただし、1つのクエリが複数の UDF を呼び出し、それらの UDFs が同じファイル名に書き込もうとすると、クエリ内で競合が発生する可能性があります。

      注釈

      また、Python UDFsは別々のワーカープロセスで並行して実行される可能性があるため、/tmpディレクトリへの書き込みには注意が必要です。

      ファイルの書き込みの詳細については、 ファイルの記述 をご参照ください。例については、 ステージングされたファイルの解凍 をご参照ください。

  • ネットワークアクセス。

    ハンドラーを使用してソケットを作成することはできませんが、ハンドラーを使用して 外部ネットワークのリソースにアクセス することはできます。

    注釈

    Snowflake JDBC ドライバーのコードを使用してデータベースにアクセスすることはできません。UDF 自体がSnowflakeのクライアントとして機能することはできません。

JavaまたはScalaのハンドラーの場合

  • JNI (Java Native Interface)の使用はサポートされていません。Snowflakeは、(Javaバイトコードではなく)ネイティブコードを含むライブラリのロードを禁止しています。

  • 政府リージョン 内で使用される場合、Java UDFs は、連邦情報処理標準(140-2)(FIPS 140-2)要件を満たすように検証された暗号化アルゴリズムをサポートしています。Java用の BouncyCastle 暗号化 API の FIPS 承認済みモードで許可されている暗号化アルゴリズムのみを使用できます。FIPS 140-2の詳細については、 FIPS 140-2 をご参照ください。