Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Sicurezza delle immagini
L'immagine di container deve essere considerata la prima linea di difesa contro un attacco. Un'immagine non sicura e mal costruita può consentire a un utente malintenzionato di sfuggire ai limiti del container e accedere all'host. Una volta sull'host, un malintenzionato può accedere a informazioni sensibili o spostarsi lateralmente all'interno del cluster o con il tuo account AWS. Le seguenti best practice aiuteranno a mitigare il rischio che ciò accada.
Raccomandazioni
Crea immagini minime
Inizia rimuovendo tutti i file binari estranei dall'immagine di container. Se stai usando un'immagine sconosciuta di Dockerhub, ispeziona l'immagine usando un'applicazione come Dive
find / -perm /6000 -type f -exec ls -ld {} \;
Per rimuovere i permessi speciali da questi file, aggiungi la seguente direttiva all'immagine del contenitore:
RUN find / -xdev -perm /6000 -type f -exec chmod a-s {} \; || true
Colloquialmente, questa operazione è nota come snaturamento dell'immagine.
Usa build in più fasi
L'utilizzo di build in più fasi è un modo per creare immagini minime. Spesso, le build in più fasi vengono utilizzate per automatizzare parti del ciclo di integrazione continua. Ad esempio, è possibile utilizzare build in più fasi per linkare il codice sorgente o eseguire analisi statiche del codice. Ciò offre agli sviluppatori l'opportunità di ottenere un feedback quasi immediato invece di attendere l'esecuzione di una pipeline. Le build in più fasi sono interessanti dal punto di vista della sicurezza perché consentono di ridurre al minimo le dimensioni dell'immagine finale inserita nel registro dei contenitori. Le immagini di container prive di strumenti di compilazione e altri file binari estranei migliorano il livello di sicurezza, riducendo la superficie di attacco dell'immagine. Per ulteriori informazioni sulle build in più fasi, consulta la documentazione delle build in più fasi di Docker.
Crea Software Bill of Materials () SBOMs per l'immagine del tuo contenitore
Una «lista dei materiali del software» (SBOM) è un inventario annidato degli artefatti software che compongono l'immagine del contenitore. La SBOM è un elemento fondamentale nella sicurezza del software e nella gestione del rischio della catena di fornitura del software. La generazione, l'archiviazione degli SBOM in un archivio centrale e la scansione delle vulnerabilità aiutano a risolvere SBOMs i
-
Visibilità: scopri quali componenti costituiscono l'immagine del tuo contenitore. L'archiviazione in un repository centrale consente di SBOMs essere controllati e scansionati in qualsiasi momento, anche dopo l'implementazione, per rilevare e rispondere a nuove vulnerabilità, come le vulnerabilità zero-day.
-
Verifica della provenienza: garanzia che le ipotesi esistenti sulla provenienza e sulla provenienza di un artefatto siano vere e che l'artefatto o i relativi metadati non siano stati manomessi durante i processi di costruzione o consegna.
-
Affidabilità: garanzia che un determinato artefatto e il suo contenuto facciano ciò che si presume facciano, ossia siano adatti a uno scopo. Ciò implica valutare se il codice è sicuro da eseguire e prendere decisioni informate sui rischi associati all'esecuzione del codice. L'affidabilità è garantita dalla creazione di un rapporto di esecuzione della pipeline attestato insieme al rapporto SBOM attestato e al rapporto di scansione CVE attestato, per assicurare ai consumatori dell'immagine che l'immagine è effettivamente creata con mezzi sicuri (pipeline) con componenti sicuri.
-
Verifica della fiducia delle dipendenze: controllo ricorsivo dell'albero delle dipendenze di un artefatto per verificarne l'affidabilità e la provenienza degli artefatti utilizzati. Il drift in SBOMs può aiutare a rilevare attività dannose, tra cui dipendenze non autorizzate e non attendibili e tentativi di infiltrazione.
I seguenti strumenti possono essere utilizzati per generare SBOM:
-
Amazon Inspector può essere utilizzato per creare ed esportare. SBOMs
-
Syft di Anchore
può essere utilizzato anche per la generazione di SBOM. Per scansioni di vulnerabilità più rapide, l'SBOM generato per un'immagine del contenitore può essere utilizzato come input per la scansione. L'SBOM e il rapporto di scansione vengono quindi attestati e allegati all'immagine prima di inviarla a un repository OCI centrale come Amazon ECR per scopi di revisione e controllo.
Scopri di più su come proteggere la tua catena di fornitura del software consultando la guida CNCF Software Supply Chain Best Practices
Scansiona regolarmente le immagini per individuare eventuali vulnerabilità
Analogamente alle macchine virtuali, le immagini dei container possono contenere file binari e librerie di applicazioni con vulnerabilità o sviluppare vulnerabilità nel tempo. Il modo migliore per proteggersi dagli attacchi è quello di analizzare regolarmente le immagini con uno scanner di immagini. Le immagini archiviate in Amazon ECR possono essere scansionate in modalità push o su richiesta (una volta nell'arco di 24 ore). Attualmente ECR supporta due tipi di scansione: Basic e Enhanced. La scansione di base sfrutta Clair
Sapere dove sono state distribuite le immagini con vulnerabilità è essenziale per proteggere l'ambiente. Sebbene sia possibile creare autonomamente una soluzione di tracciamento delle immagini, esistono già diverse offerte commerciali che forniscono questa e altre funzionalità avanzate pronte all'uso, tra cui:
Un webhook di convalida Kubernetes potrebbe essere utilizzato anche per verificare che le immagini siano prive di vulnerabilità critiche. I webhook di convalida vengono richiamati prima dell'API Kubernetes. In genere vengono utilizzati per rifiutare le richieste che non soddisfano i criteri di convalida definiti nel webhook. Questo
Usa gli attestati per convalidare l'integrità degli artefatti
Un attestato è una «dichiarazione» firmata crittograficamente che afferma che qualcosa, ad esempio un «predicato», ad esempio l'esecuzione di una pipeline o lo SBOM o il rapporto di scansione delle vulnerabilità, riguarda un'altra cosa: un «soggetto», ovvero l'immagine del contenitore.
Gli attestati aiutano gli utenti a verificare che un artefatto provenga da una fonte attendibile nella catena di fornitura del software. Ad esempio, possiamo utilizzare l'immagine di un contenitore senza conoscere tutti i componenti software o le dipendenze inclusi in tale immagine. Tuttavia, se ci fidiamo di ciò che il produttore dell'immagine del contenitore dice sul software presente, possiamo utilizzare l'attestato del produttore per fare affidamento su quell'artefatto. Ciò significa che possiamo procedere a utilizzare l'artefatto in modo sicuro nel nostro flusso di lavoro anziché eseguire l'analisi da soli.
-
Gli attestati possono essere creati utilizzando AWS Signer o Sigstore
cosign. -
I controller di ammissione di Kubernetes come Kyverno possono essere utilizzati per verificare gli attestati.
-
Fai riferimento a questo workshop
per saperne di più sulle best practice di gestione della catena di fornitura del software su AWS utilizzando strumenti open source con argomenti come la creazione e l'allegazione di attestati a un'immagine del contenitore.
Crea politiche IAM per i repository ECR
Al giorno d'oggi, non è raro che un'organizzazione abbia più team di sviluppo che operano in modo indipendente all'interno di un account AWS condiviso. Se questi team non hanno bisogno di condividere le risorse, potresti voler creare una serie di policy IAM che limitino l'accesso ai repository con cui ogni team può interagire. Un buon modo per implementarlo è utilizzare i namespace ECR. I namespace sono un modo per raggruppare repository simili. Ad esempio, tutti i registri per il team A possono essere preceduti dal prefisso team-a/ mentre quelli per il team B possono utilizzare il prefisso team-b/. La politica per limitare l'accesso potrebbe essere simile alla seguente:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPushPull", "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability", "ecr:PutImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload" ], "Resource": [ "arn:aws:ecr:<region>:<account_id>:repository/team-a/*" ] } ] }
Prendi in considerazione l'utilizzo di endpoint privati ECR
L'API ECR ha un endpoint pubblico. Di conseguenza, è possibile accedere ai registri ECR da Internet purché la richiesta sia stata autenticata e autorizzata da IAM. Per coloro che devono operare in un ambiente sandbox in cui il VPC del cluster non dispone di un Internet Gateway (IGW), è possibile configurare un endpoint privato per ECR. La creazione di un endpoint privato consente di accedere in modo privato all'API ECR tramite un indirizzo IP privato anziché indirizzare il traffico su Internet. Per ulteriori informazioni su questo argomento, consulta Endpoint VPC con interfaccia Amazon ECR.
Implementa politiche sugli endpoint per ECR
La policy predefinita per gli endpoint consente l'accesso a tutti gli archivi ECR all'interno di una regione. Ciò potrebbe consentire attacker/insider a un utente di esfiltrare i dati impacchettandoli come immagine di un contenitore e inviandoli a un registro in un altro account AWS. Per mitigare questo rischio è necessario creare una policy sugli endpoint che limiti l'accesso delle API ai repository ECR. Ad esempio, la seguente policy consente a tutti i principi AWS del tuo account di eseguire tutte le azioni sui tuoi e solo sui tuoi repository ECR:
{ "Statement": [ { "Sid": "LimitECRAccess", "Principal": "*", "Action": "*", "Effect": "Allow", "Resource": "arn:aws:ecr:<region>:<account_id>:repository/*" } ] }
Puoi migliorarlo ulteriormente impostando una condizione che utilizzi il nuovo PrincipalOrgID
attributo che impedirà la creazione pushing/pulling di immagini in base a un principio IAM che non fa parte della tua AWS Organization. Vedi, aws: PrincipalOrg ID per ulteriori dettagli. Consigliamo di applicare la medesima policy sia agli endpoint com.amazonaws.<region>.ecr.dkr
che agli endpoint com.amazonaws.<region>.ecr.api
. Poiché EKS estrae le immagini per kube-proxy, coredns e aws-node da ECR, sarà necessario aggiungere l'ID dell'account del registro, ad esempio 602401143452.dkr.ecr.us-west-2.amazonaws.com/
all'elenco delle risorse nella policy degli endpoint, o modificare la politica per consentire l'estrazione e limitare i push all'ID dell'account. La tabella seguente mostra la mappatura tra gli account AWS da cui vengono vendute le immagini EKS e la regione del cluster.
Numero account | Regione |
---|---|
602401143452 |
Tutte le regioni commerciali ad eccezione di quelle elencate di seguito |
— |
— |
800184023465 |
ap-east-1 - Asia Pacifico (Hong Kong) |
558608220178 |
me-south-1 - Medio Oriente (Bahrein) |
918309763551 |
cn-north-1 - Cina (Pechino) |
961992271922 |
cn-northwest-1 - Cina (Ningxia) |
Per ulteriori informazioni sull'utilizzo delle policy degli endpoint, consulta Utilizzo delle policy degli endpoint VPC per controllare l'accesso ad Amazon ECR
Implementa le politiche del ciclo di vita per ECR
La NIST Application Container Security Guide
-
Filtraggio per età o numero di immagini
-
Filtraggio per immagini con o senza tag
-
Filtraggio per tag di immagine, in più regole o in un'unica regola
??? + avviso Se l'immagine per un'applicazione a esecuzione prolungata viene eliminata da ECR, può causare errori di estrazione dell'immagine quando l'applicazione viene ridistribuita o ridimensionata orizzontalmente. Quando utilizzate le policy relative al ciclo di vita delle immagini, assicuratevi di CI/CD adottare delle buone pratiche per mantenere aggiornate le distribuzioni e le immagini a cui fanno riferimento e create sempre regole di scadenza [dell'immagine] che tengano conto della frequenza con cui eseguite rilasci/distribuzioni.
Creazione di un set di immagini curate
Piuttosto che consentire agli sviluppatori di creare le proprie immagini, prendete in considerazione la possibilità di creare una serie di immagini controllate per i diversi stack di applicazioni dell'organizzazione. In tal modo, gli sviluppatori possono fare a meno di imparare a comporre Dockerfile e concentrarsi piuttosto sulla scrittura di codice. Man mano che le modifiche vengono unite in Master, una CI/CD pipeline può compilare automaticamente l'asset, archiviarlo in un repository di artefatti e copiare l'elemento nell'immagine appropriata prima di inviarlo a un registro Docker come ECR. Per lo meno dovresti creare un set di immagini di base da cui gli sviluppatori possano creare i propri Dockerfile. Idealmente, dovresti evitare di estrarre immagini da Dockerhub perché 1/ non sempre sai cosa c'è nell'immagine e 2/ circa un quinto
Aggiungi la direttiva USER ai tuoi Dockerfiles per eseguirli come utente non root
Come accennato nella sezione sulla sicurezza dei pod, dovresti evitare di eseguire container come root. Sebbene sia possibile configurarlo come parte di PodSpec, è una buona abitudine utilizzare la USER
direttiva sui Dockerfile. La USER
direttiva imposta l'UID da utilizzare durante l'esecuzione RUN
o l'CMD
istruzione che appare dopo la direttiva USER. ENTRYPOINT
Lint i tuoi Dockerfile
Linting può essere utilizzato per verificare che i Dockerfile aderiscano a una serie di linee guida predefinite, ad esempio l'inclusione della USER
direttiva o il requisito che tutte le immagini siano etichettate. dockerfile_lint
Crea immagini partendo da zero
Ridurre la superficie di attacco delle immagini dei container dovrebbe essere l'obiettivo principale nella creazione di immagini. Il modo ideale per farlo è creare immagini minime prive di file binari che possano essere utilizzate per sfruttare le vulnerabilità. Fortunatamente, Docker ha un meccanismo da cui creare immagini. scratch
############################ # STEP 1 build executable binary ############################ FROM golang:alpine AS builder# Install git. # Git is required for fetching the dependencies. RUN apk update && apk add --no-cache gitWORKDIR $GOPATH/src/mypackage/myapp/COPY . . # Fetch dependencies. # Using go get. RUN go get -d -v# Build the binary. RUN go build -o /go/bin/hello ############################ # STEP 2 build a small image ############################ FROM scratch# Copy our static executable. COPY --from=builder /go/bin/hello /go/bin/hello# Run the hello binary. ENTRYPOINT ["/go/bin/hello"]
Questo crea un'immagine del contenitore composta dalla tua applicazione e nient'altro, rendendolo estremamente sicuro.
Usa tag immutabili con ECR
I tag immutabili
Firma le tue immagini SBOMs, le esecuzioni della pipeline e i report sulle vulnerabilità
Quando Docker è stato introdotto per la prima volta, non esisteva un modello crittografico per la verifica delle immagini dei container. Con la v2, Docker ha aggiunto dei digest al manifesto dell'immagine. Ciò ha consentito di eseguire l'hashing della configurazione di un'immagine e di utilizzare l'hash per generare un ID per l'immagine. Quando la firma delle immagini è abilitata, il motore Docker verifica la firma del manifesto, assicurando che il contenuto sia stato prodotto da una fonte attendibile e che non si siano verificate manomissioni. Dopo aver scaricato ogni layer, il motore verifica il digest del layer, assicurando che il contenuto corrisponda al contenuto specificato nel manifesto. La firma delle immagini consente in modo efficace di creare una catena di approvvigionamento sicura, attraverso la verifica delle firme digitali associate all'immagine.
Possiamo usare AWS Signer o Sigstore Cosign
Nella prossima sezione vedremo come utilizzare gli artefatti attestati per gli audit e la verifica dei controllori di ammissione.
Verifica dell'integrità delle immagini tramite il controller di ammissione Kubernetes
Possiamo verificare le firme delle immagini e gli artefatti attestati in modo automatizzato prima di distribuire l'immagine sul cluster Kubernetes di destinazione utilizzando un controller di ammissione dinamico e ammettere le distribuzioni solo quando i metadati di sicurezza degli artefatti sono conformi alle politiche del controller di ammissione
Ad esempio, possiamo scrivere una politica che verifichi crittograficamente la firma di un'immagine, un SBOM attestato, un rapporto di esecuzione della pipeline attestato o un rapporto di scansione CVE attestato. Possiamo scrivere condizioni nella policy per controllare i dati nel report, ad esempio una scansione CVE non dovrebbe presentare alcuna criticità. CVEs La distribuzione è consentita solo per le immagini che soddisfano queste condizioni e tutte le altre implementazioni verranno rifiutate dal responsabile delle ammissioni.
Alcuni esempi di controller di ammissione includono:
Aggiorna i pacchetti nelle immagini del contenitore
Dovresti includere RUN apt-get update && apt-get upgrade
nei tuoi Dockerfile per aggiornare i pacchetti nelle tue immagini. Sebbene l'aggiornamento richieda l'esecuzione come root, ciò avviene durante la fase di creazione dell'immagine. L'applicazione non deve essere eseguita come root. È possibile installare gli aggiornamenti e quindi passare a un altro utente con la direttiva USER. Se l'immagine di base viene eseguita come utente non root, passa a root e viceversa; non affidarti esclusivamente ai manutentori dell'immagine di base per installare gli ultimi aggiornamenti di sicurezza.
Esegui apt-get clean
per eliminare i file di installazione da. /var/cache/apt/archives/
È possibile eseguire l'operazione anche rm -rf /var/lib/apt/lists/*
dopo aver installato i pacchetti. Ciò rimuove i file di indice o gli elenchi di pacchetti disponibili per l'installazione. Tieni presente che questi comandi possono essere diversi per ogni gestore di pacchetti. Per esempio:
RUN apt-get update && apt-get install -y \ curl \ git \ libsqlite3-dev \ && apt-get clean && rm -rf /var/lib/apt/lists/*
Strumenti e risorse
-
Workshop di immersione nella sicurezza di Amazon EKS - Sicurezza delle immagini
-
docker-slim
Crea immagini minime sicure -
dockle
Verifica che il tuo Dockerfile sia in linea con le migliori pratiche per la creazione di immagini sicure -
dockerfile-lint Linter basato su regole per Dockerfiles
-
Gatekeeper e
OPA Un controller di ammissione basato su policy -
Kyverno
Un motore di policy nativo di Kubernetes -
in-toto Consente all'
utente di verificare se una fase della catena di fornitura era destinata ad essere eseguita e se la fase è stata eseguita dall'attore giusto -
Notary
Un progetto per firmare le immagini dei container -
Grafeas
Un'API aperta per i metadati degli artefatti per controllare e governare la catena di fornitura del software -
NeuVector di SUSE
, piattaforma open source e zero-trust per la sicurezza dei container, fornisce la scansione di container, immagini e registri per individuare vulnerabilità, segreti e conformità.