04 agosto 2025 / 03:14 PM

Guida ai permessi 'as code' in Snowflake con Permifrost

Dive into Data, Analytics, and AI with articles, guides, and real cases that help you turn data into business value.

Gestisci i permessi di Snowflake come codice con Permifrost per una sicurezza e manutenibilità superiori.

Benvenuti su #TechStation, l'hub di SDG Group dedicato alle ultime innovazioni in data e analytics! In questo articolo, esploriamo una combinazione potente: Permifrost e Snowflake. Dimostreremo come utilizzare Permifrost, un tool open-source, per gestire i permessi di Snowflake in modo dichiarativo tramite file YAML. Questo approccio "Permissions as Code" non solo automatizza la governance, ma elimina anche i permessi indesiderati, rafforza la sicurezza e rende l'intero ambiente dati più facile da gestire e auditare.

Cercavi qualcos'altro? Guarda tutti gli altri contenuti qui.

techstation generica

Nel mondo del data engineering in continua evoluzione, la data governance, la sicurezza e l'efficienza sono di fondamentale importanza.

Man mano che i team crescono e il volume dei dati aumenta, gestire i permessi e mantenere un ambiente dati pulito e sicuro diventa sempre più complesso.

Spesso, le aziende che migrano su piattaforme come Snowflake si trovano ad affrontare problemi come:

  • Permessi incoerenti: team diversi con livelli di accesso variabili portano spesso a "grant" eccessivamente permissive

  • Gestione manuale: l'assegnazione manuale dei permessi è lenta e soggetta a errori umani

  • Difficoltà di audit: tracciare e auditare i permessi in tutto l'ambiente Snowflake diventa un'operazione complessa, aumentando i rischi per la sicurezza

Questo articolo esplora una soluzione potente a queste sfide, basata sulla combinazione di Permifrost e Snowflake per migliorare la manutenibilità e la sicurezza attraverso una gestione efficace dei permessi.

 

Gli strumenti della soluzione

  • Permifrost: pacchetto Python open-source, mantenuto dal Data Team di GitLab, per gestire i permessi in un data warehouse Snowflake. Semplifica e accelera la configurazione dei privilegi utente utilizzando un file di specifiche in formato YAML. Permifrost confronta questo file con lo stato attuale dell'ambiente Snowflake e genera (o esegue) le query necessarie per allineare i permessi a quanto dichiarato.

  • Snowflake: soluzione di data warehouse basata su cloud, ampiamente adottata per la sua scalabilità, performance e facilità d'uso.

  • dbt (consigliato): per completare l'ecosistema, suggeriamo l'uso di dbt come strumento per la trasformazione dei dati, che si integra perfettamente in questa logica.

 

La soluzione: "Permissions as Code"

L'integrazione di Permifrost con Snowflake trasforma la gestione dei permessi in un processo "as Code", tracciabile e automatizzato.

  1. Definire i permessi come codice: con Permifrost i permessi vengono definiti in un file YAML dichiarativo

  2. Controllo di versione con Git: tutte le definizioni dei permessi sono archiviate in un repository Git. Ogni modifica viene tracciata, revisionata e approvata prima di essere applicata, garantendo un solido tracciato di audit (audit trail)

  3. Automatizzare la gestione dei permessi: una pipeline di CI/CD viene configurata per applicare automaticamente i permessi tramite Permifrost. Ogni volta che una modifica viene unita al branch principale, Permifrost si avvia e aggiorna i permessi in Snowflake

  4. Rimuovere i permessi indesiderati: l'approccio dichiarativo di Permifrost assicura che qualsiasi permesso non definito nel file YAML venga rimosso da Snowflake. Questo è cruciale per prevenire l'accumulo di privilegi non necessari ("privilege creep").

  5. Integrazione con dbt: se si utilizza dbt, è possibile garantire che vengano concessi solo i permessi strettamente necessari per ogni job di trasformazione, aderendo al principio del minimo privilegio.

Questo articolo si concentrerà su una guida pratica per implementare i punti 1 e 4 della soluzione descritta.

 

 

