Archivi categoria: Containers

Come aumentare la sicurezza delle architetture a microservizi basate su Azure Kubernetes

Il diffondersi di nuove architetture applicative basate su microservizi impone l’adozione di soluzioni all’avanguardia che consentono di garantire un elevato livello di protezione e che permettono di rilevare e rispondere ad eventuali minacce di sicurezza. Azure Defender è in grado di offrire una protezione avanzata e mirata delle risorse e dei workload in ambienti ibridi ed in Azure. In questo articolo viene riportato come Azure Defender è in grado di garantire la protezione delle istanze di Azure Kubernetes Service (AKS) e la scansione delle immagini presenti in Azure Container Registry per rilevare eventuali vulnerabilità.

Azure Kubernetes Service (AKS) è il servizio Azure completamente gestito che permette l’attivazione di un cluster Kubernetes, ideale per semplificare il deployment e la gestione di architetture basate su microservizi. Grazie alle funzionalità offerte da AKS è possibile scalare automaticamente in base all’utilizzo, utilizzare controlli per garantire l’integrità dei servizi, implementare politiche di bilanciamento del carico e gestire i secret. In architetture basate su microservizi è frequente anche l’adozione del componente Azure Container Registry che consente di creare, archiviare e gestire le immagini dei container e gli artifacts in un registry privato. L’utilizzo di questo servizio gestito viene integrato con le pipeline di sviluppo e di deployment dei container.

Figura 1 – Esempio di architettura a microservizi basata su Azure Kubernetes

Azure Defender per Kubernetes

Attraverso l’analisi continua dell’ambiente AKS, Azure Security Center (ASC) è in grado di fornire una protezione dalle minacce in tempo reale per gli ambienti containerizzati e genera avvisi nel caso vengano rilevate minacce oppure attività dannose, sia a livello di host che a livello di cluster AKS.

La protezione da minacce di sicurezza per Azure Kubernetes Service avviene a diversi livelli:

  • Host level (fornito da Azure Defender for servers): tramite l’agente di Log Analytics vengono monitorati i nodi Linux del cluster AKS. In questo modo la soluzione è in grado di rilevare attività sospette come connessioni da indirizzi IP particolari e web shell detection. L’agente è inoltre in grado di monitorare specifiche attività relative ai container, come la creazione di container privilegiati, l’accesso ai server API e la presenza di server SSH in esecuzione all’interno di un container Docker. La lista completa degli alert che si possono attenere abilitando la protezione Host level è consultabile in questo documento.
  • AKS cluster level (fornito da Azure Defender for Kubernetes): a livello di cluster, la protezione dalle minacce si basa sull’analisi degli audit logs di Kubernetes. Si tratta di un monitor che non richiede la presenza di agenti specifici e che permette di generare alert, monitorando i servizi gestiti di AKS, come ad esempio la presenza di dashboard Kubernetes esposte e la creazione di ruoli con privilegi elevati. Per consultare la lista completa degli alert generati da questa protezione è possibile accedere a questo link.

In un ambiente AKS è consigliato da best-prectices abilitare anche l’Azure Policy add-on per Kubernetes oltre che ai servizi Azure Defender di protezione dalle minacce. In questo modo, grazie all’iterazione tra i vari componenti di piattaforma, in Azure Security Center è possibile analizzare quanto segue:

  • Audit logs provenienti dei server API
  • Eventi di security non elaborati (row) dall’agente di Log Analytics
  • Informazioni sulla configurazione del cluster AKS
  • Configurazioni dei workload

Figura 2 – Architettura ad alto livello che mostra l’interazione tra ASC, AKS ed Azure Policy

Azure Defender per container registry

Il servizio di protezione Azure Defender for container registries permette di valutare e gestire la presenza di vulnerabilità nelle immagini presenti in Azure Container Registry (ACR). Grazie allo strumento di scansione di Qualys è possibile effettuare una scansione approfondita delle immagini che avviene in tre momenti:

  • In caso di push: ogni volta che un’immagine viene inviata all’ACR, viene eseguita automaticamente la scansione.
  • In caso di estrazione recente: poiché ogni giorno vengono scoperte nuove vulnerabilità, viene analizza anche qualsiasi immagine per la quale è stata fatta un’estrazione negli ultimi 30 giorni.
  • Durante l’importazione: Azure Container Registry dispone di strumenti di importazione per far confluire le immagini al suo interno da Docker Hub, Microsoft Container Registry oppure da altri ACR. Tutte le immagini importate vengono prontamente analizzate.

Durante la scansione Qualys estrae l’immagine e la esegue in una sandbox isolata per rintracciare eventuali vulnerabilità note.

