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
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
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
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].