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 di rete
La sicurezza di rete ha diverse sfaccettature. Il primo riguarda l'applicazione di regole che limitano il flusso del traffico di rete tra i servizi. Il secondo riguarda la crittografia del traffico mentre è in transito. I meccanismi per implementare queste misure di sicurezza su EKS sono vari, ma spesso includono i seguenti elementi:
Controllo del traffico
-
Politiche di rete
-
Gruppi di sicurezza
Crittografia di rete
-
Service Mesh
-
Interfacce di rete per container () CNIs
-
Controller di ingresso e sistemi di bilanciamento del carico
-
Istanze Nitro
-
ACM Private CA con cert-manager
Politica di rete
All'interno di un cluster Kubernetes, tutte le comunicazioni da Pod a Pod sono consentite per impostazione predefinita. Sebbene questa flessibilità possa contribuire a promuovere la sperimentazione, non è considerata sicura. Le policy di rete di Kubernetes offrono un meccanismo per limitare il traffico di rete tra i Pod (spesso denominato traffico Est/Ovest) e tra i Pod e i servizi esterni. Le politiche di rete Kubernetes operano ai livelli 3 e 4 del modello OSI. Le policy di rete utilizzano pod, selettori di namespace ed etichette per identificare i pod di origine e destinazione, ma possono anche includere indirizzi IP, numeri di porta, protocolli o una combinazione di questi. Le politiche di rete possono essere applicate alle connessioni in entrata o in uscita al pod, spesso chiamate regole di ingresso e uscita.
Con il supporto nativo delle policy di rete del plugin Amazon VPC CNI, puoi implementare policy di rete per proteggere il traffico di rete nei cluster Kubernetes. Questo si integra con l'API Kubernetes Network Policy upstream, garantendo compatibilità e aderenza agli standard Kubernetes. Puoi definire le politiche utilizzando diversi identificatori supportati dall'API upstream.
Importante
Quando si effettua il provisioning per la prima volta di un cluster EKS, la funzionalità VPC CNI Network Policy non è abilitata per impostazione predefinita. Assicurati di aver distribuito la versione del componente aggiuntivo VPC CNI supportata e ENABLE_NETWORK_POLICY
imposta il flag sul componente aggiuntivo vpc-cni true
per abilitarlo. Consulta la guida per l'utente di Amazon EKS per istruzioni dettagliate.
Raccomandazioni
Guida introduttiva alle politiche di rete: segui il principio dei privilegi minimi
Crea una politica di rifiuto predefinita
Come per le politiche RBAC, si consiglia di seguire i principi di accesso con privilegi minimi per quanto riguarda le politiche di rete. Inizia creando una politica di negazione totale che limiti tutto il traffico in entrata e in uscita all'interno di un namespace.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny namespace: default spec: podSelector: {} policyTypes: - Ingress - Egress
rifiuto per default

Crea una regola per consentire le query DNS
Una volta impostata la regola deny all predefinita, puoi iniziare a sovrapporre regole aggiuntive, ad esempio una regola che consente ai pod di interrogare CoredNS per la risoluzione dei nomi.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-dns-access namespace: default spec: podSelector: matchLabels: {} policyTypes: - Egress egress: - to: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: kube-dns ports: - protocol: UDP port: 53
allow-dns-access

Aggiungi regole in modo incrementale per consentire in modo selettivo il flusso di traffico tra namespace e pod
Comprendi i requisiti dell'applicazione e crea regole di ingresso e uscita granulari in base alle esigenze. L'esempio seguente mostra come limitare il traffico in ingresso dalla porta 80 a quella da. app-one
client-one
Questo aiuta a ridurre al minimo la superficie di attacco e riduce il rischio di accesso non autorizzato.
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-ingress-app-one namespace: default spec: podSelector: matchLabels: k8s-app: app-one policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: k8s-app: client-one ports: - protocol: TCP port: 80
allow-ingress-app-one

