Configurer PingFederate pour OAuth externe

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

Dans ce chapitre :

Procédure de configuration

Les deux étapes suivantes supposent que votre environnement n’a rien configuré concernant les serveurs d’autorisation PingFederate OAuth, les clients OAuth, les champs d’application et les métadonnées nécessaires. Ces étapes sont également un exemple représentatif de la manière de configurer PingFederate.

Les informations de la première étape seront utilisées pour créer une intégration de sécurité dans Snowflake.

Si vous avez déjà un serveur d’autorisation PingFederate et un client configurés, il n’est pas nécessaire de suivre toutes les étapes ci-dessous. Ignorez plutôt la première étape et vérifiez que vous pouvez obtenir les informations souhaitées, créer des champs d’application, affecter des champs d’application à une ou plusieurs politiques et accéder aux métadonnées.

Si vous n’avez pas un serveur et un client d’autorisation PingFederate OAuth configurés, suivez les deux étapes.

Important

Les étapes de ce chapitre sont un exemple représentatif de la configuration de PingFederate pour OAuth externe.

Vous pouvez configurer PingFederate 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 la 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.

L’étape 1 est tirée de la documentation de PingIdentity sur OAuth 2.0. Pour plus d’informations sur la manière dont PingIdentity définit ses termes, son interface utilisateur et les options relatives aux serveurs d’autorisation, consultez le guide PingIdentity suivant :

Étape 1 : Configurer PingFederate

  1. Accédez à la page de téléchargement du serveur PingFederate et téléchargez ou mettez à niveau votre instance PingFederate en fonction de votre système d’exploitation.

  2. Utilisez le guide d’installation PingFederate pour votre système d’exploitation. Après l’installation, accédez à PingFederate.

  3. Créez les champs d’application OAuth en accédant à l’interface Exclusive Scopes dans le panneau OAuth Server.

  4. Pour ajouter un rôle Snowflake en tant que champ d’application, ajoutez le rôle à Scope Value. Le rôle Snowflake doit avoir le préfixe session:role: (par exemple, pour le rôle d’analyste Snowflake, entrez session:role:analyst).

  5. Saisissez une description du champ d’application dans la case Scope Description et cliquez sur Add.

  6. Accédez à l’onglet OAuth Server et créez un nouveau client. Vérifiez les valeurs suivantes.

    Champ

    Valeur

    NAME

    Un nom convivial pour le serveur d’autorisation PingFederate OAuth

    DESCRIPTION

    Une description conviviale pour le serveur d’autorisation PingFederate OAuth

    CLIENT AUTHENTICATION

    CLIENT SECRET

    EXCLUSIVE SCOPES

    Sélectionnez les champs d’application (par ex. rôles Snowflake)

    ALLOWED GRANT TYPES

    Choisissez Refresh Token et Resource Owner Password Credentials

    DEFAULT ACCESS TOKEN MANAGER

    Jetons Web JSON

  7. Accédez à l’onglet Security et exportez le certificat. Extrayez la clé publique du certificat pour l’utiliser dans les étapes suivantes.

  8. Navigate to the Instance Configuration tab under the OAuth Server tab and Access Token Management | Create Access Token Management Instance, and then:

    • Update the ISSUER CLAIM VALUE to the unique identifier referencing this OAuth Authorization Server.

    • Update the AUDIENCE CLAIM VALUE to your Snowflake account URL (e.g. https://<account_identifier>.snowflakecomputing.com). For a list of possible URL formats, see Connexion avec une URL.

  9. Téléchargez le module complémentaire PingFederate OAuth Playground à partir de la section Outils de développement. Ce client exécute des requêtes API.

  10. Installez le module complémentaire OAuth Playground.

Step 2: Create a Security Integration in Snowflake

Cette étape crée une intégration de sécurité dans Snowflake pour garantir que Snowflake peut communiquer avec PingIdentity en toute sécurité, valider les jetons à partir de PingIdentity et fournir l’accès aux données Snowflake approprié aux utilisateurs en fonction du rôle d’utilisateur associé au jeton OAuth.

Exécutez l’instruction suivante dans l’interface Web Snowflake ou dans SnowSQL.

Notez que la valeur de external_oauth_issuer doit être l’identifiant unique défini à l’étape 1.8. Par exemple, si la valeur de l’identificateur unique est 27f10cde-a964-4499-a88c-0c598883e5ad, remplacez <id_unique> par '27f10cde-a964-4499-a88c-0c598883e5ad'. L’identificateur unique doit être entre guillemets simples (verticaux).

Choisissez l’intégration de sécurité qui répond le mieux à votre cas d’utilisation et à vos besoins de configuration. Pour plus d’informations, voir CREATE SECURITY INTEGRATION (External OAuth).

Important

Seuls les administrateurs de compte (c’est-à-dire les utilisateurs dotés du rôle ACCOUNTADMIN) 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.

Create a Security Integration for PingFederate

create or replace security integration external_oauth_pf_1
    type = external_oauth
    enabled = true
    external_oauth_type = ping_federate
    external_oauth_rsa_public_key = '<BASE64_PUBLIC_KEY>'
    external_oauth_issuer = '<unique_id>'
    external_oauth_token_user_mapping_claim = 'username'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';

Cette intégration de sécurité utilise le paramètre external_oauth_rsa_public_key. Snowflake utilise la valeur de la clé publique pour vérifier la signature sur le jeton d’accès JWT.

Create a Security Integration with Audiences

The external_oauth_audience_list parameter of the security integration must match the Audience Claim Value that you specified while configuring PingFederate.

create security integration external_oauth_pf_2
    type = external_oauth
    enabled=true
    external_oauth_type = ping_federate
    external_oauth_issuer = '<ISSUER>'
    external_oauth_rsa_public_key = '<BASE64_PUBLIC_KEY>'
    external_oauth_audience_list = ('<snowflake_account_url>')
    external_oauth_token_user_mapping_claim = 'username'
    external_oauth_snowflake_user_mapping_attribute = 'login_name';

Cette intégration de sécurité utilise le paramètre external_oauth_rsa_public_key. Snowflake utilise la valeur de la clé publique pour vérifier la signature sur le jeton d’accès JWT.

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

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 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 OAuth externe.

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 OAuth et politiques réseau.

Using Replication with External OAuth

Snowflake supports replication and failover/failback of the External OAuth security integration from a source account to a target account.

For details, see Réplication des intégrations de sécurité et des politiques de réseau à travers plusieurs comptes.

Procédure de test

Dans le cadre du test de OAuth en utilisant PingFederate comme serveur d’autorisation, vous devez :

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

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

  3. Accorder le rôle d’analyste à cet utilisateur.

  4. Enregistrer un client OAuth.

  5. Autoriser le client OAuth à faire une demande POST au point de terminaison du jeton PingFederate 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 tous les champs d’application nécessaires.

L’exemple de commande demande à l’analyste et suppose que session:role:analyst a été défini dans PingFederate > OAuth Server > Exclusive Scopes.

Utilisez la commande suivante pour obtenir un jeton d’accès à partir de la commande Ping.

curl -k 'https://10.211.55.4:9031/as/token.oauth2' \
    --data 'client_id=<CLIENT_ID>&grant_type=password&username=<USERNAME>&password=<PASSWORD>&client_secret=<CLIENT_SECRET>&scope=session:role:analyst'

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"
)

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

Revenir au début