Pratiques de sécurité pour UDFs et procédures

Cette rubrique décrit les meilleures pratiques pour écrire des fonctions définies par l’utilisateur (UDFs) et des procédures sécurisées.

Dans ce chapitre :

Pratiques pour les gestionnaires UDF

Votre fonction ou méthode (et toute fonction ou méthode de bibliothèque que vous appelez) doit se comporter comme une fonction pure, agissant uniquement sur les données qu’elle reçoit et renvoyant une valeur basée sur ces données, sans provoquer d’effets secondaires. Votre code ne doit pas tenter d’affecter l’état du système sous-jacent, si ce n’est en consommant une quantité raisonnable de mémoire et de temps processeur.

Pratiques pour la procédure et les gestionnaires UDF

Le code du gestionnaire s’exécute dans un moteur restreint. Ni votre code ni le code des méthodes de la bibliothèque que vous utilisez ne doit effectuer d’appels système interdits, notamment :

  • Contrôle des processus. Par exemple, vous ne pouvez pas faire bifurquer un processus. (Toutefois, vous pouvez utiliser plusieurs fils).

  • Accès au système de fichiers sur lequel le gestionnaire s’exécute.

    À l’exception des cas suivants, un gestionnaire ne doit pas lire ou écrire de fichiers :

    • Un gestionnaire peut lire les fichiers en zone de préparation et spécifiés dans la clause IMPORTS. Pour plus d’informations, voir CREATE FUNCTION ou CREATE PROCEDURE.

    • Un gestionnaire peut écrire des fichiers, tels que des fichiers journaux, dans le répertoire /tmp.

      Chaque requête dispose de son propre système de fichiers sauvegardés en mémoire dans lequel son propre /tmp est stocké, de sorte que des requêtes différentes ne peuvent pas avoir de conflits de noms de fichiers.

      Cependant, des conflits au sein d’une requête sont possibles si une seule requête appelle plusieurs UDF et que ces UDFs essaient d’écrire dans le même nom de fichier.

      Note

      De plus, comme les UDFs Python peut s’exécuter en parallèle dans des processus de travail distincts, vous devez être prudent lorsque vous écrivez dans le répertoire /tmp.

      Pour plus d’informations sur l’écriture de fichiers, voir Écriture de fichiers. Pour un exemple, voir Décompression d’un fichier en zone de préparation.

  • Accès au réseau.

    Vous ne pouvez pas utiliser un gestionnaire pour créer des sockets, mais vous pouvez utiliser un gestionnaire pour accéder à des ressources sur un réseau externe.

    Note

    Vous ne pouvez pas utiliser le code du pilote JDBC de Snowflake pour accéder à la base de données. Votre UDF ne peut pas elle-même agir comme un client de Snowflake.

Pour les gestionnaires en Java ou Scala

  • L’utilisation de JNI (Java Native Interface) n’est pas pris en charge. Snowflake interdit le chargement de bibliothèques qui contiennent du code natif (par opposition au bytecode Java).

  • Lorsqu’elles sont utilisées au sein d’une région gouvernementale, les UDFs Java prennent en charge des algorithmes de chiffrement validés pour répondre aux exigences de la norme Federal Information Processing Standard (140-2) (FIPS 140-2). Seuls les algorithmes cryptographiques autorisés dans le mode approuvé FIPS de l’API de la cryptographie BouncyCastle pour Java peuvent être utilisés. Pour plus d’informations sur la norme FIPS 140-2, voir FIPS 140-2.