SELECTSELECT

SELECT

Snowflake Roles 101: la guida completa al controllo degli accessi

By Jovan SakovićMar 8, 202412 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

Snowflake è diventata una delle protagoniste nel mondo dei dati, offrendo ai clienti una piattaforma data cloud versatile, in grado di abilitare ogni tipo di capacità analitica. Per farlo in modo sicuro e protetto, Snowflake mette a disposizione una suite flessibile di funzionalità per la gestione e il controllo degli accessi.

Conoscere a fondo le best practice di gestione degli accessi a Snowflake è fondamentale. Senza una progettazione attenta, ruoli e grant possono diventare in breve tempo difficili da governare, dando origine a duplicazioni, incoerenze e, in ultima analisi, a rischi per la sicurezza dei Suoi dati. Adottare standard e pattern ben definiti permette di ottenere sicurezza, trasparenza e semplicità.

In questo articolo approfondiamo i concetti chiave e le modalità migliori per gestire gli accessi in Snowflake. Se è un amministratore Snowflake o un data engineer e vuole capire meglio il controllo degli accessi, questo articolo fa per Lei.

Snowflake access control key concepts

I concetti chiave del controllo degli accessi in Snowflake

Snowflake adotta un approccio Role-Based Access Control (RBAC) per gestire ciò che utenti e altri sistemi possono fare e a cosa possono accedere. Nel modello RBAC, avere un determinato ruolo significa ricevere determinati privilegi.

Introduciamo qualche termine:

  • User: un'entità che permette a una persona (o a un servizio) di connettersi a Snowflake.
  • Object: un'entità a cui un User può accedere (ad esempio tabella, view, database), se dispone dei privilegi necessari.
  • Privilege: un'operazione che un User può eseguire su un Object, se il suo Role l'ha ricevuta.
  • Role: un'entità che fa da ponte tra User e Privilege. I Privilege vengono assegnati ai Role, e i Role vengono assegnati agli User.

In sintesi, come riassume la stessa Snowflake:

I privilegi vengono concessi ai ruoli, e i ruoli vengono concessi agli utenti, per specificare le operazioni che gli utenti possono eseguire sugli oggetti del sistema.

Partendo da questi 4 concetti chiave, le sezioni e i diagrammi che seguono si svilupperanno l'uno sull'altro, fino ad arrivare a una configurazione di controllo accessi minimale ma completa.

User

Uno User in Snowflake è un'identità che può connettersi a uno Snowflake Account ed eseguire un insieme di operazioni consentite. Ogni persona del Suo team dati dovrebbe avere uno Snowflake User per connettersi a Snowflake ed eseguire query. Uno Snowflake User può essere usato anche da un sistema di terze parti: ne sono esempi gli strumenti di BI (come Tableau o Looker) o gli strumenti ELT (come Stitch o Fivetran).

In definitiva, ciò che gli Snowflake User possono fare è il fulcro del controllo degli accessi.

Object

Gli Object sono le primitive di Snowflake su cui è possibile concedere l'accesso. Gli Object più immediati sono database, schema e tabelle, ma rientrano in questa categoria anche oggetti a livello di account come warehouse, storage integration e così via.

Snowflake access control objects

Ecco alcuni esempi comuni di Snowflake Object:

Securable Object Livello Descrizione
Database Account-level I database sono gli oggetti chiave che tengono isolati e raggruppati logicamente tutti gli altri securable object.
Schema Database-level Un raggruppamento logico di oggetti come tabelle, view, stage e così via.
Table Schema-level L'oggetto che contiene i dati e occupa storage fisico. Nella maggior parte dei casi, le tabelle sono il fulcro che rende Snowflake davvero utile. Esistono diversi tipi di tabella, ciascuno per casi d'uso specifici.
View Schema-level Una tabella "travestita". Fornisce accesso ai dati senza occupare storage. Una view è definita come una query costruita sopra altre tabelle. Esistono diversi tipi di view, ciascuno per casi d'uso specifici.
Virtual Warehouse Account-level Le principali risorse di compute necessarie per eseguire query o per caricare dati in Snowflake.
Storage Integration Account-level Un oggetto che collega un bucket S3 (e analogamente GCS e Azure Blob storage) a Snowflake, consentendo agli User di caricare o scaricare dati da Snowflake o di interrogare direttamente i contenuti del bucket.
Snowpipe Schema-level Un oggetto che automatizza il caricamento dei dati da S3 (o GCS e Azure Blob storage) nelle tabelle non appena nuovi file arrivano nel bucket.
Stage Schema-level Posizione dei file di dati (CSV, Parquet ecc.) nel cloud storage. Esistono due tipi di stage: interno (cloud storage gestito da Snowflake) ed esterno (cloud storage autogestito).

