Utiliser les droits du propriétaire et les droits restreints de l’appelant dans une application

Cette rubrique décrit comment configurer une application pour qu’elle utilise les droits du propriétaire et les droits restreints de l’appelant.

À propos des droits du propriétaire et des droits restreints de l’appelant dans une application

Dans une Snowflake Native App, les exécutables s’exécutent avec les droits du propriétaire ou les droits restreints de l’appelant. Dans le contexte du Snowflake Native App Framework, les types d’exécutables suivants sont pris en charge :

  • Procédures stockées appartenant à l’application

  • Services disponibles dans les applications avec conteneurs

Droits du propriétaire:

Les exécutables qui utilisent les droits du propriétaire s’exécutent avec les privilèges accordés au propriétaire de l’exécutable. Par défaut, les exécutables d’une application utilisent les droits du propriétaire. Dans une application, le propriétaire de l’exécutable est l’application elle-même.

Par exemple, la commande CREATE PROCEDURE crée une procédure stockée qui utilise par défaut les droits du propriétaire. Les consommateurs peuvent appeler la procédure stockée s’ils ont obtenu un accès à l’aide des rôles d’application. Si l’application dispose des privilèges nécessaires pour effectuer une tâche, la procédure stockée peut effectuer cette opération.

Pour des informations sur les droits du propriétaire, voir Présentation des procédures stockées des droits de l’appelant et des droits du propriétaire.

Droits de l’appelant:

Les exécutables qui utilisent les droits de l’appelant s’exécutent avec les privilèges accordés à l’appelant. Cependant, pour des raisons de sécurité, le Snowflake Native App Framework ne prend pas en charge les exécutables avec des droits d’appelant.

Restriction des droits de l’appelant:

Les droits restreints de l’appelant permettent à un exécutable de s’exécuter avec les droits de l’appelant, mais limitent les privilèges de l’appelant avec lesquels l’exécutable s’exécute. Avec les droits restreints de l’appelant, un exécutable appartenant à une application ne peut pas s’exécuter avec un privilège spécifique, sauf si un administrateur du compte consommateur l’autorise explicitement à l’aide de la commande GRANT CALLER.

Par souci de concision, les exécutables qui s’exécutent avec des droits d’appelants restreints sont également connus sous le nom d’exécutables RCR.

Pour des informations générales sur les droits restreints de l’appelant, voir Restriction des droits de l’appelant.

Déterminer les exigences d’accès d’une application

Le Snowflake Native App Framework offre aux fournisseurs une certaine souplesse dans la configuration de l’accès aux données et aux exécutables gérés par l’application. La table suivante donne des indications sur le mécanisme à utiliser en fonction des exigences d’accès de l’application :

Accès requis

Obtenir l’accès

Données ou fonctions appartenant à l’application

Utilisez les droits du propriétaire par défaut. Les fournisseurs n’ont pas besoin de demander l’accès auprès du consommateur pour créer ou accéder à des objets appartenant à l’application.

Tables, vues ou fonctions spécifiques dans le compte de consommateur

Demander des références auprès du consommateur

Tables, vues, fonctions et politiques d’accès aux lignes appartenant à un autre utilisateur ou rôle.

Utilisez les droits restreints de l’appelant, qui permettent au consommateur d’autoriser l’accès à ces objets.

Large accès aux bases de données appartenant aux consommateurs

Utiliser les autorisations de rôle de base de données

Requêtes qui accèdent à une combinaison de données du consommateur et du fournisseur

Utiliser conjointement les références et les droits du propriétaire

Objets au niveau du compte

Fournissez des scripts personnalisés contenant des commandes GRANT pour accorder des privilèges pour des objets spécifiques.

Ajoutez la propriété restricted_callers_rights au fichier manifeste

En tant que fournisseur, si vous incluez un exécutable RCR dans une application, Snowflake vous recommande d’le restricted_callers_rights au fichier manifeste, comme le montre l’exemple suivant :

restricted_callers_rights:
  enabled: true
  description: This app includes stored procedure that uses restricted caller's rights.
Copy

