SELECTSELECT

SELECT

Gestión de Secrets en Snowflake: guía paso a paso

By Jeff SkoldbergJan 24, 20254 min read

Esta página también está disponible en English, Deutsch, Français, Italiano, 日本語 y Português.

¿Qué son los Secrets de Snowflake?

En Snowflake, un Secret es un objeto a nivel de schema que te permite almacenar información sensible, como API Keys o contraseñas.

¿Por qué existe esta funcionalidad?

En el último tiempo, Snowflake ha lanzado varias funcionalidades que facilitan el desarrollo de aplicaciones y data pipelines directamente dentro de Snowflake:

  • Snowpark Container Services te permite ejecutar aplicaciones personalizadas en cualquier lenguaje de programación.
  • Snowpark for Python se ha vuelto una opción popular para tareas de data engineering, incluyendo pipelines completos de ELT/ETL.
  • Ya se pueden enviar alertas por email, Slack o Microsoft Teams (mediante webhook).
  • Snowflake ahora permite hacer llamadas a APIs en internet público; muchos usuarios están entusiasmados con la posibilidad de usar las APIs de OpenAI desde su cuenta de Snowflake.

Todos estos casos de uso requieren almacenar y consultar secrets para autenticarse con distintas aplicaciones y servicios.

Ventajas de gestionar Secrets en Snowflake

  • Los secrets creados en Snowflake se rigen por el mismo proceso de RBAC de Snowflake que ya conoces (por ejemplo, grant usage on secret to role <role>).
  • El secret convive con el código de tu aplicación o pipeline; no hay que administrar un sistema aparte.
  • Sería complicado usar un gestor de secrets externo (como AWS Secrets Manager) sin tener primero una forma ágil de autenticarse contra ese gestor.

Cómo crear un Secret en Snowflake

En Snowflake se pueden crear 4 tipos de secrets, y el DDL varía ligeramente según el tipo.

OAuth:

Sintaxis

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

Ejemplo

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

Expandir código

Cloud Provider:

Sintaxis:

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

Ejemplo:

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

Basic Auth:

Sintaxis:

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

Ejemplo:

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

Generic String:

Sintaxis:

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

Ejemplo:

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

¿Cómo usar un Secret de Snowflake en tu código?

Los secrets solo se pueden consultar desde Java o Python. Si alojas una aplicación en Snowpark Container Services con otro lenguaje de programación, vas a necesitar un pequeño módulo personalizado en Java o Python que recupere el secret y devuelva el valor a tu aplicación.

Acá tienes un ejemplo para obtener un secret con Python.

Paso 1: crea una función para obtener secrets por nombre

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

Expandir código

Paso 2: invoca la función:

1SELECT get_secret_by_name('jeffs_credentials');

Uso de Secrets en Notification Integrations / Webhooks:

Snowflake ofrece una manera sencilla de pasar un secret a las Notification Integrations cuando se envían alertas a webhooks (Slack, Microsoft Teams, etc.).

Basta con pasar el nombre totalmente calificado database.schema.<secret_name> al argumento WEBHOOK_SECRET de la sentencia create notification integration. Por ejemplo:

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');

Gestión de Secrets en Snowflake

Mostrar todos los Secrets

Puedes listar todos los secrets con el comando show 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

Eliminar un Secret

Para eliminar un secret se usa el comando 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

Modificar un Secret

alter secret sirve para rotar llaves o contraseñas, o para modificar cualquier otro aspecto del secret.

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

Describir un Secret

Al describir un secret con describe secret <fully qualified secret name> se obtienen los siguientes campos:

  • 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

Gestionar los secrets directamente en Snowflake es una forma muy efectiva de simplificar el manejo de información sensible al desarrollar aplicaciones, pipelines o alertas en Snowflake.

En el próximo artículo pondremos en práctica lo aprendido creando una alerta de Slack en Snowflake.

Jeff es Data and Analytics Consultant con más de 15 años de experiencia automatizando insights y usando datos para gobernar procesos de negocio. En lo tecnológico, se especializa en Snowflake + dbt + Tableau. En lo sectorial, cuenta con experiencia en utilities públicas, ensayos clínicos, publishing, CPG y manufactura. Escríbele cuando quieras a [email protected].