Configurer des clients personnalisés pour OAuth externe

Ce chapitre décrit comment configurer Snowflake en tant que ressource OAuth et un client personnalisé en tant que serveur d’autorisation externe OAuth pour permettre un accès automatique sécurisé aux données Snowflake.

Dans ce chapitre :

Vue d’ensemble

Snowflake prend en charge une intégration personnalisée pour les fournisseurs d’identité (IdPs) qui ne sont pas autrement pris en charge pour vérifier les utilisateurs et générer des jetons d’accès OAuth pour permettre un accès automatique sécurisé aux données Snowflake.

Exigences de charge utile de jeton OAuth externe

Pour les clients personnalisés OAuth externes, le tableau suivant répertorie les informations de charge utile que le jeton d’accès OAuth externe doit contenir pour que Snowflake traite le jeton d’accès. Pour plus d’informations sur la colonne Réclamations, voir Réclamations JWT.

Réclamations

Description

scp

Champs d’application. Une liste des champs d’application dans le jeton d’accès.

scope

Champs d’application. Une chaîne de champs d’application séparés par des virgules dans le jeton d’accès.

aud

Audience. Identifie les destinataires auxquels le jeton d’accès est destiné en tant que URI de chaîne.

exp

Heure d’expiration. Identifie l’heure d’expiration à partir de laquelle le jeton d’accès ne doit pas être accepté pour le traitement.

iss

Émetteur. Identifie le principal qui a émis le jeton d’accès sous la forme d’un URI de chaîne.

iat

Émis à. Requis. Identifie l’heure à laquelle le JWT a été émis.

Note

Snowflake prend en charge la revendication nbf (pas avant) qui identifie l’heure avant laquelle le jeton d’accès ne doit pas être accepté pour le traitement.

Si votre serveur d’autorisation prend en charge la revendication nbf (pas avant), vous pouvez facultativement inclure la revendication nbf dans le jeton d’accès.

Pour vérifier que votre jeton contient les informations requises, vous pouvez tester le jeton sur le site JSON Web Tokens .

En tant qu’exemple représentatif, l’interface PAYLOAD: DATA affiche la charge utile du jeton comme suit.

{
  "aud": "<audience_url>",
  "iat": 1576705500,
  "exp": 1576709100,
  "iss": "<issuer_url>",
  "scp": [
    "session:role:analyst"
  ]
}

Procédure de configuration

Les étapes suivantes supposent que votre IdP et votre environnement peuvent être configurés pour obtenir les valeurs nécessaires pour créer l’intégration de sécurité Snowflake.

Important

Les étapes de ce chapitre sont un exemple représentatif de la configuration des clients personnalisés pour les OAuth externes.

Vous pouvez configurer votre environnement sur n’importe quel état souhaité et utiliser n’importe quel flux OAuth à condition que vous puissiez obtenir les informations nécessaires pour l” intégration de sécurité (dans ce chapitre).

Notez que les étapes suivantes servent de guide pour obtenir les informations nécessaires à la création de l’intégration de sécurité dans Snowflake.

Assurez-vous de consulter vos politiques de sécurité internes concernant la configuration d’un serveur d’autorisation pour vous assurer que votre organisation respecte toutes les réglementations et exigences de conformité nécessaires.

Étape 1 : Obtenir des valeurs d’environnement clés pour utiliser OAuth externe

Configurez votre IdP et votre serveur d’autorisation. Il est nécessaire d’identifier les valeurs suivantes à inclure dans l’intégration de sécurité Snowflake à l’étape suivante.

URL de l’émetteur

Incluez cette URL avec le paramètre external_oauth_issuer.

Clé publique RSA

Incluez cette valeur avec le external_oauth_rsa_public_key_value.

URLs d’audience

Si plusieurs URL d’audiences sont nécessaires, séparez chaque URL par une virgule dans le paramètre external_oauth_audience_list.

Attribut de champ d’application

Cette valeur est configurable pour utiliser scp ou scope. Incluez cette valeur dans external_oauth_scope_mapping_attribute. Pour plus d’informations, voir Exigences de charge utile de jeton OAuth externe.

Attribut utilisateur

Cet attribut fait référence à un attribut permettant d’identifier les utilisateurs de votre IdP. Incluez cette valeur d’attribut dans le external_oauth_user_mapping_claim.

Attribut utilisateur Snowflake

L’attribut dans Snowflake pour identifier les utilisateurs. Incluez cette valeur dans external_oauth_snowflake_user_mapping_attribute.

Étape 2 : Créer un serveur d’autorisation OAuth dans Snowflake

Cette étape crée une intégration de sécurité dans Snowflake. L’intégration de sécurité garantit que Snowflake peut communiquer en toute sécurité avec et valider les jetons de votre IdP, et fournir l’accès aux données Snowflake appropriées aux utilisateurs en fonction du rôle d’utilisateur associé au jeton OAuth. Pour plus d’informations, voir CREATE SECURITY INTEGRATION.

Important

Seuls les administrateurs de compte ou un rôle disposant du privilège global CREATE INTEGRATION peuvent exécuter cette commande SQL.

Les valeurs des paramètres d’intégration de sécurité sont sensibles à la casse et les valeurs que vous insérez dans l’intégration de sécurité doivent correspondre à ces valeurs dans votre environnement. Si la casse ne correspond pas, il est possible que le jeton d’accès ne soit pas validé, ce qui entraînera l’échec d’une tentative d’authentification.

Créer un serveur d’autorisation OAuth dans Snowflake

