SELECTSELECT

SELECT

Gestion des secrets dans Snowflake : guide pas à pas

By Jeff SkoldbergJan 24, 20254 min read

Cette page est également disponible en English, Deutsch, Español, Italiano, 日本語 et Português.

Qu'est-ce qu'un Secret dans Snowflake ?

Dans Snowflake, un Secret est un objet au niveau du schéma qui permet de stocker des informations sensibles telles que des clés API ou des mots de passe.

Pourquoi cette fonctionnalité ?

Snowflake a récemment déployé de nombreuses fonctionnalités qui facilitent le développement d'applications et de pipelines de données directement au sein de la plateforme :

  • Snowpark Container Services permet d'exécuter des applications personnalisées dans n'importe quel langage de programmation.
  • Snowpark for Python s'impose comme un choix populaire pour les tâches d'ingénierie de données, y compris des pipelines ELT/ETL complets.
  • Il est désormais possible d'envoyer des alertes par e-mail, Slack ou Microsoft Teams (via webhook).
  • Snowflake autorise maintenant les appels API vers l'internet public ; nombre d'utilisateurs sont impatients d'exploiter les API d'OpenAI depuis leur compte Snowflake.

Tous ces cas d'usage exigent de stocker des secrets et d'y accéder pour s'authentifier auprès de différentes applications et services.

Les avantages de la gestion des secrets dans Snowflake

  • Les secrets créés dans Snowflake reposent sur le même processus RBAC Snowflake que vous maîtrisez déjà (par exemple grant usage on secret to role <role>).
  • Le secret cohabite avec le code de votre application ou de votre pipeline ; aucun système supplémentaire à gérer.
  • Recourir à un gestionnaire de secrets externe (comme AWS Secrets Manager) serait fastidieux sans disposer au préalable d'une méthode fluide pour s'y authentifier.

Comment créer un Secret Snowflake

Snowflake permet de créer quatre types de secrets, et la syntaxe DDL varie légèrement selon le type.

OAuth :

Syntaxe

CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
  TYPE = OAUTH2
  API_AUTHENTICATION = <security_integration_name>
  OAUTH_SCOPES = ( '<scope_1>' [ , '<scope_2>' ... ] )
  [ COMMENT = '<string_literal>' ]

Exemple

-- Assume an integration exists:
CREATE OR REPLACE SECURITY INTEGRATION my_oauth2_integration
  TYPE = API_AUTHENTICATION
  AUTH_TYPE = OAUTH2
  ENABLED = TRUE
  OAUTH_CLIENT_ID = 'your_client_id'
  OAUTH_CLIENT_SECRET = 'your_client_secret'
  OAUTH_TOKEN_ENDPOINT = 'https://oauth2.example.com/token'
  OAUTH_ALLOWED_SCOPES = ('scope1', 'scope2');

-- create the secret
CREATE OR REPLACE SECRET my_oauth2_secret
  TYPE = OAUTH2
  API_AUTHENTICATION = my_oauth2_integration
  OAUTH_SCOPES = ('scope1', 'scope2')

Afficher le code

Fournisseur cloud :

Syntaxe :

CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
  TYPE = CLOUD_PROVIDER_TOKEN
  API_AUTHENTICATION = '<cloud_provider_security_integration>'
  [ COMMENT = '<string_literal>' ]

Exemple :

-- assume this integration exists called test_integration:
CREATE OR REPLACE SECRET test_secret
 TYPE = CLOUD_PROVIDER_TOKEN
 API_AUTHENTICATION = 'TEST_INTEGRATION';

Authentification basique :

Syntaxe :

CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
  TYPE = PASSWORD
  USERNAME = '<username>'
  PASSWORD = '<password>'
  [ COMMENT = '<string_literal>' ]

Exemple :

CREATE OR REPLACE SECRET my_password_secret
 TYPE = PASSWORD
 USERNAME = 'db_user'
 PASSWORD = 'MySecurePass123!'
 COMMENT = 'Database credentials for application access';

Chaîne générique :

Syntaxe :

CREATE [ OR REPLACE ] SECRET [ IF NOT EXISTS ] <name>
  TYPE = GENERIC_STRING
  SECRET_STRING = '<string_literal>'
  [ COMMENT = '<string_literal>' ]