Privilege

I Privilege sono un concetto essenziale del controllo accessi. Permettono di eseguire una singola operazione, o talvolta un insieme di operazioni, su un oggetto.

Ad esempio, su una Snowflake Table un User potrebbe avere il privilege di eseguire SELECT sui dati, INSERT di righe, DELETE di dati e così via. Su uno Snowflake Database un User potrebbe poter eseguire CREATE SCHEMA oppure MONITOR.

La tabella seguente descrive in breve alcuni dei principali privilege che possono essere concessi sui principali oggetti.

Object Object Privilege Descrizione
Database USAGE Consente di usare e visualizzare il database, ma servono privilegi aggiuntivi per eseguire qualunque azione su di esso.
MONITOR Consente di eseguire il comando DESCRIBE.
CREATE SCHEMA Consente di creare (o clonare) uno schema nel database.
IMPORTED PRIVILEGES Si applica solo ai database condivisi e consente ad altri account role di accedere agli oggetti condivisi. Per approfondire gli imported privileges: https://docs.snowflake.com/en/user-guide/data-share-consumers#option-1-objects-in-a-share-not-associated-with-a-database-role.
Schema USAGE Consente di vedere e usare lo schema, ma servono comunque privilegi aggiuntivi sugli oggetti a livello di schema per visualizzarli o eseguire comandi su di essi.
MONITOR Consente di eseguire il comando DESCRIBE.
CREATE TABLE / CREATE VIEW / CREATE STAGE / CREATE PIPE / CREATE STAGE / CREATE PIPE Consente di creare una table / view / stage / pipe nello schema.
Table SELECT Consente di interrogare la tabella per recuperare i dati.
INSERT Consente di inserire righe nella tabella.
UPDATE Consente di aggiornare i dati esistenti nella tabella.
TRUNCATE Consente di eliminare tutti i dati dalla tabella.
DELETE Consente di eliminare tutte le righe o un sottoinsieme specifico di righe dalla tabella.
View SELECT Consente di interrogare la view per recuperare i dati (indipendentemente dalle tabelle sottostanti e dai privilegi concessi su di esse).
Stage USAGE Consente di usare lo stage esterno in uno statement SQL.
READ Consente di eseguire qualsiasi comando che legge lo stage interno (GET, LIST, COPY INTO).
WRITE Consente di eseguire qualsiasi comando che scrive sullo stage interno (PUT, REMOVE, COPY INTO).

Trova l'elenco completo degli object privilege disponibili per il controllo accessi di Snowflake qui.

Snowflake object privileges

Con questo elenco in mente, quando dovrà fare audit degli accessi Le tornerà utile ricordare che i privilegi vengono concessi a livelli diversi a seconda di dove viene creato un oggetto (ovvero account-level, database-level, schema-level).

Il privilegio di Ownership

Snowflake adotta un approccio Role-Based Access Control (RBAC) […]

👆La prima frase di questa sezione era solo parzialmente vera. Snowflake combina l'RBAC con un concetto chiave di un altro modello di controllo accessi: il Discretionary Access Control (DAC). Nel DAC ogni oggetto deve avere un proprietario.

Nell'implementazione DAC di Snowflake, ogni oggetto è di proprietà del Role usato per crearlo. Un Role che possiede un oggetto ha il privilegio OWNERSHIP su di esso.

È importante chiarire che non sono gli User a possedere gli oggetti, ma i Role. Se tutti gli Analyst del Suo team dati hanno lo stesso Role, gli oggetti creati da un Analyst saranno posseduti da tutti gli Analyst.