Nel caso vengano rilevate delle vulnerabilità sarà generata una notifica nella dashboard di Security Center. Questo alert sarà accompagnato da una classificazione di gravità e da indicazioni pratiche su come è possibile correggere le specifiche vulnerabilità rilevate in ciascuna immagine. Per verificare le immagini supportate dalla soluzione è possibile accedere a questo link.

Figura 3 – Diagramma di alto livello che mostra la protezione di ACR tramite ASC

Attivazione e costi

L’attivazione di questi servizi Azure Defender di protezione dalle minacce è possibile farla direttamente dal portale Azure:

Figura 4 – Attivazione dei servizi Azure Defender di protezione di Kubernetes e ACR

I moduli Azure Defender in Azure Security Center sono soggetti a costi specifici che possono essere calcolati utilizzando lo strumento Azure Pricing calculator. In particolare, il costo di Azure Defender per Kubernetes viene calcolato sul numero di core delle VMs che compongono il cluster AKS, mentre il costo di Azure Defender per Container registries è calcolato in base alle immagini soggette a scansione.

Conclusioni

Grazie alla copertura offerta dai servizi Azure Defender di Azure Security Center è possibile ottenere un elevato grado di protezione per le architetture applicative basate su microservizi, che utilizzano Azure Kubernetes Service (AKS) ed Azure Container Registry. Microsoft si dimostra un provider in grado di offrire servizi efficaci per l’esecuzione dei container in ambiente cloud, affiancati da moderni ed avanzati strumenti per la sicurezza, utili sia per risolvere rapidamente eventuali problemi in questo ambito che per migliorare le security posture del proprio ambiente.

Le possibilità offerte da Azure per l’esecuzione dei container

La forte tendenza nello sviluppo di applicazioni che prevedono architetture basate su microservizi rendono i container perfetti per eseguire il deployment del software in modo efficiente ed operare su larga scala. I container sono in grado di funzionare su sistemi operativi Windows, Linux e Mac, su macchine virtuali oppure bare metal, in data center on-premise e, ovviamente, nel cloud pubblico. Microsoft è certamente uno dei principali provider che consente l’esecuzione di container a livello enterprise nel cloud pubblico. In questo articolo viene riportata una panoramica delle principali soluzioni che è possibile adottare per l’esecuzione di container in ambiente Microsoft Azure.

Macchine virtuali

Le macchine virtuali IaaS in ambiente Azure sono in grado di fornire la massima flessibilità per eseguire container Docker. Infatti, su macchine virtuali Windows e Linux è possibile installare il runtime Docker e grazie alla disponibilità di diverse combinazioni di CPU e RAM si può disporre delle risorse necessarie per eseguire uno o più container. Questo approccio è tipicamente consigliato in ambienti di DevTest, in quanto l’onere di configurazione e manutenzione della macchina virtuale non è comunque trascurabile.

Approcci serverless

Azure Container Instances (ACI)

Azure Container Instances (ACI) è il metodo più semplice e rapido in Azure per l’esecuzione di container on-demand in un ambiente serverless gestito. Il tutto viene reso possibile senza dover attivare macchine virtuali specifiche e la manutenzione necessaria è pressoché trascurabile. La soluzione Azure Container Instances è idonea in scenari che richiedono container isolati, senza la necessità di adottare un sistema complesso di orchestrazione. ACI è infatti in grado di fornire solo alcune funzionalità di schedulazione di base offerte delle piattaforme di orchestrazione e, sebbene non copra i servizi di valore forniti da tali piattaforme, può essere visto come una soluzione complementare.

Le risorse di primo livello in Azure Container Instances sono i Container group, una raccolta di container che vengono schedulati sulla stessa macchina host. I container all’interno di un Container group condividono il lifecycle, le risorse, la rete locale ed i volumi di archiviazione. Il concetto di Container group è simile a quello del pod in ambiente Kubernetes.

Figura 1 – Esempio di container group in Azure Container Instances

Il servizio Azure Container Instances comporta dei costi che dipendono dal numero di vCPU e di GBs di memoria allocati al secondo. Per maggiori dettagli sui costi è possibile consultare la relativa pagina ufficiale Microsoft.

Azure Web App for Containers

Per carichi di lavoro web-based esiste la possibilità di far eseguire i container dagli Azure App Service, la piattaforma Azure di web hosting, utilizzando il servizio Azure Web App for Containers, con il vantaggio di poter sfruttare le metodologie di distribuzione, scalabilità e monitor intrinseche nella soluzione.

Azure Batch e container

Se i workload prevedono la necessità di scalare con più job batch è possibile inserirli in container e gestire lo scaling tramite Azure Batch. In questo scenario la combinazione tra Azure Batch e container risulta vincente. Azure Batch consente l’esecuzione ed il ridimensionare di un numero elevato di processi di elaborazione batch in Azure, mentre i container forniscono un metodo semplice per eseguire le attività Batch, senza dover gestire l’ambiente e le relative dipendenze, necessarie per l’esecuzione delle applicazioni. In questi scenari è possibile prevedere l’adozione delle low-priority VMs con Azure Batch per ridurre i costi.