Exemple :

CREATE OR REPLACE SECRET my_string_secret
 TYPE = GENERIC_STRING
 SECRET_STRING = 'my-secret-api-key-123'
 COMMENT = 'API key for service authentication';

Comment utiliser un Secret Snowflake dans votre code

Les secrets ne peuvent être récupérés qu'en Java ou en Python. Si vous hébergez une application dans Snowpark Container Services dans un autre langage, il vous faudra un petit module dédié en Java ou en Python pour récupérer le secret, puis transmettre sa valeur à votre application.

Voici un exemple de récupération d'un secret en Python.

Étape 1 : créer une fonction pour récupérer un secret par son nom

CREATE OR REPLACE FUNCTION get_secret_by_name(secret_name STRING)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.9
HANDLER = 'get_secret_by_name'
EXTERNAL_ACCESS_INTEGRATIONS = (external_access_integration)
AS
$$
import _snowflake

def get_secret_by_name(secret_name):
    username_password_object = _snowflake.get_username_password(secret_name)

    username_password_dictionary = {}
    username_password_dictionary["Username"] = username_password_object.username

Afficher le code

Étape 2 : appeler la fonction

1SELECT get_secret_by_name('jeffs_credentials');

Utiliser des secrets dans les intégrations de notification et les webhooks

Snowflake offre un moyen simple de transmettre un secret aux intégrations de notification pour envoyer des alertes vers des webhooks (Slack, Microsoft Teams, etc.).

Il suffit de passer le nom pleinement qualifié database.schema.<secret_name> à l'argument WEBHOOK_SECRET de l'instruction create notification integration. Par exemple :

CREATE OR REPLACE NOTIFICATION INTEGRATION my_slack_webhook_int
  TYPE=WEBHOOK
  ENABLED=TRUE
  WEBHOOK_URL='https://hooks.slack.com/services/SNOWFLAKE_WEBHOOK_SECRET'
  WEBHOOK_SECRET=my_secrets_db.my_secrets_schema.my_slack_webhook_secret
  WEBHOOK_BODY_TEMPLATE='{"text": "SNOWFLAKE_WEBHOOK_MESSAGE"}'
  WEBHOOK_HEADERS=('Content-Type'='application/json');

Gérer les secrets dans Snowflake

Lister tous les secrets

La commande show secrets permet de lister tous les secrets.

show secrets; -- shows all secrets in account
show secrets in account; -- verbose way of `show secrets`
show secrets in database analytics; -- shows secrets for a database named analytics

Show all Secrets in Snowflake

Supprimer un secret

Pour supprimer un secret, utilisez la commande drop :

drop secret my_oauth2_secret; -- this works if your worksheet or connection has a database and schema context set.
drop secret <fully qualified secret name> -- this will always work

Show all Secrets in Snowflake

Modifier un secret

La commande alter secret sert à effectuer la rotation des clés ou des mots de passe, ou à modifier toute autre caractéristique du secret.

1alter secret <fully qualitfied secret name> set <parameter> = <value>;

Décrire un secret

La commande describe secret <fully qualified secret name> renvoie les champs suivants :

  • created on
  • name
  • schema_name
  • database_name
  • owner
  • comment
  • secret_type
  • username
  • oauth_access_token_expiry_time
  • oauth_refresh_token_expiry_time
  • oauth_scopes
  • integration_name

Show all Secrets in Snowflake

Gérer les secrets directement dans Snowflake constitue un excellent moyen de simplifier l'utilisation d'informations sensibles lors du développement d'applications, de pipelines ou d'alertes dans la plateforme.

Dans le prochain article, nous passerons à la pratique en créant une alerte Slack dans Snowflake.

Jeff est consultant Data et Analytics, fort de plus de 15 ans d'expérience dans l'automatisation des insights et l'exploitation des données au service des processus métier. Côté technologie, il est spécialisé en Snowflake + dbt + Tableau. Côté secteurs, il a travaillé dans les services publics, les essais cliniques, l'édition, les biens de grande consommation et l'industrie manufacturière. N'hésitez pas à le contacter : [email protected].