Configurer des serveurs d’autorisation personnalisés pour External OAuth

Cette rubrique décrit comment créer une intégration de sécurité External OAuth dans Snowflake, afin que les clients puissent accéder aux données Snowflake en s’authentifiant auprès d’un serveur d’autorisation personnalisé.

Si votre serveur d’autorisation est un fournisseur d’identité pris en charge (IdP) plutôt qu’un fournisseur personnalisé, consultez la rubrique consacrée à la configuration de cet IdP spécifique.

Dans ce chapitre :

Exigences de charge utile de jeton External OAuth

Le jeton d’accès que les serveurs d’authentification personnalisés envoient à Snowflake doit contenir les informations de charge utile suivantes. 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.

Snowflake prend en charge la spécification de n’importe quel caractère unique pour le délimiteur, tel qu’un espace (c’est-à-dire ' '), en définissant la propriété EXTERNAL_OAUTH_SCOPE_DELIMITER lors de la création ou de la modification de l’intégration de sécurité External OAuth pour les serveurs d’autorisation personnalisés.

Contactez le support Snowflake pour activer cette propriété dans votre compte Snowflake.

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 personnalisé 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"
  ]
}
Copy

Procédure de configuration

Les étapes suivantes supposent que votre serveur d’autorisation 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 serveurs d’autorisation personnalisés.

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é External OAuth.

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

Consultez vos politiques de sécurité internes avant de configurer un serveur d’autorisation personnalisé afin de vous assurer que votre organisation respecte toutes les réglementations et exigences de conformité.

Obtenir des valeurs d’environnement de clés pour utiliser External OAuth

Lorsque vous configurez votre IdP et votre serveur d’autorisation, vous devez rassembler les valeurs suivantes pour définir une intégration de sécurité External OAuth :

URL de l’émetteur

Incluez cette URL avec le paramètre external_oauth_issuer.

Clé publique RSA

Incluez cette valeur avec le paramètre external_oauth_rsa_public_key.

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

Vous pouvez régler cette valeur sur scp ou scope. Par défaut, cette valeur est scp.

Vous pouvez régler la valeur du paramètre external_oauth_scope_mapping_attribute sur cette valeur.

Si vous n’utilisez pas la valeur par défaut, scp, réglez la valeur du paramètre external_oauth_scope_mapping_attribute sur scope.

Pour plus d’informations, reportez-vous à Exigences de charge utile de jeton External OAuth.

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 paramètre external_oauth_user_mapping_claim.

Attribut utilisateur Snowflake

L’attribut dans Snowflake pour identifier les utilisateurs. Incluez cette valeur dans le paramètre external_oauth_snowflake_user_mapping_attribute.

Créer une intégration de sécurité External OAuth dans Snowflake

Cette étape crée une intégration de sécurité External OAuth dans Snowflake. L’intégration de la sécurité External OAuth garantit que Snowflake peut communiquer de manière sécurisée avec les jetons d’accès de votre serveur d’autorisation personnalisé, et permettre aux utilisateurs d’accéder aux données Snowflake en fonction de leur rôle d’utilisateur associé au jeton d’accès. 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é External OAuth sont sensibles à la casse et les valeurs que vous insérez dans l’intégration de sécurité External OAuth doivent correspondre à ces valeurs dans votre environnement. Si la casse d’une valeur ne correspond pas, le jeton d’accès ne sera pas validé, ce qui entraînera l’échec d’une tentative d’authentification.

Créer une intégration de sécurité External OAuth dans Snowflake

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

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 (External OAuth).

Utilisation du rôle ANY avec External 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;
    
    Copy
    revoke USE_ANY_ROLE on integration external_oauth_1 from role1;
    
    Copy

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'
    ...
Copy

Utilisation de rôles secondaires avec External OAuth

La portée souhaitée pour le rôle primaire est transmise dans le jeton externe : soit le rôle par défaut de l’utilisateur (session:role-any), soit un rôle spécifique qui a été accordé à l’utilisateur (session:role:<nom_rôle>).

Par défaut, Snowflake n’active pas les rôles secondaires par défaut pour un utilisateur (c’est-à-dire le DEFAULT_SECONDARY_ROLES) de la session.

Pour activer les rôles secondaires par défaut pour un utilisateur dans une session et autoriser l’exécution de la commande USE SECONDARY ROLES tout en utilisant External OAuth, effectuez les étapes suivantes :

  1. Configurez l’intégration de la sécurité pour la connexion. Définissez la valeur du paramètre EXTERNAL_OAUTH_ANY_ROLE_MODE comme ENABLE ou ENABLE_FOR_PRIVILEGE lorsque vous créez l’intégration de sécurité (à l’aide de CREATE SECURITY INTEGRATION) ou ultérieurement (à l’aide de ALTER SECURITY INTEGRATION).

  2. Configurez le serveur d’autorisation pour passer la valeur statique de session:role-any dans l’attribut scope du jeton. Pour plus d’informations sur le paramètre de scope, voir Présentation de External OAuth.

Utilisation de la redirection des clients avec External OAuth

Snowflake prend en charge l’utilisation de la redirection des clients avec External OAuth, y compris l’utilisation de la redirection des clients et External OAuth avec les clients Snowflake pris en charge.

Pour plus d’informations, voir Rediriger les connexions du client.

Utilisation de politiques réseau avec External OAuth

Actuellement, les politiques réseau ne peuvent pas être ajoutées à votre intégration de sécurité OAuth externe. Cependant, vous pouvez toujours mettre en œuvre des politiques de réseau qui s’appliquent largement à l’ensemble du compte Snowflake.

Si votre cas d’utilisation nécessite une politique réseau spécifique à l’intégration de sécurité OAuth, utilisez Snowflake OAuth. Cette approche permet à la politique réseau OAuth de Snowflake d’être distincte des autres politiques réseau qui peuvent s’appliquer au compte Snowflake.

Pour plus d’informations, voir Politiques réseau.

Utilisation de la réplication avec External OAuth

Snowflake prend en charge la réplication et le basculement/la restauration de l’intégration de sécurité External OAuth d’un compte source à un compte cible.

Pour plus de détails, voir Réplication des intégrations de sécurité et des politiques réseau sur plusieurs comptes.

Procédure de test

Pour tester la configuration d’un serveur d’autorisation personnalisé :

  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 2.0

  4. Autorisez le client OAuth 2.0 à faire une demande POST au point de terminaison du 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

    • Inclure les champs d’application

L’exemple de commande demande le rôle personnalisé ANALYST et suppose que session:role:analyst a été défini dans votre serveur d’autorisation personnalisé.

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>
Copy

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_identifier>",
   authenticator="oauth",
   token="<external_oauth_access_token>",
   warehouse="test_warehouse",
   database="test_db",
   schema="test_schema"
)
Copy

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