Orchestrazione dei container

I task di automazione e gestione di un numero elevato di container e le modalità con le quali questi interagiscono applicativamente tra di loro è noto come orchestrazione. Nel caso quindi ci sia la necessità di orchestrare più containers è necessario adottare soluzioni più sofisticate come: Azure Kubernetes Service (AKS) oppure Azure Service Fabric.

Azure Kubernetes Service (AKS)

Azure Kubernetes Service (AKS) è il servizio Azure completamente gestito che permette l’attivazione di un cluster Kubernetes.

Kubernetes, conosciuto anche come “k8s”, provvede all’orchestrazione automatizzata dei container, migliorandone l’affidabilità e riducendo il tempo e le risorse necessarie in ambito DevOps. Kubernetes tende a semplificare i deployment, permettendo di eseguire automaticamente le implementazioni ed i rollback. Inoltre, permette di migliorare la gestione delle applicazioni e di monitorare lo stato dei servizi per evitare errori in fase di implementazione. Tra le varie funzionalità sono previsti controlli di integrità dei servizi, con la possibilità di riavviare i container che non sono in esecuzione oppure che risultano bloccati, permettendo di annunciare ai client solo i servizi correttamente avviati. Kubernetes permette inoltre di scalare automaticamente in base all’utilizzo ed esattamente come i container, permette di gestire in maniera dichiarativa l’ambiente cluster, consentendo una configurazione controllata a livello di versione e facilmente replicabile.

Figura 2 – Esempio di architettura a microservizi basata su Azure Kubernetes Service (AKS)

Azure Service Fabric

Un’altra possibilità per orchestrare i container è l’adozione dell’affidabile e flessibile piattaforma Azure Service Fabric. Si tratta dell’orchestratore di container di Microsoft che permette il deployment e la gestione dei microservizi in ambienti cluster ad elevata intensità e con tempi di deployment molto rapidi. Con questa soluzione si ha la possibilità, per la stessa applicazione, di unire servizi che risiedono in processi e servizi all’interno di container. L’architettura unica e scalabile di Service Fabric consente di eseguire analisi dei dati pressoché in tempo reale, calcoli computazionali in memoria, transazioni parallele ed elaborazione di eventi nelle applicazioni. Service Fabric offre un runtime sofisticato e leggero che supporta microservizi stateless e stateful. Un elemento chiave di differenziazione di Service Fabric è il suo robusto supporto per la creazione di servizi stateful, adottando modelli di programmazione built-in di Service Fabric oppure servizi stateful containerizzati. Per maggiori informazioni sugli scenari applicativi che possono trarre vantaggio dai servizi stateful di Service Fabric è possibile consultare questo documento.

Figura 3 – Panoramica di Azure Service Fabric

Azure Service Fabric può vantare di ospitare molti servizi Microsoft, tra i quali Azure SQL Database, Azure Cosmos DB, Cortana, Microsoft Power BI, Microsoft Intune, Azure Event Hubs, Azure IoT Hub, Dynamics 365, Skype for Business, e molti servizi core di Azure.

Conclusioni

Microsoft offre un ventaglio di opzioni per l’esecuzione dei container nel proprio cloud pubblico. La scelta della soluzione più adatta alle proprie esigenze tra tutte quelle offerte, nonostante richieda una attenta valutazione, permette di avere una elevata flessibilità. Dall’adozione di approcci serverless, alla gestione di ambienti cluster per l’orchestrazione, fino alla creazione di una propria infrastruttura basata su macchine virtuali è possibile trovare la soluzione ideale per eseguire i container in ambiente Microsoft Azure.

Creazione di un ambiente Docker in Azure tramite VM Extension

Docker è una piattaforma software che consente di creare, gestire ed eseguire applicazioni isolate in containers. Un container non è altro che una metodologia di creazione dei pacchetti software in un formato che permette di essere eseguito in modo indipendente ed isolato su un sistema operativo condiviso. I containers a differenza delle machine virtuali non comprendono un sistema operativo completo, ma solamente le librerie e le impostazioni necessarie per consentire l’esecuzione del software. Ne derivano quindi una serie di vantaggi in termini di dimensione, velocità, portabilità e gestione delle risorse.

 
Figura 1 – Diagramma dei Container

 