create security integration external_oauth_custom
    type = external_oauth
    enabled = true
    external_oauth_type = custom
    external_oauth_issuer = '<your_authorization_server_url>'
    external_oauth_rsa_public_key = '<public_key_value>'
    external_oauth_audience_list=('<audience_url_1>', '<audience_url_2>')
    external_oauth_scope_mapping_attribute = 'scp'
    external_oauth_token_user_mapping_claim='upn'
    external_oauth_snowflake_user_mapping_attribute='login_name';

Modification de votre intégration de sécurité externe OAuth

Vous pouvez mettre à jour votre intégration de sécurité externe OAuth en exécutant une instruction ALTER sur l’intégration de sécurité.

Pour plus d’informations, voir ALTER SECURITY INTEGRATION.

Utilisation du rôle ANY avec un serveur externe OAuth

Dans l’étape de configuration visant à créer une intégration de sécurité dans Snowflake, le jeton d’accès OAuth inclut la définition du champ d’application. Par conséquent, au moment de l’exécution, l’utilisation de l’intégration de sécurité externe OAuth ne permet ni au client OAuth ni à l’utilisateur d’utiliser un rôle non défini dans le jeton d’accès OAuth.

Après avoir validé le jeton d’accès et créé une session, le rôle ANY peut permettre au client et à l’utilisateur OAuth de décider de son rôle. Si nécessaire, le client ou l’utilisateur peut basculer vers un rôle différent de celui défini dans le jeton d’accès OAuth.

Pour configurer le rôle ANY, définissez le champ d’application en tant que SESSION:ROLE-ANY et configurez l’intégration de la sécurité avec le paramètre external_oauth_any_role_mode. Ce paramètre peut avoir trois valeurs de chaîne possibles :

  • DISABLE n’autorise pas le client ou l’utilisateur OAuth à changer de rôle (c’est-à-dire use role <rôle>;). Par défaut.

  • ENABLE permet au client ou à l’utilisateur OAuth de changer de rôle.

  • ENABLE_FOR_PRIVILEGE permet au client ou à l’utilisateur OAuth de changer de rôle uniquement pour un client ou un utilisateur avec le privilège USE_ANY_ROLE. Ce privilège peut être accordé et révoqué à un ou plusieurs rôles disponibles pour l’utilisateur. Par exemple :

    grant USE_ANY_ROLE on integration external_oauth_1 to role1;
    
    revoke USE_ANY_ROLE on integration external_oauth_1 from role1;
    

Définissez l’intégration de la sécurité comme suit :

create security integration external_oauth_1
    type = external_oauth
    enabled = true
    external_oauth_any_role_mode = 'ENABLE'
    ...

Utilisation de politiques réseau avec OAuth externe

Actuellement, les politiques réseau ne peuvent pas être ajoutées à votre intégration de sécurité OAuth externe.

Si votre cas d’utilisation nécessite OAuth et une politique réseau Snowflake, utilisez Snowflake OAuth.

Pour plus d’informations, voir OAuth et politiques réseau.

Procédure de test

Dans le cadre du test de OAuth lors de l’utilisation de clients personnalisés en tant que serveur d’autorisation, vous devez :

  1. Vérifier que l’utilisateur de test existe dans votre IdP et possède un mot de passe.

  2. Vérifier que l’utilisateur de test existe dans Snowflake avec sa valeur d’attribut login_name définie sur <réclamation_mappage_utilisateur_jeton_oauth_externe>.

  3. Enregistrer un client OAuth

  4. Autorisez le client OAuth à faire une demande POST au point de terminaison de jeton personnalisé comme suit :

    • Type d’autorisation défini sur Propriétaire de la ressource

    • En-tête d’autorisation de base HTTP contenant le clientID et le secret

    • Données FORM contenant le nom d’utilisateur et le mot de passe de l’utilisateur

    • Inclure les champs d’application

L’exemple de commande demande à l’analyste et suppose que session:role:analyst a été défini dans votre serveur d’autorisation OAuth.

Voici un exemple pour obtenir un jeton d’accès en utilisant cURL.

curl -X POST -H "Content-Type: application/x-www-form-urlencoded;charset=UTF-8" \
  --user <OAUTH_CLIENT_ID>:<OAUTH_CLIENT_SECRET> \
  --data-urlencode "username=<IdP_USER_USERNAME>" \
  --data-urlencode "password=<IdP_USER_PASSWORD>" \
  --data-urlencode "grant_type=password" \
  --data-urlencode "scope=session:role:analyst" \
  <IdP_TOKEN_ENDPOINT>

Connexion à Snowflake via OAuth externe

Après avoir configuré votre intégration de sécurité et obtenu votre jeton d’accès, vous pouvez vous connecter à Snowflake en utilisant l’un des éléments suivants :

Remarques :

  • Il est nécessaire de définir le paramètre authenticator sur oauth et le paramètre token sur external_oauth_access_token.

  • Lors du passage de la valeur token en tant que paramètre de requête URL, il est nécessaire d’encoder en URL la valeur token.

  • Lors du passage de la valeur token à un objet Propriétés (par exemple, pilote JDBC), aucune modification n’est nécessaire.

Par exemple, si vous utilisez le connecteur Python, définissez la chaîne de connexion comme indiqué ci-dessous.

ctx = snowflake.connector.connect(
   user="<username>",
   host="<hostname>",
   account="<account_name>",
   authenticator="oauth",
   token="<external_oauth_access_token>",
   warehouse="test_warehouse",
   database="test_db",
   schema="test_schema"
)

Vous pouvez maintenant utiliser OAuth externe pour vous connecter à Snowflake en toute sécurité.