Si tenga presente che il privilegio OWNERSHIP su un oggetto può essere trasferito a un altro Role. Potrebbe ad esempio voler trasferire la proprietà di una tabella a un ruolo "più potente" per limitare chi può concederne l'accesso ad altri ruoli.

Privilegi su oggetti futuri

A volte, durante la configurazione iniziale del controllo accessi, alcuni oggetti potrebbero non esistere ancora. Tuttavia, sa già in anticipo che vorrà dare a un certo ruolo l'accesso a quegli oggetti, una volta creati. Snowflake ci consente di muoverci in anticipo concedendo determinati privilegi su oggetti futuri.

Ad esempio, al ruolo ANALYST può essere concesso il privilegio SELECT sulle tabelle future del database GOLDEN_DB, o sulle tabelle future di uno schema specifico. Per maggiori dettagli sulla precedenza dei grant sugli oggetti futuri, consulti questa documentazione di Snowflake.

Role

Può immaginare i role di Snowflake come delle chiavi. 🔑 Ha una chiave di casa, un'altra per l'auto e magari una per l'ufficio. Se ha un vicino di casa fidato, potrebbe avere una copia della chiave di casa Sua (per le emergenze). Le chiavi di casa danno accesso sia a Lei sia al vicino.

Allo stesso modo, in Snowflake, un role concesso a un utente gli dà accesso a varie operazioni e oggetti. Ecco un esempio di come l'organigramma aziendale potrebbe tradursi in Snowflake Role.

Snowflake roles

Tipi di Role

In Snowflake esistono tre tipi principali di Role:

  • account role
  • database role
  • instance role

Esistono inoltre gli application role, legati alle Snowflake Native Application: un argomento stimolante che merita un articolo a sé e che va oltre lo scopo di questo Snowflake Roles 101.

Snowflake roles types

Account Role

I role originari di Snowflake, gli Account Role, sono i role standard che:

  • possono ricevere privilegi su tutti i securable object dell'account,
  • hanno nomi univoci a livello di Account,
  • possono essere concessi a User o ad altri Account Role.

Database Role

Come suggerisce il nome, un Database Role è legato a un Database specifico e:

  • può ricevere solo privilegi sugli oggetti di quel database (schema, tabelle, view ecc.),
  • ha un nome univoco all'interno del Database in cui viene creato,
  • può essere concesso ad altri Database Role (nello stesso Database) e ad Account Role,
  • non può essere concesso direttamente agli User,
  • per impostazione predefinita ha il privilegio USAGE sul proprio database.

Instance Role

Gli Instance Role sono il tipo di role meno utilizzato. Sono legati a una Snowflake Class Instance e vengono concessi agli Account Role, consentendo agli User di eseguire i metodi della Class Instance.

Al momento in cui scriviamo, solo Snowflake può creare Classes. Per maggiori informazioni sulle Snowflake Classes disponibili, consulti questa pagina.

Quale tipo di Role conviene usare?

Se sta muovendo i primi passi, gli Account Role La porteranno molto lontano.

Le cose si fanno interessanti quando inizia a ragionare sui database role e sul loro potenziale per semplificare e standardizzare la configurazione, permettendo al proprietario di un database di gestire autonomamente i privilegi senza bisogno di ACCOUNTADMIN.

Inoltre, se utilizza le Snowflake Shares per condividere i Suoi dati, i database role rendono più facile configurare il controllo accessi.

Gerarchia dei Role

I Role possono essere concessi anche ad altri Role: in questo modo si crea una Role Hierarchy.

Il modo più semplice per definire una gerarchia di Role è con un esempio. Nella gerarchia qui sotto Splinter, con il suo ruolo SYSADMIN, ha il superset dei privilegi dei ruoli DATA_ENG_ROLE, ANALYST_ROLE e DB_MANAGER_ROLE, mentre Kim ha solo i privilegi di DATA_ENG_ROLE e DB_MANAGER_ROLE.

Snowflake roles hierarchy

Gli Account Role predefiniti di Snowflake