Même si restricted_callers_rights n’est pas requis, s’il est présent et que enabled est défini sur true,, Snowsight inclut une section nommée Restricted caller’s rights dans le listing de l’application.

Configurer une procédure ou un service pour utiliser les droits restreints de l’appelant

Pour créer une procédure stockée qui utilise les droits restreints de l’appelant, utilisez la clause EXECUTE AS RESTRICTED CALLER comme indiqué dans l’exemple suivant :

CREATE OR REPLACE PROCEDURE CORE.HELLO()
RETURNS STRING
LANGUAGE SQL
EXECUTE AS RESTRICTED CALLER
AS
BEGIN
  RETURN 'Hello Snowflake!';
END;
Copy

Pour plus d’informations, voir CREATE PROCEDURE.

Utilisation d’un service relatif aux droits restreints de l’appelant dans une application

Pour plus d’informations sur la configuration d’un service afin d’utiliser les droits restreints de l’appelant, voir Connexion à Snowflake depuis un conteneur en utilisant les droits de l’appelant.

Dans une application, un service Snowpark Container Services peut fonctionner avec les privilèges de l’application (droits du propriétaire) ou avec les privilèges de l’appelant du service (droits restreints de l’appelant). Cependant, le rôle du propriétaire du service est l’application au lieu du rôle de l’utilisateur du service. Lors de l’octroi des autorisations de l’appelant, un consommateur spécifie l’application à l’aide de la clause TO APPLICATION, comme le montre l’exemple suivant :

GRANT CALLER USAGE ON DATABASE consumer_db TO APPLICATION hello_snowflake_app;
Copy

Cet exemple permet au service de s’exécuter avec des droits restreints de l’appelant afin d’utiliser le rôle de l’appelant pour accéder à la base de données consumer_db.

Limites relatives aux droits restreints de l’appelant dans une application

Les limites suivantes s’appliquent lors de l’utilisation des droits restreints de l’appelant au sein d’une application.

Limites générales relatives aux droits restreints de l’appelant

Pour les limites générales relatives aux droits restreints de l’appelant sur les exécutables, voir Limites d’un exécutable dont les droits de l’appelant sont restreints. Les limites qui y sont répertoriées s’appliquent également aux applications.

Limites supplémentaires pour les applications

Outre les limites générales relatives aux droits restreints de l’appelant, les applications sont soumises aux limites suivantes :

  • Les droits illimités de l’appelant ne sont pas pris en charge pour les exécutables d’une application.

  • Impossible d’exécuter les commandes suivantes :

    • SHOW ROLES

    • SHOW USERS

    • SHOW [CALLER] GRANTS

    • SHOW AVAILABLE LISTINGS

  • Impossible d’exécuter les fonctions suivantes :

    • ALL_USER_NAMES

    • GET_USERS_FOR_COLLABORATION

    • CURRENT_IP_ADDRESS

    • CURRENT_AVAILABLE_ROLES

    • CURRENT_SECONDARY_ROLES

    • SYSTEM$ALLOWLIST (ou le caractère SYSTEM$WHITELIST obsolète)

  • Les fonctions de référence persistante ne sont pas prises en charge.

  • Les chemins relatifs vers les objets d’une zone de préparation ne sont pas pris en charge.

  • Les exécutables RCR ne peuvent pas accéder aux objets internes de l’application.

  • Les exécutables avec les droits du propriétaire ne peuvent pas appeler d’autres exécutables utilisant les droits illimités de l’appelant.

    Bien que les exécutables avec les droits du propriétaire appartenant à l’application puissent appeler les exécutables RCR, les exécutables RCR doivent également appartenir à l’application. Par exemple, la procédure stockée d’une application avec les droits du propriétaire ne peut pas appeler la procédure stockée d’un consommateur avec les droits restreints de l’appelant.

Appel de fonctions de facturation à partir d’une procédure de droits restreints de l’appelant dans une application

Les fonctions de facturation telles que SYSTEM$CREATE_BILLING_EVENT ou SYSTEM$CREATE_BILLING_EVENTS ne peuvent pas être appelées à partir d’un exécutable RCR. Pour appeler ces fonctions à partir d’un exécutable RCR dans une application, incluez ces fonctions dans une procédure relative aux droits du propriétaire et appelez la procédure à partir de la procédure relative aux droits restreints de l’appelant.