Monitoraggio dell'applicazione delle politiche di rete
-
Usa l'editor delle politiche di rete
-
L'editor delle politiche di rete
aiuta con le visualizzazioni, il punteggio di sicurezza, si genera automaticamente dai log dei flussi di rete -
Crea politiche di rete in modo interattivo
-
-
Registri di controllo
-
Esamina regolarmente i registri di controllo del tuo cluster EKS
-
I registri di controllo forniscono numerose informazioni sulle azioni eseguite sul cluster, comprese le modifiche alle politiche di rete
-
Utilizzate queste informazioni per tenere traccia delle modifiche alle politiche di rete nel tempo e rilevare eventuali modifiche non autorizzate o impreviste
-
-
Test automatizzati
-
Implementa i test automatizzati creando un ambiente di test che rispecchi il tuo ambiente di produzione e distribuisci periodicamente carichi di lavoro che tentano di violare le politiche di rete.
-
-
Metriche di monitoraggio
-
Configura i tuoi agenti di osservabilità per acquisire le metriche di Prometheus dagli agenti del nodo VPC CNI, che consentono di monitorare lo stato degli agenti e gli errori dell'sdk.
-
-
Controlla regolarmente le politiche di rete
-
Controllate periodicamente le vostre politiche di rete per assicurarvi che soddisfino i requisiti delle applicazioni correnti. Man mano che l'applicazione si evolve, un audit offre l'opportunità di rimuovere le regole di ingresso e uscita ridondanti e di assicurarsi che le applicazioni non dispongano di autorizzazioni eccessive.
-
-
Assicurati che esistano politiche di rete utilizzando Open Policy Agent (OPA)
-
Utilizzate la politica OPA come illustrata di seguito per garantire che la politica di rete esista sempre prima dell'onboarding dei pod delle applicazioni. Questa politica nega l'onboarding dei pod k8s con un'etichetta se non esiste una politica di rete corrispondente.
k8s-app: sample-app
-
package kubernetes.admission import data.kubernetes.networkpolicies deny[msg] { input.request.kind.kind == "Pod" pod_label_value := {v["k8s-app"] | v := input.request.object.metadata.labels} contains_label(pod_label_value, "sample-app") np_label_value := {v["k8s-app"] | v := networkpolicies[_].spec.podSelector.matchLabels} not contains_label(np_label_value, "sample-app") msg:= sprintf("The Pod %v could not be created because it is missing an associated Network Policy.", [input.request.object.metadata.name]) } contains_label(arr, val) { arr[_] == val }
Risoluzione dei problemi
Monitora vpc-network-policy-controller i log di Node-Agent
Abilita i log del gestore del controller del piano di controllo EKS per diagnosticare la funzionalità delle politiche di rete. È possibile trasmettere i log del control plane a un gruppo di CloudWatch log e utilizzare CloudWatchLog insights per eseguire interrogazioni avanzate. Dai log, è possibile visualizzare quali oggetti dell'endpoint pod sono stati risolti in una policy di rete, lo stato di riconciliazione delle policy ed eseguire il debug se la policy funziona come previsto.
Inoltre, Amazon VPC CNI consente di abilitare la raccolta e l'esportazione dei log di applicazione delle policy su Amazon
Amazon VPC CNI fornisce anche un SDK che fornisce un'interfaccia per interagire con i programmi eBPF sul nodo. L'SDK viene installato quando aws-node
viene distribuito sui nodi. È possibile trovare il file binario SDK installato /opt/cni/bin
nella directory del nodo. Al momento del lancio, l'SDK fornisce supporto per funzionalità fondamentali come l'ispezione di programmi e mappe eBPF.
sudo /opt/cni/bin/aws-eks-na-cli ebpf progs
Registra i metadati del traffico di rete
AWS VPC Flow Logs acquisisce i metadati sul traffico che scorre attraverso un VPC, come l'indirizzo IP e la porta di origine e destinazione, insieme ai pacchetti accettati/eliminati. Queste informazioni potrebbero essere analizzate per individuare attività sospette o insolite tra le risorse all'interno del VPC, inclusi i Pods. Tuttavia, poiché gli indirizzi IP dei pod cambiano spesso man mano che vengono sostituiti, i Flow Logs potrebbero non essere sufficienti da soli. Calico Enterprise estende i Flow Logs con etichette per pod e altri metadati, semplificando la decifrazione dei flussi di traffico tra i pod.
Gruppi di sicurezza
EKS utilizza AWS VPC Security Groups (SGs) per controllare il traffico tra il piano di controllo Kubernetes e i nodi di lavoro del cluster. I gruppi di sicurezza vengono utilizzati anche per controllare il traffico tra i nodi di lavoro e altre risorse VPC e gli indirizzi IP esterni. Quando esegui il provisioning di un cluster EKS (con Kubernetes versione 1.14-eks.3 o successiva), viene creato automaticamente un gruppo di sicurezza del cluster. Questo gruppo di sicurezza consente una comunicazione senza restrizioni tra il piano di controllo EKS e i nodi dei gruppi di nodi gestiti. Per semplicità, si consiglia di aggiungere il cluster SG a tutti i gruppi di nodi, inclusi i gruppi di nodi non gestiti.
Prima della versione 1.14 di Kubernetes e della versione EKS.3, esistevano gruppi di sicurezza separati configurati per il piano di controllo EKS e i gruppi di nodi. Le regole minime e suggerite per i gruppi di sicurezza del piano di controllo e del gruppo di nodi sono disponibili all'indirizzo -group-reqs.html. https://docs.aws.amazon.com/eks/ latest/userguide/sec Le regole minime per il gruppo di sicurezza del piano di controllo consentono la porta 443 in entrata dal nodo di lavoro SG. Questa regola è ciò che consente ai kubelet di comunicare con il server API Kubernetes. Include anche la porta 10250 per il traffico in uscita verso il nodo di lavoro SG; 10250 è la porta su cui i kubelet ascoltano. Analogamente, le regole del gruppo minimo di nodi consentono la porta 10250 in entrata dal piano di controllo SG e la porta 443 in uscita verso il piano di controllo SG. Infine esiste una regola che consente la comunicazione senza restrizioni tra i nodi all'interno di un gruppo di nodi.
Se devi controllare la comunicazione tra i servizi eseguiti all'interno del cluster e i servizi eseguiti all'esterno del cluster, ad esempio un database RDS, prendi in considerazione i gruppi di sicurezza per i pod. Con i gruppi di sicurezza per i pod, puoi assegnare un gruppo di sicurezza esistente a una raccolta di pod.
avvertimento
Se si fa riferimento a un gruppo di sicurezza che non esiste prima della creazione dei pod, i pod non verranno pianificati.
È possibile controllare quali pod sono assegnati a un gruppo di sicurezza creando un SecurityGroupPolicy
oggetto e specificando un o un. PodSelector
ServiceAccountSelector
L'impostazione dei selettori su {}
assegnerà il SGs riferimento in a tutti i pod in un namespace o SecurityGroupPolicy
a tutti gli account di servizio in uno spazio dei nomi. Assicurati di aver preso visione di tutte le considerazioni prima di implementare i gruppi di sicurezza per i pod.
Importante
Se si utilizza SGs for pod, è necessario creare SGs che consentano la porta 53 in uscita verso il gruppo di sicurezza del cluster. Allo stesso modo, è necessario aggiornare il gruppo di sicurezza del cluster in modo che accetti il traffico in entrata della porta 53 dal gruppo di sicurezza dei pod.
Importante
I limiti per i gruppi di sicurezza si applicano ancora quando si utilizzano i gruppi di sicurezza per i pod, quindi usali con cautela.
Importante
È necessario creare regole per il traffico in entrata dal gruppo di sicurezza del cluster (kubelet) per tutte le sonde configurate per il pod.
Importante
I gruppi di sicurezza per i pod si basano su una funzionalità nota come ENI trunking, creata per aumentare la densità ENI di un'istanza. EC2 Quando un pod viene assegnato a un SG, un controller VPC associa un ramo ENI del gruppo di nodi al pod. Se non ci sono abbastanza branch ENIs disponibili in un gruppo di nodi al momento della pianificazione del pod, il pod rimarrà nello stato in sospeso. Il numero di branch che ENIs un'istanza può supportare varia in base al tipo/famiglia di istanza. Vedi https://docs.aws.amazon.com/eks/latest/userguide/securitygroups-for-podssupported-instance-types-.html# per ulteriori dettagli.
Sebbene i gruppi di sicurezza per i pod offrano un modo nativo di AWS per controllare il traffico di rete all'interno e all'esterno del cluster senza il sovraccarico di un demone di policy, sono disponibili altre opzioni. Ad esempio, il motore di policy Cilium consente di fare riferimento a un nome DNS in una policy di rete. Calico Enterprise include un'opzione per mappare le policy di rete ai gruppi di sicurezza AWS. Se hai implementato una service mesh come Istio, puoi utilizzare un gateway di uscita per limitare l'uscita della rete a domini o indirizzi IP specifici e completamente qualificati. Per ulteriori informazioni su questa opzione, leggi la serie in tre parti sul controllo del traffico in uscita in Istio
Quando utilizzare Network Policy vs Security Group for Pods?
Quando utilizzare la politica di rete Kubernetes
-
Controllo del traffico pod-to-pod
-
Adatto per controllare il traffico di rete tra i pod all'interno di un cluster (traffico est-ovest)
-
-
Controlla il traffico a livello di indirizzo IP o porta (OSI layer 3 o 4)
Quando usare AWS Security groups for pods (SGP)
-
Sfrutta le configurazioni AWS esistenti
-
Se disponi già di un set complesso di gruppi di EC2 sicurezza che gestiscono l'accesso ai servizi AWS e stai migrando le applicazioni dalle EC2 istanze a EKS, SGPs può essere un'ottima scelta che ti consente di riutilizzare le risorse dei gruppi di sicurezza e applicarle ai tuoi pod.
-
-
Controlla l'accesso ai servizi AWS
-
Le tue applicazioni in esecuzione all'interno di un cluster EKS vogliono comunicare con altri servizi AWS (database RDS), da utilizzare SGPs come meccanismo efficiente per controllare il traffico dai pod ai servizi AWS.
-
-
Isolamento del traffico Pod & Node
-
Se desideri separare completamente il traffico dei pod dal resto del traffico del nodo, usa la
POD_SECURITY_GROUP_ENFORCING_MODE=strict
modalità SGP in.
-
Le migliori pratiche relative all'utilizzo dei gruppi di sicurezza per i pod e della politica di rete
-
Sicurezza a più livelli
-
Utilizza una combinazione di policy di rete SGP e Kubernetes per un approccio di sicurezza a più livelli
-
Utilizzalo SGPs per limitare l'accesso a livello di rete ai servizi AWS che non fanno parte di un cluster, mentre le policy di rete Kubernetes possono limitare il traffico di rete tra i pod all'interno del cluster
-
-
Principio del privilegio minimo
-
Consenti solo il traffico necessario tra pod o namespace
-
-
Segmenta le tue applicazioni
-
Ove possibile, segmenta le applicazioni in base alla politica di rete per ridurre il raggio di esplosione se un'applicazione viene compromessa
-
-
Mantieni le politiche semplici e chiare
-
Le policy di rete Kubernetes possono essere piuttosto granulari e complesse, è meglio mantenerle il più semplici possibile per ridurre il rischio di errori di configurazione e alleggerire il sovraccarico di gestione
-
-
Riduci la superficie di attacco
-
Riduci al minimo la superficie di attacco limitando l'esposizione delle tue applicazioni
-
Importante
Security Groups for pods offre due modalità di applicazione: e. strict
standard
È necessario utilizzare standard
la modalità quando si utilizzano le funzionalità Network Policy e Security Groups for pods in un cluster EKS.
Quando si tratta di sicurezza della rete, un approccio a più livelli è spesso la soluzione più efficace. L'uso combinato della policy di rete di Kubernetes e di SGP può fornire una solida defense-in-depth strategia per le applicazioni eseguite in EKS.
Service Mesh Policy Enforcement o policy di rete Kubernetes
A service mesh
è un livello di infrastruttura dedicato che puoi aggiungere alle tue applicazioni. Consente di aggiungere in modo trasparente funzionalità come osservabilità, gestione del traffico e sicurezza, senza aggiungerle al proprio codice.
Service Mesh applica le policy al Layer 7 (applicazione) del modello OSI, mentre le policy di rete Kubernetes operano al Layer 3 (rete) e al Layer 4 (trasporto). Ci sono molte offerte in questo spazio come AWSAppMesh, Istio, Linkerd, ecc.
Quando utilizzare Service mesh per l'applicazione delle politiche
-
Disponi di investimenti esistenti in una rete di servizi
-
Hai bisogno di funzionalità più avanzate come la gestione del traffico, l'osservabilità e la sicurezza
-
Controllo del traffico, bilanciamento del carico, interruzione del circuito, limitazione della velocità, timeout ecc.
-
Informazioni dettagliate sulle prestazioni dei tuoi servizi (latenza, tassi di errore, richieste al secondo, volumi di richieste ecc.)
-
Desiderate implementare e sfruttare Service Mesh per funzionalità di sicurezza come gli MTL
-
Scegli la policy di rete Kubernetes per casi d'uso più semplici
-
Limita i pod che possono comunicare tra loro
-
Le policy di rete richiedono meno risorse rispetto a una service mesh, il che le rende adatte per casi d'uso più semplici o per cluster più piccoli in cui il sovraccarico di esecuzione e gestione di una service mesh potrebbe non essere giustificato
Nota
Le policy di rete e la Service Mesh possono anche essere utilizzate insieme. Utilizza le policy di rete per fornire un livello base di sicurezza e isolamento tra i pod, quindi utilizza una service mesh per aggiungere funzionalità aggiuntive come la gestione del traffico, l'osservabilità e la sicurezza.
ThirdParty Motori di policy di rete
Prendi in considerazione un motore di policy di rete di terze parti quando hai requisiti di policy avanzati come politiche di rete globali, supporto per regole basate sui nomi host DNS, regole di livello 7, regole ServiceAccount basate e deny/log azioni esplicite, ecc. Calico
Puoi trovare un elenco delle politiche di rete Kubernetes comuni all'indirizzo. https://github.com/ahmetb/kubernetes-network-policy-recipes
Migrazione al motore di policy di rete Amazon VPC CNI
Per mantenere la coerenza ed evitare comportamenti imprevisti nelle comunicazioni tra i pod, si consiglia di implementare un solo Network Policy Engine nel cluster. Se desideri migrare da 3P a VPC CNI Network Policy Engine, ti consigliamo di convertire le tue risorse 3P esistenti in Kubernetes prima di abilitare il supporto NetworkPolicy CRDs delle policy di rete VPC CNI. NetworkPolicy Inoltre, verifica le politiche migrate in un cluster di test separato prima di applicarle nel tuo ambiente di produzione. Ciò consente di identificare e risolvere eventuali problemi o incongruenze nel comportamento di comunicazione dei pod.
Strumento di migrazione
Per aiutarti nel processo di migrazione, abbiamo sviluppato uno strumento chiamato K8s Network Policy Migrator che converte le policy di rete
Importante
Lo strumento di migrazione convertirà solo le politiche 3P compatibili con l'API nativa delle politiche di rete Kubernetes. Se utilizzi le funzionalità avanzate di policy di rete offerte dai plugin 3P, Migration Tool le ignorerà e le segnalerà.
Tieni presente che lo strumento di migrazione non è attualmente supportato dal team di progettazione delle policy di rete CNI di AWS VPC, ma viene messo a disposizione dei clienti con la massima diligenza. Ti invitiamo a utilizzare questo strumento per facilitare il processo di migrazione. Nel caso in cui riscontrassi problemi o bug con lo strumento, ti chiediamo gentilmente di creare un problema. GitHub
Risorse aggiuntive
-
NetworkPolicyEditor, un editor
interattivo di policy di Cilium -
Inspektor Gadget consiglia il gadget per le politiche di rete Suggerisce politiche di rete basate
su un'analisi del traffico di rete
Crittografia in transito
Le applicazioni che devono essere conformi a PCI, HIPAA o altre normative potrebbero dover crittografare i dati mentre sono in transito. Al giorno d'oggi TLS è di fatto la scelta ideale per crittografare il traffico via cavo. TLS, come il suo predecessore SSL, fornisce comunicazioni sicure su una rete utilizzando protocolli crittografici. TLS utilizza la crittografia simmetrica in cui le chiavi per crittografare i dati vengono generate sulla base di un segreto condiviso negoziato all'inizio della sessione. Di seguito sono riportati alcuni modi in cui è possibile crittografare i dati in un ambiente Kubernetes.
Istanze Nitro
Il traffico scambiato tra i seguenti tipi di istanze Nitro, ad esempio C5n, G4, I3en, M5dn, M5n, P3dn, R5dn e R5n, viene crittografato automaticamente per impostazione predefinita. Quando è presente un hop intermedio, come un gateway di transito o un sistema di bilanciamento del carico, il traffico non è crittografato. Vedi Encryption in transit per ulteriori dettagli sulla crittografia in transito e per l'elenco completo dei tipi di istanze che supportano la crittografia di rete per impostazione predefinita.
Interfacce di rete per container () CNIs
WeaveNet
Service Mesh
La crittografia in transito può essere implementata anche con una mesh di servizi come App Mesh, Linkerd v2 e Istio. AppMesh supporta MTL con certificati X.509 o Envoy's Secret Discovery Service (SDS). Linkerd e Istio supportano entrambi gli MTL.
Il aws-app-mesh-examples
App Mesh supporta anche la crittografia TLS con un certificato privato emesso da AWS Certificate Manager (ACM) o un certificato archiviato nel file system locale del nodo virtuale.
Il aws-app-mesh-examples
Controller di ingresso e sistemi di bilanciamento del carico
I controller di ingresso consentono di indirizzare in modo intelligente l'elaborazione e richiedono un uso intensivo della CPU. HTTP/S traffic that emanates from outside the cluster to services running inside the cluster. Oftentimes, these Ingresses are fronted by a layer 4 load balancer, like the Classic Load Balancer or the Network Load Balancer (NLB). Encrypted traffic can be terminated at different places within the network, e.g. at the load balancer, at the ingress resource, or the Pod. How and where you terminate your SSL connection will ultimately be dictated by your organization’s network security policy. For instance, if you have a policy that requires end-to-end encryption, you will have to decrypt the traffic at the Pod. This will place additional burden on your Pod as it will have to spend cycles establishing the initial handshake. Overall SSL/TLS Di conseguenza, se hai la flessibilità, prova a eseguire l'offload SSL presso Ingress o il load balancer.
Usa la crittografia con i sistemi di bilanciamento del carico AWS Elastic
AWS Application Load Balancer (ALB) e Network Load Balancer (NLB) supportano entrambi la crittografia del trasporto (SSL e TLS). L'alb.ingress.kubernetes.io/certificate-arn
annotazione per l'ALB consente di specificare quali certificati aggiungere all'ALB. Se ometti l'annotazione, il controller tenterà di aggiungere certificati ai listener che lo richiedono abbinando i certificati AWS Certificate Manager (ACM) disponibili utilizzando il campo host. A partire da EKS v1.15 puoi usare l'service.beta.kubernetes.io/aws-load-balancer-ssl-cert
annotazione con l'NLB come mostrato nell'esempio seguente.
apiVersion: v1 kind: Service metadata: name: demo-app namespace: default labels: app: demo-app annotations: service.beta.kubernetes.io/aws-load-balancer-type: "nlb" service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "<certificate ARN>" service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443" service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http" spec: type: LoadBalancer ports: - port: 443 targetPort: 80 protocol: TCP selector: app: demo-app //--- kind: Deployment apiVersion: apps/v1 metadata: name: nginx namespace: default labels: app: demo-app spec: replicas: 1 selector: matchLabels: app: demo-app template: metadata: labels: app: demo-app spec: containers: - name: nginx image: nginx ports: - containerPort: 443 protocol: TCP - containerPort: 80 protocol: TCP
Di seguito sono riportati altri esempi di terminazione. SSL/TLS
Importante
Alcuni ingressi, come il controller AWS LB, implementano l' SSL/TLS utilizzo di Annotations anziché come parte delle specifiche Ingress.
ACM Private CA con cert-manager
Puoi abilitare TLS e mTLS per proteggere i carichi di lavoro delle applicazioni EKS all'ingresso, sul pod e tra i pod utilizzando ACM Private Certificate Authority (CA) e cert-manager, un popolare componente aggiuntivo di Kubernetes per distribuire, rinnovare
Modalità CA di breve durata per TLS reciproco tra carichi di lavoro
Quando si utilizza ACM Private CA for mTLS in EKS, si consiglia di utilizzare certificati di breve durata con modalità CA di breve durata. Sebbene sia possibile emettere certificati di breve durata in modalità CA generica, l'utilizzo della modalità CA di breve durata risulta più conveniente (circa il 75% in meno rispetto alla modalità generale) per i casi d'uso in cui è necessario emettere frequentemente nuovi certificati. Inoltre, dovresti provare ad allineare il periodo di validità dei certificati privati alla durata dei pod del tuo cluster EKS. Scopri di più su ACM Private CA e sui suoi vantaggi qui
Istruzioni di configurazione ACM
Inizia creando una CA privata seguendo le procedure fornite nei documenti tecnici di ACM Private CA. Una volta che hai una CA privata, installa cert-manager utilizzando le normali istruzioni di installazione.
Ora che hai una CA privata e un cluster EKS con cert-manager e il plug-in installati, è il momento di impostare le autorizzazioni e creare l'emittente. Aggiorna le autorizzazioni IAM del ruolo del nodo EKS per consentire l'accesso a ACM Private CA. Sostituisci il valore <CA_ARN>
con il valore della tua CA privata:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "awspcaissuer", "Action": [ "acm-pca:DescribeCertificateAuthority", "acm-pca:GetCertificate", "acm-pca:IssueCertificate" ], "Effect": "Allow", "Resource": "<CA_ARN>" } ] }
È possibile utilizzare anche Service Roles for IAM Accounts o IRSA. Consulta la sezione Risorse aggiuntive di seguito per esempi completi.
Crea un emittente in Amazon EKS creando un file di definizione delle risorse personalizzato denominato cluster-issuer.yaml contenente il testo seguente, sostituendo <CA_ARN>
le informazioni con la tua CA privata. <Region>
apiVersion: awspca.cert-manager.io/v1beta1 kind: AWSPCAClusterIssuer metadata: name: demo-test-root-ca spec: arn: <CA_ARN> region: <Region>
Implementa l'emittente che hai creato.
kubectl apply -f cluster-issuer.yaml
Il tuo cluster EKS è configurato per richiedere certificati da Private CA. Ora puoi utilizzare la Certificate
risorsa di cert-manager per emettere certificati modificando i valori del issuerRef
campo nell'emittente CA privato che hai creato sopra. Per maggiori dettagli su come specificare e richiedere le risorse relative ai certificati, consulta la guida alle risorse per i certificati di cert-manager.
ACM Private CA con Istio e cert-manager
Se esegui Istio nel tuo cluster EKS, puoi disabilitare il piano di controllo Istio (in particolareistiod
) dal funzionamento come Autorità di certificazione (CA) principale e configurare ACM Private CA come CA principale per MTL tra i carichi di lavoro. Se utilizzi questo approccio, prendi in considerazione l'utilizzo della modalità CA di breve durata in ACM Private CA. Per maggiori dettagli, consulta la sezione precedente e questo post del blog
Come funziona la firma dei certificati in Istio (impostazione predefinita)
I carichi di lavoro in Kubernetes vengono identificati utilizzando gli account di servizio. Se non specifichi un account di servizio, Kubernetes ne assegnerà automaticamente uno al tuo carico di lavoro. Inoltre, gli account di servizio montano automaticamente un token associato. Questo token viene utilizzato dall'account di servizio per i carichi di lavoro per l'autenticazione con l'API Kubernetes. L'account di servizio può essere sufficiente come identità per Kubernetes, ma Istio dispone di un proprio sistema di gestione delle identità e di CA. Quando un carico di lavoro si avvia con il suo proxy sidecar Envoy, ha bisogno di un'identità assegnata da Istio per poter essere considerato affidabile e poter comunicare con gli altri servizi della rete mesh.
Per ottenere questa identità da Istio, istio-agent
invia una richiesta nota come richiesta di firma del certificato (o CSR) al piano di controllo Istio. Questa CSR contiene il token dell'account del servizio in modo che l'identità del carico di lavoro possa essere verificata prima dell'elaborazione. Questo processo di verifica è gestito daistiod
, che funge sia da Autorità di registrazione (o RA) che da CA. La RA funge da guardiano che assicura che solo la CSR verificata pervenga alla CA. Una volta verificata, la CSR verrà inoltrata alla CA che emetterà quindi un certificato contenente un'identità SPIFFE
Flusso predefinito per le richieste di firma dei certificati Istio:

