SELECTSELECT

SELECT

Gerenciamento de Secrets no Snowflake: Guia Passo a Passo

By Jeff SkoldbergJan 24, 20254 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

O que são Secrets no Snowflake?

No Snowflake, um Secret é um objeto no nível do schema que permite armazenar informações sensíveis, como chaves de API e senhas.

Por que esse recurso existe?

Nos últimos tempos, o Snowflake lançou vários recursos que viabilizam o desenvolvimento de aplicações e pipelines de dados direto dentro do Snowflake:

  • O Snowpark Container Services permite executar aplicações personalizadas em qualquer linguagem de programação.
  • O Snowpark for Python vem se tornando uma escolha popular para tarefas de engenharia de dados, inclusive pipelines ELT/ETL completos.
  • Agora dá para enviar alertas por e-mail, Slack ou Microsoft Teams (via webhook).
  • O Snowflake passou a permitir chamadas de API para a internet pública, e muita gente está animada para usar as APIs da OpenAI dentro da sua conta Snowflake.

Todos esses cenários exigem armazenar e acessar secrets para se autenticar em diferentes aplicações e serviços.

Vantagens de gerenciar Secrets no Snowflake

  • Os secrets criados no Snowflake usam o mesmo RBAC do Snowflake com o qual você já está acostumado (por exemplo, grant usage on secret to role <role>).
  • O secret fica ao lado do código da sua aplicação ou pipeline — sem precisar manter um sistema à parte.
  • Usar um gerenciador de secrets externo (como o AWS Secrets Manager) seria complicado sem antes ter uma forma simples de se autenticar nesse gerenciador.

Como criar um Secret no Snowflake

Há 4 tipos de secrets que podem ser criados no Snowflake, e a DDL muda um pouco conforme o tipo.

OAuth:

Sintaxe

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

Exemplo

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

Provedor de nuvem:

Sintaxe:

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

Exemplo:

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

Basic Auth:

Sintaxe:

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

Exemplo:

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

String genérica:

Sintaxe:

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

Exemplo:

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

Como usar um Secret do Snowflake no seu código?

Os secrets só podem ser recuperados via Java ou Python. Se você hospeda uma aplicação no Snowpark Container Services em outra linguagem, vai precisar de um pequeno módulo em Java ou Python para buscar o secret e devolver o valor para a sua aplicação.

Veja um exemplo de como buscar um secret com Python.

Passo 1: crie uma função para buscar secrets pelo nome

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

Passo 2: chame a função:

1SELECT get_secret_by_name('jeffs_credentials');

Como usar Secrets em Notification Integrations / Webhooks:

O Snowflake oferece um jeito simples de passar um secret para Notification Integrations e enviar alertas via webhook (Slack, Microsoft Teams etc.).

Basta informar o nome totalmente qualificado database.schema.<secret_name> no argumento WEBHOOK_SECRET do comando create notification integration. Veja um exemplo:

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

Gerenciando Secrets no Snowflake

Listar todos os Secrets

Para listar todos os secrets, use o 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

Listar todos os Secrets no Snowflake

Excluir um Secret

Para excluir um secret, use o 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

Listar todos os Secrets no Snowflake

Alterar um Secret

O alter secret serve para rotacionar chaves e senhas ou alterar qualquer outro aspecto do secret.

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

Descrever um Secret

Ao descrever um secret com describe secret <fully qualified secret name>, você recebe os seguintes 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

Listar todos os Secrets no Snowflake

Gerenciar secrets direto no Snowflake é uma forma poderosa de simplificar o uso de informações sensíveis ao desenvolver aplicações, pipelines ou alertas dentro do próprio Snowflake.

No próximo artigo, vamos colocar esse conhecimento em prática criando um alerta do Slack no Snowflake.

Jeff é Consultor de Dados e Analytics com mais de 15 anos de experiência em automatizar insights e usar dados para conduzir processos de negócio. No lado técnico, é especialista em Snowflake + dbt + Tableau. No lado de negócio, acumula experiência em Serviços Públicos, Ensaios Clínicos, Editorial, CPG e Manufatura. Fale com ele quando quiser: [email protected].