Quando crea uno Snowflake account e apre Admin / Users & Roles, vedrà un insieme di role che Snowflake crea per impostazione predefinita. Questi role system-defined non possono essere eliminati, né è possibile modificare l'insieme standard di privilegi assegnato a ciascuno di essi. Hanno tutti uno scopo preciso, e cioè:

  • ACCOUNTADMIN: il ruolo "god-mode", in grado di fare qualsiasi cosa a livello di account. Sia molto selettivo nel concederlo. Si noti che il ruolo ACCOUNTADMIN eredita tutti i privilegi di SECURITYADMIN e SYSADMIN.
  • SECURITYADMIN: a questo ruolo è concesso il privilegio account-level MANAGE GRANTS, che gli permette di concedere (o revocare) grant ad altri ruoli su tutti gli oggetti dell'account. Si noti che il ruolo SECURITYADMIN eredita tutti i privilegi che gli vengono passati dal ruolo USERADMIN.
  • USERADMIN: come suggerisce il nome, serve a creare e gestire utenti (grazie ai privilegi account-level CREATE USER e CREATE ROLE).
  • SYSADMIN: è abilitato a creare tutti gli oggetti dell'account (inclusi database, warehouse e altri oggetti a livello di schema).
  • PUBLIC: tutti gli utenti dell'account ricevono per impostazione predefinita il ruolo PUBLIC, ma se non gli vengono esplicitamente concessi accessi a oggetti non può fare granché. Faccia comunque molta attenzione a non concedergli inavvertitamente privilegi su dati importanti, perché tutti gli utenti dell'account potrebbero accedervi. O, meglio ancora, non conceda alcun privilegio al ruolo PUBLIC. 😉

Snowflake default account roles

Infine, ORGADMIN merita un'attenzione particolare. Si usa per le operazioni a livello di organizzazione, come la creazione di ulteriori Snowflake account, e non si inserisce in modo naturale nella gerarchia predefinita dei role.

Quando si creano role personalizzati e si imposta una gerarchia di role, Snowflake raccomanda che tutti i role personalizzati siano, in ultima analisi, discendenti di SYSADMIN.

Per esperienza, lavorando su molti Snowflake account, capita spesso di vedere la maggior parte degli oggetti del database creati e posseduti da ACCOUNTADMIN. È una pratica in generale sbagliata: indica che si dedica poca attenzione al controllo accessi ed è il segnale che ACCOUNTADMIN viene usato come role predefinito, cosa che può portare a errori distruttivi come la cancellazione di dati o utenti. Tratteremo alcune best practice di controllo accessi nella Parte II di questa serie di articoli. 🙌

Role predefinito dell'utente

Quando si connette a Snowflake, un utente stabilisce una session che, nella maggior parte dei casi, richiede l'impostazione di un role. Se non viene specificato, Snowflake ripiega sul role predefinito dell'utente.

Secondary Role

I secondary role permettono a un utente di sfruttare contemporaneamente le capacità di accesso di più ruoli. La maggior parte dei clienti Snowflake utilizza solo i primary role (un singolo ruolo), ma i secondary role sono una funzionalità potente che può evitare di dover combinare più ruoli.

Così come esegue il comando use role per impostare il primary role in una sessione, può eseguire use secondary roles. La differenza principale è che questo comando accetta due opzioni:

  1. use secondary roles all attiva tutti i ruoli a cui l'utente ha accesso;
  2. use secondary roles none disattiva i secondary role.

Mettiamo tutto insieme

D'accordo, d'accordo: "Mostratemi un po' di SQL!! 💢", La sento.

Componiamo il puzzle con un esempio end-to-end di bootstrap di un nuovo Snowflake account, che abilita Kim e Rufus a utilizzarlo in linea con le loro esigenze.

In sintesi:

  • Creiamo User, Role e il Database.
use role SECURITYADMIN;
create role DATA_ENGINEER_ROLE;
create role DB_MANAGER_ROLE;
create role ANALYST_ROLE;

use role USERADMIN;
create user KIM;

use role SYSADMIN; -- objects are owned by the active role
create database SOURCE_DB;
create warehouse ANALYSIS_WH;
  • I privilegi sui securable object vengono concessi ai Role.
