In sistemi IT complessi come quelli a microservizi è necessario prevedere una strategia DevOps e GitOps che permetta di orchestrare in modo organico non solo il deploy dei singoli applicativi, ma anche tutta l’infrastruttura che li ospita. Kubernetes è la piattaforma che facilita l’implementazione di questo tipo di strategia, ma che allo stesso tempo porta a galla nuovi aspetti di sicurezza che è importante affrontare.
Cos’è GitOps?
Partiamo nel capire cosa differenzia DevOps da GitOps. Pur presentando alcuni principi comuni, DevOps è una metodologia che prevede che i team operativi e di sviluppo collaborino al fine di ottimizzare e rendere sicuro il ciclo di implementazione delle applicazioni. GitOps invece eredita da DevOps gli strumenti e le tecnologie tipicamente applicate allo sviluppo software e li applica alla gestione dell’infrastruttura applicativa.
A una prima impressione, GitOps potrebbe ricordare l’approccio Infrastructure as Code (IaC), che prevede di versionare lo stato desiderato dell’infrastruttura (Configurazioni, Risorse Hardware, Policy di Sicurezza, Regole Network, etc.) e averne quindi chiara l’evoluzione nel tempo. GitOps, essendo per definizione una serie di procedure per la gestione delle configurazioni di applicazioni e infrastrutture, può essere considerato un’evoluzione dell’IaC, a cui aggiunge alcune importanti caratteristiche:
- separare il codice delle applicazioni da quello che descrive configurazioni e infrastruttura;
- definire il processo approvativo (Code Review/Pull Request) per tutte le modifiche all’infrastruttura. L’utilizzo di un Git Repository Manager (GitLab, BitBucket, GitHub) consente anche di definire i ruoli e i permessi a seconda del tipo di configurazioni da applicare;
- adottare degli strumenti che applichino in automatico le modifiche approvate all’infrastruttura. Questa applicazione può solitamente avvenire direttamente dalle pipeline di Continuous Delivery (modalità push), oppure installando degli agenti all’interno del sistema che monitorino continuamente le modifiche Git e le applichino in autonomia (modalità pull).
GitOps in Kubernetes: attenzione alla sicurezza
Proprio grazie alla natura dichiarativa, Kubernetes rappresenta la soluzione ideale per implementare la propria strategia GitOps.
Kubernetes è un sistema di orchestrazione di container – ossia ‘pacchetti’ autoconsistenti che raccolgono tutte le dipendenze necessarie a un’applicazione per funzionare – in cui è possibile definire regole di sicurezza, configurazioni di rete e policy che regolano il modo in cui i container interagiscono tra loro.
Per garantire la massima sicurezza queste configurazioni devono essere gestite, modificate e applicate solo da utenti con i permessi e le competenze adeguate. I flussi DevOps e GitOps devono essere quindi adattati per garantire una governance efficace e far fronte ad alcuni nuovi potenziali rischi: vediamo come.
1. Container Vulnerability Scanning
Il Container Vulnerability Scanning aiuta a identificare subito potenziali falle di sicurezza all’interno dei container applicativi, sia nel sistema operativo che costituisce le fondamenta del container, sia nelle dipendenze applicative utilizzate per costruire l’applicazione: l’individuazione delle vulnerabilità può essere effettuata anche durante la fase di costruzione del container tramite strumenti open source come Trivy.
Inoltre, è fondamentale che anche il container registry che ospita le immagini possa effettuare gli scan di sicurezza per identificare eventuali vulnerabilità emerse in una fase successive alla build: per esempio, Harbor è un container registry open source che supporta l’integrazione con questi strumenti.
2. Kubernetes Policy Manager
Un cluster Kubernetes ospita potenzialmente centinaia di microservizi, scritti e configurati da persone diverse. È compito degli amministratori assicurarsi che tutte le risorse configurate all’interno di Kubernetes siano conformi alle policy di sicurezza e alle best practice aziendali. Un amministratore, ad esempio, ha bisogno di:
- evitare che un container utilizzi più risorse di quelle previste;
- evitare che vengano installate immagini da container registry non censiti;
- evitare la privilege escalation all’interno dei container;
- evitare la comunicazione tra container, quando non prevista.
Per automatizzare questi controlli ci si può affidare a dei motori di policy come, ad esempio, Kyverno: le policy che utilizza impediscono che all’interno del cluster vengano istanziati container e risorse che non sono conformi alle regole definite dagli amministratori del sistema.
Adottare una strategia GitOps permette di avere maggiore controllo sull’evoluzione del proprio ecosistema. Un primo livello di sicurezza è dato da un utilizzo corretto del repository manager Git, del suo workflow approvativo e della sua gestione di ruoli e permessi. Un secondo livello di sicurezza può essere dato dalla scelta di un tool di sync (push o pull) che decide chi e su quali ambienti può installare applicazioni e configurazioni approvate in una prima fase. Container Vulnerability Scanning e Policy Manager garantiscono che, nonostante l’elevato livello di automazione portato da DevOps e GitOps, non vengano installati applicativi e configurazioni non conformi agli standard di sicurezza e alle policy aziendali.
Abbiamo parlato di come rendere sicuro tutto il ciclo di sviluppo del software su Kubernetes all’evento Headless & API Date del 25 novembre 2021: guarda la registrazione on demand per scoprire di più.