Nel mondo Microsoft Azure ci sono svariate possibilità di configurare ed utilizzare container Docker che vi elenco sinteticamente:

  • VM Extension: tramite una Extension specifica è possibile implementare Docker all’interno di una macchina virtuale.
  • Azure Container Service: consente di distribuire rapidamente nell’ambiente Azure un cluster Docker Swarm, DC/OS o Kubernetes pronto per la produzione. Si tratta della soluzione più completa per l’orchestrazione dei container.
  • Docker EE for Azure: è un template disponibile sull’Azure Marketplace, frutto della collaborazione tra Microsoft e Docker, grazie al quale è possibile fare il provisioning di un cluster Docker Enterprise Edition sfruttando l’integrazione con gli Azure VM Scale Sets, gli Azure Load Balancer e l’Azure Storage.
  • RancherOS: è una distribuzione Linux appositamente creata per l’esecuzione di containers Docker disponibile come template all’interno del Marketplace Azure.
  • Web App for Containers: viene offerta la possibilità di utilizzare containers facendone il deployment nella piattaforma gestita degli Azure App Service come Web App in esecuzione in un ambiente Linux.
  • Azure Container Instances (attualmente in preview): è sicuramente il metodo più semplice e rapido per eseguire un container Docker nella piattaforma Azure, senza la necessità di creare macchine virtuali, ideale in scenari che prevedono containers isolati.
  • Azure Service Fabric: supporta i containers sia nell’ambiente Windows che Linux. La piattaforma contiene in modo nativo il supporto per Docker Compose (attualmente in preview), consentendo di orchestrare applicazioni basate su containers nell’Azure Service Fabric.
  • DC/OS su Azure: si tratta di un servizio cloud gestito che mette a disposizione un ambiente per il deployment di workload in cluster utilizzando la piattaforma DC/OS (Datacenter Operating System).

Tutte queste possibilità offerte consentono, in base alle esigenze e allo scenario che si deve implementare, di scegliere la metodologia di deployment più opportuna nell’ambiente Azure per l’esecuzione dei container Docker.

In questo articolo approfondiremo la creazione di un ambiente Docker utilizzando l’apposita Virtual Machine Extension. Partendo da una macchina virtuale presente in Azure è possibile aggiungere la Docker Extension che installa e configura il daemon Docker, il client Docker e il Docker Compose.

Questa extension è supportata per le seguenti distribuzioni Linux:

  • Ubuntu 13 o superiore.
  • CentOS 7.1 o superiore.
  • Red Hat Enterprise Linux (RHEL) 7.1 o superiore.
  • CoreOS 899 o superiore.

L’aggiunta dell’extension dal portale Azure può essere fatta tramite i seguenti step. Nella sezione Extensions della macchina virtuale seleziono il pulsante Add:

Figura 2 – Aggiunta Extension alla VM dal portale Azure

 

Successivamente viene mostrato l’elenco delle Extension disponibili, ci si posiziona sull’Extension Docker e si preme il pulsante Create.

Figura 3 – Selezione dell’Extension Docker

 

Per consentire una comunicazione sicura con il sistema Docker implementato nell’ambiente Azure è necessario utilizzare dei certificati e delle chiavi rilasciati da una CA trusted. Se non si dispone di una CA per generare questi certificati è possibile seguire le indicazioni riportate nella sezione Create a CA, server and client keys with OpenSSL presente nella documentazione ufficiale di Docker.

 

Figura 4 – Schema di comunicazione docker tramite protocollo crittografato TLS

 

Il wizard di aggiunta dell’Extension richiede come prima cosa di inserire la porta di comunicazione utilizzata dell’Engine Docker (2376 è la porta di default). Inoltre è richiesto l’inserimento del certificato della CA, del certificato Server e della Server Key, tutti nel formato base64-encoded:

Figura 5 – Parametri richiesti dal wizard di aggiunta della Docker VM Extension

 

L’aggiunta dell’Extension Docker richiede alcuni minuti al termine dei quali sulla macchina virtuale sarà presente l’installazione dell’ultima versione stabile del Docker Engine e il daemon Docker sarà in ascolto sulla porta specificata utilizzando i certificati inseriti nel wizard.

Figura 6 – Dettagli dell’Extension Docker

 

Nel caso sia necessario consentire la comunicazione Docker dall’esterno della vNet su cui è attestata la macchina virtuale con Docker è necessario configurare in modo opportuno le regole nel Network Security Group utilizzato:

Figura 7 – Esempio di configurazione NSG per consentire comunicazione Docker (porta 2376)

 

Giunti a questo punto l’ambiente è pronto per essere utilizzato e da un client remoto posso iniziare a comunicare verso l’ambiente Docker appena configurato:

Figura 8 – Comando Docker eseguito da un client remoto per recuperare informazioni

 

Conclusioni

L’Azure Docker VM extension è ideale per implementare facilmente e in modo affidabile e sicuro un ambiente Docker di sviluppo oppure di produzione su una singola macchina virtuale. Microsoft Azure offre un’ampia gamma di possibilità nelle scelte di implementazione relative alla piattaforma Docker, consentendo di scegliere con molta flessibilità la soluzione più idonea per le proprie esigenze.