use role SECURITYADMIN;

grant USAGE, MODIFY, CREATE SCHEMA
	on database SOURCE_DB to role DB_MANAGER_ROLE;
grant USAGE on database SOURCE_DB to role ANALYST_ROLE;

grant USAGE, OPERATE
	on warehouse ANALYSIS_WH to role ANALYST_ROLE;
  • I Role vengono collegati in una gerarchia, dando luogo all'ereditarietà dei privilegi.
use role SECURITYADMIN;

grant role DB_MANAGER_ROLE to role DATA_ENGINEER_ROLE;
grant role ANALYST_ROLE to role DATA_ENGINEER_ROLE;
grant role DATA_ENGINEER_ROLE to role SYSADMIN;
  • Gli User ottengono l'accesso ai securable object ricevendo i Role.
use role SECURITYADMIN;

grant role DATA_ENGINEER_ROLE to user KIM;
grant role ANALYST_ROLE to user RUFUS;

Otteniamo così una configurazione che:

  1. consente a Kim di:
  2. creare schemi in SOURCE_DB e utilizzarlo
  3. usare e operare su ANALYSIS_WH
  4. consente a Rufus di:
  5. usare SOURCE_DB (se Si sta chiedendo se manchino privilegi aggiuntivi su schemi e database, ha 💯 ragione, ma li abbiamo omessi per semplicità.)
  6. usare e operare su ANALYSIS_WH

Pur essendo una configurazione molto semplice, quanto sopra Le fornisce tutti i mattoni necessari per implementare il Suo modello RBAC in Snowflake. Nella Parte II, un articolo di seguito a questo, tratteremo le best practice RBAC di Snowflake e Le forniremo alcune raccomandazioni basate sulla nostra esperienza.

Frequently asked
questions

Creare un role
create role FINANCE_ROLE; -- Account role

create database role SOURCE_DB.READ_DB_ROLE; -- Database role
Verificare il role predefinito di un utente
1describe user SELECT_DOGFOOD;
Impostare il role predefinito di un utente

Per aggiornare il role predefinito dell'utente, può eseguire il comando seguente:

1alter user SELECT_DOGFOOD set default_role=DATA_ENG_ROLE;
Visualizzare i role nell'account
1show roles;
Eseguire una query con un role diverso
use role USERADMIN;
drop user EX_EMPLOYEE_USER; -- query requires USERADMIN role
Concedere l'ownership in Snowflake
grant ownership
	on database FIVETRAN_DB
	to role FIVETRAN_ROLE
	copy current grants; -- keeps existing grants on the database

grant ownership
	on all tables
	in schema DEV_ANALYTICS.DBT_KIM
	to role DEV_ROLE
	revoke current grants; -- resets existing grants on all tables

Concedere un role a un utente Snowflake

Ecco un esempio di come concedere il role SYSADMIN a un utente di nome IAN_WHITESTONE:

1grant role SYSADMIN to user IAN_WHITESTONE;
Concedere a un utente l'accesso a un warehouse

Per consentire a un utente di eseguire query su uno Snowflake warehouse, deve prima concedere al role il privilegio usage sul warehouse:

1grant usage on warehouse COMPUTE_XLARGE_WH to role DATA_ENG_ROLE;

Quindi assegnare il role all'utente:

1grant role DATA_ENG_ROLE to user IAN_WHITESTONE;
Concedere un role a un altro role Snowflake

Come abbiamo visto in precedenza, è possibile concedere un role anche a un altro role, invece che a un utente.

1grant role DATA_ENG_ROLE to role SYSADMIN;
Vedere quali privilegi sono stati concessi a un role

Si noti che, eseguendo la query sopra, il role attivo deve essere il role che si sta interrogando oppure uno dei suoi role superiori nella gerarchia.

Visualizzare i role concessi a un utente

Ecco un esempio per visualizzare tutti gli utenti a cui è stato concesso il role ACCOUNTADMIN:

show grants of role ACCOUNTADMIN;

select *
from table(result_scan(last_query_id()))
where "granted_to" = 'USER';
Rimuovere l'accesso a un oggetto

