Compliance as Code: l’automazione di governance e sicurezza
Nel panorama normativo odierno, caratterizzato da un cambiamento veloce e continuo, le aziende si trovano a fronteggiare una sfida duplice: da un lato la necessità di accelerare la delivery del software e dall’altro l’obbligo di aderire a rigorosi standard di sicurezza. Per i team di DevOps, FinOps e Security, la governance tradizionale rappresenta spesso un ostacolo reattivo; la Compliance as Code nasce per superare questo ostacolo e integrare velocità, fiducia e trasparenza in ogni passaggio del ciclo di vita del software.
L’obiettivo fondamentale è definire i requisiti di conformità come configurazione all’interno della codebase, utilizzando un linguaggio coerente leggibile sia dagli esseri umani, sia dalle macchine. In altre parole, si automatizza l’intero ciclo di gestione: dall’implementazione alla validazione, fino alla remediation, al monitoraggio e al reporting. Trattando i requisiti normativi come codice versionabile e gestibile insieme al software, la sicurezza e la conformità vengono inserite e applicate nelle primissime fasi del ciclo di vita dello sviluppo (SDLC), prevenendo che configurazioni non testate o non autorizzate raggiungano la produzione.
> Leggi anche: “Secure SDLC: Integrazione della Sicurezza nel Ciclo di Sviluppo del Software”
Policy as Code e Compliance as Code: una distinzione necessaria
Nel panorama DevOps moderno, i termini Policy as Code (PaC) e Compliance as Code (CaC) sono spesso usati in modo intercambiabile, ma rappresentano ambiti distinti con una significativa sovrapposizione.
La Policy as Code definisce e gestisce le politiche organizzative attraverso il codice, trattandole come qualsiasi altro artefatto software. Il suo scopo principale è l’implementazione di guardrail automatizzati per garantire l’aderenza a singole regole interne, che possono spaziare dalla sicurezza operativa al controllo dei costi, fino alla governance architetturale. In pratica, il PaC trasforma il “regolamento aziendale” in logica eseguibile che i motori di policy valutano per restituire decisioni immediate (allow, deny o warning).
La Compliance as Code, invece, soddisfa e monitora i requisiti normativi esterni e gli standard di settore. Mentre il Policy as Code stabilisce le regole del gioco interne, la Compliance as Code utilizza gli stessi meccanismi tecnici per garantire che l’organizzazione rispetti obblighi legali critici come GDPR, HIPAA, PCI DSS, SOC 2 o i benchmark CIS. La differenza sostanziale risiede nell’output: la Compliance as Code non richiede solo l’enforcement della regola, ma necessita di capacità di auditing e reporting per dimostrare la conformità a terze parti.
Per visualizzare questa relazione, consideriamo uno scenario tipico aziendale. Una regola che impedisce agli sviluppatori di creare istanze di calcolo eccessivamente costose negli ambienti di sviluppo è una politica di Policy as Code, dettata esclusivamente da esigenze interne di budget e controllo costi. Al contrario, una regola che impone l’attivazione obbligatoria della crittografia a riposo per qualsiasi database in produzione contenente anagrafiche clienti è una misura di Compliance as Code, indispensabile per superare l’audit ISO 27001 o dimostrare le misure di sicurezza adeguate ai sensi del GDPR.
Per le aziende in settori altamente regolamentati, l’approccio ideale prevede l’uso combinato di entrambe: il Policy as Code fornisce la metodologia tecnica per codificare le regole, mentre la Compliance as Code orienta tali regole verso la mitigazione del rischio normativo e la produzione continua di prove di audit.
Un framework per la Compliance as Code
Un framework di Compliance as Code robusto è ma un ciclo di vita completo che tratta le policy con lo stesso rigore riservato al codice applicativo. L’architettura operativa si basa su componenti interconnessi che trasformano i requisiti astratti in Prevenzione, Rilevamento e Rimediazione automatizzata.
- Il ciclo inizia con la definizione della policy, la fase in cui i requisiti di governance, sicurezza e conformità (come GDPR o PCI-DSS) vengono tradotti in un formato strutturato e leggibile dalla macchina. Le regole sono scritte in linguaggi dichiarativi specifici — come Rego per Open Policy Agent o HSL per HashiCorp Sentinel — e archiviate in sistemi di controllo versione come Git. Questo approccio garantisce la tracciabilità, permette la peer review e crea una “single source of truth” per l’audit, eliminando l’ambiguità dei documenti cartacei.
- Una volta definita, la policy passa alla fase di testing e enforcement. Prima di raggiungere la produzione, le regole vengono sottoposte a unit test automatizzati utilizzando dati mock (come snippet JSON di piani infrastrutturali) per verificare la logica e prevenire falsi positivi che potrebbero interrompere le pipeline. L’applicazione delle regole avviene tramite un motore di policy che riceve in input dati strutturati (il contesto o la configurazione proposta), li valuta rispetto alle policy codificate e restituisce una decisione (allow, deny o modify). Questo meccanismo abilita la prevenzione della non conformità, bloccando attivamente il deployment di risorse rischiose tramite gate di sicurezza nella pipeline CI/CD o Admission Controller in Kubernetes.
- Il ciclo si chiude con il monitoraggio, audit e rimediazione. La Compliance as Code non si ferma al deployment: strumenti di monitoraggio continuo scansionano l’infrastruttura live per rilevare il configuration drift, ovvero la deriva rispetto allo stato desiderato, e generare automaticamente audit trail dettagliati, essenziali per dimostrare l’aderenza agli standard agli auditor. Quando viene rilevata una violazione post-deployment, il framework attiva azioni correttive automatizzate per riportare il sistema allo stato conforme senza intervento umano, trasformando la governance in un processo continuo di garanzia della qualità.
L’integrazione nella Pipeline CI/CD
La validazione e l’applicazione della Compliance as Code costituiscono un processo integrato in molteplici step del ciclo di vita CI/CD. Questa architettura garantisce che le violazioni vengano identificate e corrette il prima possibile, riducendo i costi e i rischi associati alla risoluzione dei problemi in produzione.
Il flusso di validazione si articola in quattro fasi:
- Sviluppo locale e pre-commit: il primo punto di enforcement avviene direttamente sulla workstation dello sviluppatore. In questa fase si intercettano errori di sintassi, problemi di stile e misconfigurazioni IaC di base, fornendo un feedback loop istantaneo prima ancora che il codice entri nel repository condiviso.
- Analisi statica nella Continuous Integration: una volta aperta una pull request o effettuato un commit, la pipeline esegue l’analisi statica dei file di configurazione IaC, come Terraform HCL o manifesti Kubernetes YAML. Scanner dedicati scansionano il codice “a riposo” per individuare vulnerabilità note e violazioni di best practice e pubblicano i risultati direttamente come commenti nella pull request per una revisione immediata.
-
Plan-Time Validation: a differenza dell’analisi statica, che si limita a “leggere” il codice sorgente, la plan-time validation valuta l’effetto reale che quel codice avrà sull’infrastruttura. Ad esempio, nel flusso Terraform, il comando
planrisolve tutte le variabili e le dipendenze, generando un’anteprima esatta dello stato futuro. Questa anteprima viene poi sottoposta al motore di policy, ad esempio OPA o Sentinel. Questo permette di bloccare le configurazioni pericolose che emergono solo quando il codice viene “compilato”, eliminando i punti ciechi della sicurezza. - Policy gate: se vengono rilevate violazioni classificate come Hard-Mandatory, la pipeline blocca l’esecuzione, impedendo il deployment di artefatti non conformi. Per l’ambiente in esecuzione, specialmente in contesti Kubernetes, motori nativi come Kyverno o OPA Gatekeeper operano come Admission Controllers, intercettando le richieste all’API Server in tempo reale. Parallelamente, strumenti di drift detection e CSPM monitorano continuamente le risorse distribuite per segnalare discrepanze rispetto alla configurazione IaC originale, chiudendo il cerchio della sicurezza continua.
Migliori Strumenti per la Compliance as Code
L’ecosistema della Compliance as Code si basa su una varietà di framework che spesso convergono per coprire le diverse fasi del ciclo di vita del software. La scelta dello stack tecnologico dipende dall’infrastruttura sottostante (Cloud, Kubernetes, Terraform) e dalle competenze del team.
Di seguito una panoramica degli strumenti principali suddivisi per categoria e linguaggio:
| Categoria | Strumento | Linguaggio (Policy) | Focus e Caratteristiche Chiave |
| Motori di Policy | Open Policy Agent (OPA) | Rego | Standard de facto CNCF e cloud-agnostic. Unifica l’enforcement su tutto lo stack (K8s, Terraform, API). Richiede l’uso del wrapper Conftest per le pipeline CI/CD. |
| Motori di Policy | HashiCorp Sentinel | Sentinel HSL | Framework embeddable per l’ecosistema HashiCorp. Permette policy granulari con livelli di enforcement. |
| Analisi Statica (IaC Security) | Checkov | Python / YAML | Scansione statica multi-framework. Vanta oltre 750 policy integrate (CIS, PCI-DSS, HIPAA) pronte all’uso. Supporta custom policy in Python. |
| Analisi Statica (IaC Security) | tfsec | HCL / Rego | Specifico per Terraform. Molto veloce, analizza il codice statico per individuare rischi di sicurezza. La sua logica sta convergendo nel tool Trivy. |
| Kubernetes Native | Kyverno | YAML | Progettato per K8s. Consente di scrivere policy in semplice YAML. Agisce come Admission Controller per validare, mutare o generare risorse. |
| Kubernetes Native | OPA Gatekeeper | Rego | L’implementazione standard di OPA per Kubernetes. Funziona come Validating/Mutating webhook. |
| Cloud Native & CSPM | AWS Config / Azure Policy | JSON / Proprietario | Strumenti nativi dei provider cloud per il monitoraggio continuo e la compliance a runtime delle risorse distribuite. |
Uno dei fattori più importanti nella scelta dello strumento è la curva di apprendimento del linguaggio. Mentre l’Infrastructure as Code utilizza linguaggi di configurazione o DSL (come HCL o Bicep), la Policy as Code introduce paradigmi diversi. Ad esempio, linguaggi come Rego sono potenti per interrogare dati complessi, ma richiedono un cambio di mentalità rispetto alla programmazione imperativa. Al contrario, strumenti come Kyverno utilizzano YAML, rendendo la policy accessibile a chi già gestisce manifesti Kubernetes senza dover imparare un nuovo linguaggio.
Sfide di Adozione e Best Practices
L’adozione della Compliance as Code e della Policy as Code è ma un cambiamento di paradigma che comporta ostacoli significativi. Nonostante la potenza dell’automazione, esiste una distinzione netta nel modello operativo: l’automazione è eccellente per l’esecuzione, ma l’intervento umano rimane imprescindibile per il pensiero strategico.
Spetta agli esperti interpretare come una nuova regolamentazione si applichi al contesto specifico e definire la propensione al rischio, decidendo quali rischi accettare e quali mitigare.
inoltre, un motore di policy non sa intrinsecamente se un bucket S3 contiene foto pubbliche o dati sanitari protetti. È necessaria l’azione umana per categorizzare la sensibilità degli asset e applicare i controlli corretti.
Per mitigare i rischi tecnici come il policy sprawl, ovvero la proliferazione di regole ingestibili, e il configuration drift, le organizzazioni devono adottare un approccio metodico guidato dalle persone. La definizione delle policy deve essere uno sforzo congiunto tra management, audit interno, infosec e team di ingegneria. Tutti gli stakeholder devono comprendere e accettare i rischi gestiti fin dal primo giorno.
La conformità è soprattutto comportamento. CTO e tech leader devono promuovere una mentalità “Security-First” e un’apertura al cambiamento collaborativo: le considerazioni etiche e i valori aziendali sono sfumature che nessun codice può applicare autonomamente.