Guida pratica: configurare Permifrost con Snowflake

Vediamo come implementare questa soluzione. Ecco i prerequisiti:

  • Accesso a un account Snowflake con il ruolo SECURITYADMIN.

  • Permifrost installato (pip install permifrost).

  • Git installato e un account GitHub (o altro repository Git).

 

 

Step 1: configurare l'ambiente Snowflake

Per prima cosa creiamo gli oggetti necessari in Snowflake.

Creare Database e Schema:

-- esempio:
USE ROLE securityadmin;
CREATE DATABASE refactoring;
USE DATABASE refactoring;
CREATE SCHEMA sbellesi;

 

 

Creare ruoli e utenti:

Definiamo i ruoli e gli utenti che necessiteranno di permessi specifici.

-- esempio:
-- Create Role
CREATE ROLE analyst_role;
CREATE ROLE engineer_role;

-- Create Users
CREATE USER analyst_user PASSWORD='StrongPassword' DEFAULT_ROLE = analyst_role;
CREATE USER engineer_user PASSWORD='StrongPassword' DEFAULT_ROLE = engineer_role;

-- Assign Role to Users
GRANT ROLE analyst_role TO USER analyst_user;
GRANT ROLE engineer_role TO USER engineer_user;

 

 

Step 2: configurare Permifrost

Inizializzare il Repository Permifrost: creiamo un nuovo repository Git per gestire i permessi di Snowflake.

mkdir permifrost_repo
cd permifrost_repo
git init

 

Definire i permessi nel file YAML:

Creiamo un file permifrost.yml nel repository. Qui sotto un esempio basato sulla struttura generale.

# example

# Databases
databases:
    - refactoring:
        shared: false     # put false if your db isn't a shared object!

# Roles
roles:
    - analyst_role:
        warehouses:
            - compute_wh

        privileges:
            databases:
                read:
                    - refactoring
            schemas:
                read:
                    - refactoring.*
            tables:
                read:
                    - refactoring.sbellesi.*
    - engineer_role:
        warehouses:
            - compute_wh
        privileges:
            databases:
                read:
                    - refactoring
                write:
                    - refactoring
            schemas:
                read:
                    - refactoring.*
                write:
                    - refactoring.*
            tables:
                read:
                    - refactoring.sbellesi.*
                write:
                    - refactoring.sbellesi.*

# Users
# can_login is required the rest of the parameters are optional
# None of the values are validated in Snowflake, hence default_warehouse, default_namespace and default_role
# can contain invalid values
users:
    - analyst_user:
        can_login: true
        member_of:
            - analyst_role
        has_password: true
    - engineer_user:
        can_login: true
        member_of:
            - engineer_role
        has_password: true

# Warehouses
# Warehouse sizes are informative and not altered by Permifrost to align with the spec file
warehouses:
    - compute_wh:
        size: x-small
        meta:
            some_key: some_value:
        can_login: true
        member_of:
            - engineer_role
        has_password: true

# Warehouses
# Warehouse sizes are informative and not altered by Permifrost to align with the spec file
warehouses:
    - compute_wh:
        size: x-small
        meta:
            some_key: some_value

 

Connettere Permifrost a Snowflake: ci sono varie opzioni, descritte qui. Useremo la connessione tramite Username e Password, impostando delle variabili d'ambiente.
PERMISSION_BOT_USER='SNOWFLAKE_USER_NAME'
PERMISSION_BOT_ACCOUNT='SNOWFLAKE_ACCOUNT'
PERMISSION_BOT_WAREHOUSE='SNOWFLAKE_WAREHOUSE'
PERMISSION_BOT_PASSWORD='SNOWFLAKE_PASSWORD'
PERMISSION_BOT_DATABASE='SNOWFLAKE_DATABASE'
PERMISSION_BOT_ROLE='SECURITYADMIN'

 

Nota: Permifrost si aspetta di essere eseguito con il ruolo SECURITYADMIN. Se si tenta di eseguirlo con un altro ruolo, si riceverà un errore di privilegi insufficienti.

 

