Nello script precedente abbiamo visto come sia facile poter recuperare l'elenco delle immagini presenti all'interno di un cluster di Kubernetes ed eventualmente individuare tutte quelle che non provengono da un registry "sicuro" o comunque validato dalla nostra organizzazione.
Oggi, invece, vediamo quanto sia semplice applicare una policy per fare in modo che il cluster di Kubernetes ci blocchi nel fare l'apply di risorse che contengono immagini provenienti da container registry non approvati. Per farlo, ci è sufficiente creare una risorsa di tipo ValidatingWebhookConfiguration. La sua configurazione sarà simile alla seguente:
apiVersion: admissionregistration.k8s.io/v1 kind: ValidatingWebhookConfiguration metadata: name: image-validation-webhook webhooks: - name: image-validation.example.com rules: - operations: ["CREATE", "UPDATE"] apiGroups: [""] apiVersions: ["v1"] resources: ["pods"] failurePolicy: Fail clientConfig: service: name: image-validation-webhook namespace: default path: "/validate-image"
Questo webhook è configurato per essere invocato ogni qualvolta che si tenta di fare un deploy di una risorsa di tipo Pod, anche se è facilmente estendibile ad altre risorse. Nel momento della creazione, o di un update della stessa, il webhook viene invocato e riceve in input la risorsa che si sta tentando di creare. Successivamente, passa queste informazioni ad una API chiamata "/validate-image", esposta da un altro servizio deployato all'interno del cluster stesso.
Questo servizio, a sua volta, si occuperà di verificare che le immagini specificate all'interno della risorsa siano presenti all'interno di un registry approvato. Se così non fosse, il servizio restituirà un errore che verrà riportato all'utente che ha tentato di fare il deploy della risorsa, poichè abbiamo specificato come failurePolicy il valore Fail.
E', di fatto, una semplice API che fa una valutazione del payload ricevuto in ingresso e ne controlla un parametro specifico, ovvero il container registry.
[HttpPost] public IActionResult ValidateImage([FromBody] dynamic payload) { // Estrai il nome dell'immagine dal payload string imageName = payload.image; // Verifica se l'immagine proviene da aspitalia.azurecr.io if (!imageName.StartsWith("aspitalia.azurecr.io")) { return StatusCode(403, "Non sei autorizzato a utilizzare immagini da altri registri."); } // L'immagine è valida, permetti il deployment return Ok("Validazione immagine riuscita. Il deployment può procedere."); }
Infine, non ci resta che fare l'apply del codice YAML del validating webhook.
kubectl apply -f validating-webhook.yaml
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Configurare e gestire sidecar container in Azure App Service
Disabilitare automaticamente un workflow di GitHub
Filtrare i dati di una QuickGrid in Blazor con una drop down list
Gestire gli accessi con Token su Azure Container Registry
Configurare lo startup di applicazioni server e client con .NET Aspire
Bloccare l'esecuzione di un pod in mancanza di un'artifact attestation di GitHub
Cancellare una run di un workflow di GitHub
Collegare applicazioni server e client con .NET Aspire
Generare HTML a runtime a partire da un componente Razor in ASP.NET Core
Eseguire una ricerca avanzata per recuperare le issue di GitHub
Utilizzare un numero per gestire la concorrenza ottimistica con SQL Server ed Entity Framework