Protection de la propriété intellectuelle et droits restreints de l’appelant

Les applications qui incluent des procédures stockées relatives aux droits du propriétaire expurgent les informations relatives à la mise en œuvre interne de l’application. Pour plus d’informations, voir Protection de la propriété intellectuelle des fournisseurs.

Les procédures stockées avec des droits restreints de l’appelant expurgent également des informations internes sur l’application. Cela est particulièrement vrai pour les commandes, vues et fonctions suivantes, dont la plupart des informations sont expurgées :

Toutefois, contrairement aux procédures stockées avec droits du propriétaire, les procédures utilisant des droits restreints de l’appelant n’expurgent pas les informations de l’historique des requêtes et des profils des requêtes.

Développement d’applications qui utilisent les droits restreints de l’appelant

En général, seuls les rôles ayant reçu le privilège MANAGE CALLER GRANTS peuvent accorder les autorisations de l’appelant à un exécutable. Toutefois, au cours du cycle de développement d’une application Snowflake Native App, les fournisseurs peuvent être amenés à créer et à supprimer l’application fréquemment. Le Snowflake Native App Framework fournit un mécanisme de création d’autorisations de l’appelant pour une application en mode de développement.

Les fournisseurs peuvent utiliser un rôle sans le privilège MANAGE CALLER GRANTS pour accorder les autorisations de l’appelant à une application. Toutefois, cela exige que tous les éléments suivants soient réunis :

  • L’application doit être créée en mode de développement.

  • Le rôle actuel a le rôle de propriétaire de l’application dans la hiérarchie des rôles.

  • Le rôle du propriétaire de l’application dispose d’un sur-ensemble d’autorisations de l’appelant qui sont accordées.

    Note

    Le privilège ALL CALLER PRIVILEGES est un sur-ensemble de tout ensemble de privilèges de l’appelant.

L’exigence relative au sur-ensemble ne peut pas être satisfaite par les autorisations INHERITED CALLER qui couvrent normalement tous les objets actuels et futurs d’un type particulier dans le cadre d’un conteneur spécifique. Pour plus d’informations, voir GRANT CALLER.

Pour satisfaire à cette exigence, les autorisations de l’appelant accordées doivent être explicitement couvertes par les autorisations de l’appelant accordées au rôle du propriétaire de l’application.

Autoriser les développeurs de l’application à accorder les droits de l’appelant à une application en mode de développement

Pour permettre à un rôle de propriétaire d’application d’accorder un ensemble d’autorisations de l’appelant à une application en mode de développement, un utilisateur avec le rôle ACCOUNTADMIN ou un rôle avec le privilège MANAGE CALLER GRANTS doit d’abord accorder les autorisations de l’appelant qui couvrent l’ensemble des autorisations au rôle de propriétaire de l’application.

L’exemple suivant montre comment accorder les privilèges requis de l’appelant pour les bases de données d’un compte :

GRANT ALL INHERITED CALLER PRIVILEGES
  ON ALL DATABASES IN ACCOUNT
  TO ROLE app_dev_role;
Copy

Cette commande accorde toutes les autorisations de l’appelant sur toutes les bases de données au rôle app_dev_role.

Note

Cette commande accorde uniquement les autorisations de l’appelant. Elle ne permet pas au développeur de l’application d’accéder à un objet auquel il n’est pas autorisé à accéder.

Mesures de sécurité supplémentaires pour les applications en mode de développement

Le fait d’accorder aux développeurs de l’application des rôles de propriétaire sans le privilège MANAGE CALLER GRANTS permet de rationaliser le processus de développement des applications, mais cela introduit également des risques potentiels pour la sécurité. Pour minimiser ces risques, Snowflake vérifie que le propriétaire de l’application continue de disposer des autorisations requises de l’appelant pour l’application. Si le propriétaire de l’application perd les autorisations requises de l’appelant, l’application les perd également.