L'opposto di grant è revoke. Ecco come revocare i privilegi a un role:

1revoke USAGE on all databases from role ANALYST_ROLE;
Fare audit di role, grant e privilegi di un utente Snowflake
  1. Audit dei Role concessi a uno User:
1show grants to user HOLISTICS_USERf;

2. Ora che sa quali Role uno User può assumere, può approfondire quali privilegi possiede ciascuno di questi role.

1show grants to role HOLISTICS_ROLE;

Questo approccio può diventare velocemente tedioso, soprattutto in presenza di una gerarchia di role complessa. Esistono varie risorse e strumenti per fare audit e gestire il controllo accessi, ma questa risposta accettata su StackOverflow è un ottimo punto di partenza. Se desidera avvicinarsi a un controllo accessi ben gestito, valuti permifrost di GitLab, che può suggerirLe le query da eseguire per arrivare alla specifica desiderata.

Concedere select su tutte le tabelle future di uno schema e di un database

Si tenga presente che esiste una distinzione tra oggetti all e future. Concedere un privilegio su oggetti future non lo estenderà a all gli oggetti esistenti, e viceversa.

  • all si riferisce agli oggetti esistenti nel momento in cui si esegue la query
  • future si riferisce solo agli oggetti che devono ancora essere creati

Quindi, per concedere select su tutte le tabelle (presenti e future) in uno schema, dovrà eseguire 2 query: una per all e una per future (o per altri oggetti come views o schemas).

grant select
	on future tables
	in schema MY_DATABASE.FOO_SCHEMA
	to role BAR_ROLE
	copy current grants;

grant select
	on future tables
	in database MY_DATABASE
	to role BAR_ROLE
	copy current grants;

grant select
	on all tables

Espandi il codice

Chi può vedere quali utenti e role esistono, e a quali utenti è stato concesso quale role?

Tutti. Ogni role, incluso il role predefinito PUBLIC, consente allo User di vedere tutti gli utenti e i role presenti nell'account, oltre a quali role sono stati concessi a quali utenti. Non tutti, però, possono vedere quali privilegi sono stati concessi ai role.

Chi è Tasman Analytics

Tasman è una boutique di consulenza analytics che trasforma dati disorganizzati in valore di business concreto. Crediamo che le aziende meritino piattaforme dati che facciano davvero la differenza.

La nostra competenza spazia tra analytics, business intelligence e data science. Con uffici nel Regno Unito e nei Paesi Bassi, serviamo clienti in tutta Europa dal 2017.

Il nostro lavoro si fonda su tre pilastri essenziali:

  1. PEOPLE: insegniamo ai nostri clienti esattamente ciò di cui hanno bisogno e come costruire un team dati ad alte prestazioni. Nel frattempo, poniamo le basi giuste per i loro processi dati, la cultura e i modi di lavorare, così che il nuovo team parta già con un vantaggio.
  2. TECH: costruiamo un modern data stack che offre ai nostri clienti un'unica fonte di verità, personalizzata sulle loro esigenze e basata sulle best practice di settore.
  3. INSIGHTS: aiutiamo i nostri clienti a definire e interpretare le metriche che contano, per avere una visione strategica del proprio business. Una volta capito ciò che funziona, creiamo dashboard di reporting affidabili e strumenti self-service che consentono loro di stabilire priorità, decidere e agire più velocemente e con maggiore sicurezza.

Scopra di più sul nostro approccio e su come possiamo accelerare il Suo percorso nei dati scrivendoci a [email protected] o visitando il nostro sito tasman.ai!

Jovan Saković·Sr. Data Engineer presso Tasman Analytics

Jovan oggi mette le sue competenze al servizio di Tasman Analytics, aiutando i clienti a raggiungere il valore di business nel minor tempo possibile attraverso piattaforme dati scalabili e collaudate. Con oltre 20 clienti all'attivo in Tasman, ha lavorato con un'ampia gamma di strumenti del Modern Data Stack, ma ciò che lo entusiasma di più è ancora il Terraform-ing di account Snowflake. A Jovan piace stringere partnership con i prodotti in cui crede, come Metaplane, Prefect e, naturalmente, SELECT.