Articles

Guida ai permessi 'as code' in Snowflake con Permifrost

Scritto da SDG Group | 4-ago-2025 15.14.33

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.

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.

 

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.