1_ZXAvjmglsvUCfTHUNPbxbA

L'errore che ricevi se provi ad eseguire Permifrost con un altro ruolo

Applicare i permessi: suggeriamo di eseguire prima il comando con l'opzione --dry per verificare la configurazione e visualizzare in anteprima le query.

--general command
permifrost [-v] run <spec_file> [--role] [--dry] [--diff] [--user] [--ignore-memberships]
1) permifrost run --dry permifrost.yml 
2) permifrost run permifrost.yml


L'output del primo dry run sarà simile al seguente e mostrerà tutti i comandi GRANT che verranno eseguiti:

Confirming spec loads successfully
Loading spec file
Checking spec file for errors
Checking permissions on current snowflake connection
Current user is: sarabellesi.
Current role is: securityadmin.
Checking that all entities in the spec file are defined in Snowflake
Fetching granted privileges from Snowflake
[####################################] 100%
Snowflake specs successfully loaded
Generating permission Queries:
Processing role analyst_role
Processing role engineer_role
Processing user analyst_user
Processing user engineer_user

SQL Commands generated for given spec file:

[PENDING] GRANT usage ON warehouse compute_wh TO ROLE analyst_role;
[PENDING] GRANT operate ON warehouse compute_wh TO ROLE analyst_role;
[PENDING] GRANT monitor ON warehouse compute_wh TO ROLE analyst_role;
[PENDING] GRANT usage ON database refactoring TO ROLE analyst_role;
[PENDING] GRANT usage ON FUTURE schemas IN database refactoring TO ROLE analyst_role;
[PENDING] GRANT usage ON schema refactoring.public TO ROLE analyst_role;
[PENDING] GRANT usage ON schema refactoring.sbellesi TO ROLE analyst_role;
[PENDING] GRANT select ON FUTURE tables IN schema refactoring.sbellesi TO ROLE analyst_role;
[PENDING] GRANT select ON ALL tables IN schema refactoring.sbellesi TO ROLE analyst_role;
[PENDING] GRANT select ON FUTURE views IN schema refactoring.sbellesi TO ROLE analyst_role;
[PENDING] GRANT select ON ALL views IN schema refactoring.sbellesi TO ROLE analyst_role;
[PENDING] GRANT usage ON warehouse compute_wh TO ROLE engineer_role;
[PENDING] GRANT operate ON warehouse compute_wh TO ROLE engineer_role;
[PENDING] GRANT monitor ON warehouse compute_wh TO ROLE engineer_role;
[PENDING] GRANT usage ON database refactoring TO ROLE engineer_role;
[PENDING] GRANT usage, monitor, create schema ON database refactoring TO ROLE engineer_role;
[PENDING] GRANT usage ON FUTURE schemas IN database refactoring TO ROLE engineer_role;
[PENDING] GRANT usage ON schema refactoring.public TO ROLE engineer_role;
[PENDING] GRANT usage ON schema refactoring.sbellesi TO ROLE engineer_role;
[PENDING] GRANT usage, monitor, create table, create view, create stage, create file format, create sequence, create function, create pipe ON FUTURE schemas IN database refactoring TO ROLE engineer_role;
[PENDING] GRANT usage, monitor, create table, create view, create stage, create file format, create sequence, create function, create pipe ON schema refactoring.public TO ROLE engineer_role;
[PENDING] GRANT usage, monitor, create table, create view, create stage, create file format, create sequence, create function, create pipe ON schema refactoring.sbellesi TO ROLE engineer_role;
[PENDING] GRANT select ON FUTURE tables IN schema refactoring.sbellesi TO ROLE engineer_role;
[PENDING] GRANT select ON ALL tables IN schema refactoring.sbellesi TO ROLE engineer_role;
[PENDING] GRANT select ON FUTURE views IN schema refactoring.sbellesi TO ROLE engineer_role;
[PENDING] GRANT select ON ALL views IN schema refactoring.sbellesi TO ROLE engineer_role;
[PENDING] GRANT select, insert, update, delete, truncate, references ON FUTURE tables IN schema refactoring.sbellesi TO ROLE engineer_role;
[PENDING] GRANT select, insert, update, delete, truncate, references ON ALL tables IN schema refactoring.sbellesi TO ROLE engineer_role;
[PENDING] GRANT select ON FUTURE views IN schema refactoring.sbellesi TO ROLE engineer_role;
[PENDING] GRANT select ON ALL views IN schema refactoring.sbellesi TO ROLE engineer_role;
[PENDING] ALTER USER analyst_user SET DISABLED = FALSE;
[PENDING] GRANT ROLE analyst_role TO user analyst_user;
[PENDING] ALTER USER engineer_user SET DISABLED = FALSE;
[PENDING] GRANT ROLE engineer_role TO user engineer_user;
 
 

Verificare la rimozione di permessi indesiderati

Per apprezzare il cambiamento è possibile eseguire, prima e dopo aver applicato Permifrost, i seguenti comandi su Snowflake:

show grants to role engineer_role;
show grants to role analytics_role;

Ora, per dimostrare come Permifrost gestisce la rimozione dei permessi, modifichiamo il file permifrost.yml revocando i privilegi di scrittura al ruolo engineer_role:

# permifrost.yml (versione modificata)
# Databases
databases:
    - refactoring:
        shared: false

# Roles
roles:
    - analyst_role:
        warehouses:
            - compute_wh
        privileges:
            databases:
                read:
                    - refactoring
            schemas:
                read:
                    - refactoring.*
            tables:
                read:
                    - refactoring.sbellesi.*
    - engineer_role:
        warehouses:
            - compute_wh
        privileges:
            databases:
                read:
                    - refactoring
            schemas:
                read:
                    - refactoring.*
            tables:
                read:
                    - refactoring.sbellesi.*

# Users
users:
    - analyst_user:
        can_login: true
        member_of:
            - analyst_role
        has_password: true
    - engineer_user:
        can_login: true
        member_of:
            - engineer_role
        has_password: true

# Warehouses
warehouses:
    - compute_wh:
        size: x-small
        meta:
            some_key: some_value


Eseguendo di nuovo il dry run, l'output mostrerà ora i comandi REVOKE necessari per allineare l'ambiente, dimostrando che Permifrost ha identificato e si prepara a rimuovere i privilegi in eccesso.

Confirming spec loads successfully
Loading spec file
Checking spec file for errors
...
SQL Commands generated for given spec file:

[PENDING] REVOKE monitor, create schema ON database refactoring FROM ROLE engineer_role;
[PENDING] REVOKE monitor, create table, create view, create stage, create file format, create sequence, create function, create pipe ON FUTURE schemas IN database refactoring FROM ROLE engineer_role;
[PENDING] REVOKE monitor, create table, create view, create stage, create file format, create sequence, create function, create pipe ON schema refactoring.public FROM ROLE engineer_role;
[PENDING] REVOKE monitor, create table, create view, create stage, create file format, create sequence, create function, create pipe ON schema refactoring.sbellesi FROM ROLE engineer_role;
[PENDING] REVOKE insert, update, delete, truncate, references ON FUTURE tables IN schema refactoring.sbellesi FROM ROLE engineer_role;
...

 

 

Conclusioni: sicurezza e manutenibilità automatizzate

Seguendo questa guida, hai integrato con successo Permifrost e Snowflake per gestire i permessi come codice, garantendo un ambiente dati sicuro e manutenibile.

Questa configurazione semplifica la gestione dei permessi e migliora la sicurezza, rimuovendo le concessioni indesiderate e assicurando controlli di accesso coerenti.

Per i team che affrontano sfide simili, l'adozione di questo approccio può migliorare significativamente la postura di data governance e sicurezza, aprendo la strada a operazioni sui dati più efficienti e sicure.


Vuoi semplificare la gestione dei permessi e rafforzare la sicurezza del tuo ambiente Snowflake?  Contattaci per una consulenza personalizzata e scopri come l'approccio "Permissions as Code" con Permifrost può automatizzare la tua data governance, garantendo un controllo degli accessi coerente, auditabile e a prova di errore.