Come funziona la firma dei certificati in Istio con ACM Private CA
Puoi utilizzare un componente aggiuntivo cert-manager chiamato Istio Certificate Signing Request agent (istio-csr) per integrare Istio
Ogni volta che viene generata una CSR da un carico di lavoro, questa verrà inoltrata a istio-csr, che richiederà i certificati da ACM Private CA. Questa comunicazione tra istio-csr e ACM Private CA è abilitata dal plugin AWS
Richieste di firma dei certificati Flow for Istio con istio-csr
image: istio-csr-with-acm -private-ca.png [Flow per le richieste di firma dei certificati Istio con istio-csr]
Istruzioni di configurazione di Istio con CA privata
-
Inizia seguendo le stesse istruzioni di configurazione in questa sezione per completare quanto segue:
-
Creare una CA privata
-
Installa cert-manager
-
Installa il plugin dell'emittente
-
Imposta le autorizzazioni e crea un emittente. L'emittente rappresenta la CA e viene utilizzato per firmare
istiod
e integrare i certificati del carico di lavoro. Comunicherà con ACM Private CA. -
Crea un
istio-system
namespace. È qui che verranno distribuite leistiod certificate
e altre risorse Istio. -
Installa Istio CSR configurato con AWS Private CA Issuer Plugin. Puoi conservare le richieste di firma dei certificati per i carichi di lavoro per verificare che vengano approvate e firmate ().
preserveCertificateRequests=true
helm install -n cert-manager cert-manager-istio-csr jetstack/cert-manager-istio-csr \ --set "app.certmanager.issuer.group=awspca.cert-manager.io" \ --set "app.certmanager.issuer.kind=AWSPCAClusterIssuer" \ --set "app.certmanager.issuer.name=<the-name-of-the-issuer-you-created>" \ --set "app.certmanager.preserveCertificateRequests=true" \ --set "app.server.maxCertificateDuration=48h" \ --set "app.tls.certificateDuration=24h" \ --set "app.tls.istiodCertificateDuration=24h" \ --set "app.tls.rootCAFile=/var/run/secrets/istio-csr/ca.pem" \ --set "volumeMounts[0].name=root-ca" \ --set "volumeMounts[0].mountPath=/var/run/secrets/istio-csr" \ --set "volumes[0].name=root-ca" \ --set "volumes[0].secret.secretName=istio-root-ca"
-
Installa Istio con configurazioni personalizzate da sostituire
istiod
concert-manager istio-csr
come fornitore di certificati per la mesh. Questo processo può essere eseguito utilizzando l'operatore Istio. apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: name: istio namespace: istio-system spec: profile: "demo" hub: gcr.io/istio-release values: global: # Change certificate provider to cert-manager istio agent for istio agent caAddress: cert-manager-istio-csr.cert-manager.svc:443 components: pilot: k8s: env: # Disable istiod CA Sever functionality - name: ENABLE_CA_SERVER value: "false" overlays: - apiVersion: apps/v1 kind: Deployment name: istiod patches: # Mount istiod serving and webhook certificate from Secret mount - path: spec.template.spec.containers.[name:discovery].args[7] value: "--tlsCertFile=/etc/cert-manager/tls/tls.crt" - path: spec.template.spec.containers.[name:discovery].args[8] value: "--tlsKeyFile=/etc/cert-manager/tls/tls.key" - path: spec.template.spec.containers.[name:discovery].args[9] value: "--caCertFile=/etc/cert-manager/ca/root-cert.pem" - path: spec.template.spec.containers.[name:discovery].volumeMounts[6] value: name: cert-manager mountPath: "/etc/cert-manager/tls" readOnly: true - path: spec.template.spec.containers.[name:discovery].volumeMounts[7] value: name: ca-root-cert mountPath: "/etc/cert-manager/ca" readOnly: true - path: spec.template.spec.volumes[6] value: name: cert-manager secret: secretName: istiod-tls - path: spec.template.spec.volumes[7] value: name: ca-root-cert configMap: defaultMode: 420 name: istio-ca-root-cert
-
Distribuisci la risorsa personalizzata sopra riportata che hai creato.
istioctl operator init kubectl apply -f istio-custom-config.yaml
-
Ora puoi distribuire un carico di lavoro nella rete mesh del tuo cluster EKS e applicare gli MTL.
Richieste di firma dei certificati Istio
image: istio-csr-requests .png [richieste di firma del certificato Istio]
Strumenti e risorse
-
Workshop di immersione sulla sicurezza di Amazon EKS - Sicurezza di rete
-
Come implementare cert-manager e il plug-in ACM Private CA per abilitare
TLS in EKS. -
Plugin cert-manager privato CA Kubernetes attivo
. GitHub -
Guida per l'utente del plug-in cert-manager di CA Kubernetes privato.
-
Come utilizzare la modalità di certificazione di breve durata di AWS Private Certificate Authority
-
egress-operator Un operatore
e un plug-in DNS per controllare il traffico in uscita dal cluster senza ispezione del protocollo -
NeuVector di SUSE
, piattaforma open source di sicurezza per container zero-trust, fornisce policy, regole di rete, prevenzione della perdita di dati (DLP), web application firewall (WAF) e firme relative alle minacce di rete.