Configura end-to-end la crittografia per le applicazioni su Amazon EKS utilizzando cert-manager e Let's Encrypt - Prontuario AWS

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à.

Configura end-to-end la crittografia per le applicazioni su Amazon EKS utilizzando cert-manager e Let's Encrypt

Creato da Mahendra Revanasiddappa () e Vasanth Jeyaraj () AWS AWS

Repository di codice: nd-to-end crittografia E su Amazon EKS

Ambiente: PoC o pilota

Tecnologie: DevOps; Contenitori e microservizi; Sicurezza, identità, conformità

Carico di lavoro: tutti gli altri carichi di lavoro

AWSservizi: AmazonEKS; Amazon Route 53

Riepilogo

L'implementazione della end-to-end crittografia può essere complessa e devi gestire i certificati per ogni risorsa nell'architettura dei microservizi. Sebbene sia possibile interrompere la connessione Transport Layer Security (TLS) ai margini della rete Amazon Web Services (AWS) con un Network Load Balancer o API Amazon Gateway, alcune organizzazioni end-to-end richiedono la crittografia.

Questo modello utilizza NGINX Ingress Controller per l'ingresso. Questo perché quando crei un ingresso Kubernetes, la risorsa di ingresso utilizza un Network Load Balancer. Il Network Load Balancer non consente il caricamento di certificati client. Pertanto, non è possibile ottenere risultati reciproci TLS con Kubernetes Ingress.

Questo modello è destinato alle organizzazioni che richiedono l'autenticazione reciproca tra tutti i microservizi delle loro applicazioni. Mutual TLS riduce l'onere di mantenere i nomi utente o le password e può anche utilizzare il framework di sicurezza chiavi in mano. L'approccio di questo modello è compatibile se l'organizzazione ha un gran numero di dispositivi connessi o deve rispettare rigide linee guida di sicurezza.

Questo modello aiuta a migliorare il livello di sicurezza dell'organizzazione implementando la end-to-end crittografia per le applicazioni in esecuzione su Amazon Elastic Kubernetes Service (Amazon). EKS Questo modello fornisce un'applicazione e un codice di esempio nel EKS repository di nd-to-end crittografia GitHub E su Amazon per mostrare come un microservizio funziona con la end-to-end crittografia su Amazon. EKS L'approccio del pattern utilizza cert-manager, un componente aggiuntivo di Kubernetes, con Let's Encrypt come autorità di certificazione (CA). Let's Encrypt è una soluzione economica per gestire i certificati e fornisce certificati gratuiti validi per 90 giorni. Cert-manager automatizza il provisioning e la rotazione dei certificati su richiesta quando viene distribuito un nuovo microservizio su Amazon. EKS 

Destinatari

Questo modello è consigliato agli utenti che hanno esperienza con KubernetesTLS, Amazon Route 53 e Domain Name System (). DNS

Prerequisiti e limitazioni

Prerequisiti

  • Un account AWS attivo.

  • Un EKS cluster Amazon esistente.

  • AWSCommand Line Interface (AWSCLI) versione 1.7 o successiva, installata e configurata su macOS, Linux o Windows.

  • L'utilità da riga di kubectl comando, installata e configurata per accedere al EKS cluster Amazon. Per ulteriori informazioni a riguardo, consulta Installazione di kubectl nella documentazione di Amazon. EKS

  • Un DNS nome esistente per testare l'applicazione. Per ulteriori informazioni su questo argomento, consulta Registrazione di nomi di dominio utilizzando Amazon Route 53 nella documentazione di Amazon Route 53. 

  • L'ultima versione di Helm, installata sul tuo computer locale. Per ulteriori informazioni su questo argomento, consulta Using Helm with Amazon EKS nella EKS documentazione di Amazon e nel repository GitHub Helm

  • La nd-to-end crittografia GitHub E sul EKS repository Amazon, clonata sul tuo computer locale. 

  • Sostituisci i seguenti valori nei trustpolicy.json file policy.json and dalla nd-to-end crittografia GitHub E clonata sul repository Amazon EKS:

    • <account number>— Sostituiscilo con l'AWSID dell'account in cui desideri implementare la soluzione. 

    • <zone id>— Sostituire con l'ID di zona Route 53 del nome di dominio. 

    • <node_group_role>— Sostituire con il nome del ruolo AWS Identity and Access Management (IAM) associato ai EKS nodi Amazon.

    • <namespace>— Sostituiscilo con lo spazio dei nomi Kubernetes in cui distribuisci l'NGINXIngress Controller e l'applicazione di esempio.

    • <application-domain-name>— Sostituisci con il nome di DNS dominio di Route 53.

Limitazioni

  • Questo modello non descrive come ruotare i certificati e dimostra solo come utilizzare i certificati con microservizi su Amazon. EKS 

Architettura

Il diagramma seguente mostra i componenti del flusso di lavoro e dell'architettura di questo modello.

Flusso di lavoro per configurare la crittografia per le applicazioni su Amazon EKS utilizzando cert-manager e Let's Encrypt.

Il diagramma mostra il flusso di lavoro seguente:

  1. Un client invia una richiesta per accedere all'applicazione al nome. DNS

  2. Il record Route 53 appartiene CNAME al Network Load Balancer.

  3. Il Network Load Balancer inoltra la richiesta all'NGINXIngress Controller configurato con un listener. TLS La comunicazione tra l'NGINXIngress Controller e il Network Load Balancer segue il protocolloHTTPS.

  4. L'NGINXIngress Controller esegue il routing basato sul percorso in base alla richiesta del client al servizio applicativo.

  5. Il servizio applicativo inoltra la richiesta al pod dell'applicazione. L'applicazione è progettata per utilizzare lo stesso certificato chiamando segreti.

  6. I pod eseguono l'applicazione di esempio utilizzando i certificati cert-manager. La comunicazione tra l'NGINXIngress Controller e i pod utilizza. HTTPS

Nota: Cert-Manager viene eseguito nel proprio spazio dei nomi. Utilizza un ruolo del cluster Kubernetes per fornire certificati come segreti in namespace specifici. Puoi allegare questi namespace ai pod delle applicazioni e a Ingress Controller. NGINX

Strumenti

AWSservizi

Altri strumenti

  • cert-manager è un componente aggiuntivo di Kubernetes che richiede certificati, li distribuisce nei contenitori Kubernetes e automatizza il rinnovo dei certificati.

  • NGINXIngress Controller è una soluzione di gestione del traffico per app native del cloud in Kubernetes e ambienti containerizzati.

Epiche

AttivitàDescrizioneCompetenze richieste

Crea una zona ospitata pubblica in Route 53.

Accedi alla console di AWS gestione, apri la console Amazon Route 53, scegli Zone ospitate, quindi scegli Crea zona ospitata. Crea una zona ospitata pubblica e registra l'ID della zona. Per ulteriori informazioni su questo argomento, consulta Creazione di una zona ospitata pubblica nella documentazione di Amazon Route 53.

Nota: ACME DNS 01 utilizza il DNS provider per inviare una richiesta di rilascio del certificato da parte di cert-manager. Questa sfida ti chiede di dimostrare di controllare il tuo nome DNS di dominio inserendo un valore specifico in un TXT record con quel nome di dominio. Dopo che Let's Encrypt ha ACME fornito al cliente un token, quest'ultimo crea un TXT record derivato da quel token e dalla chiave dell'account, e inserisce quel record in_acme-challenge.<YOURDOMAIN>. Quindi Let's Encrypt interroga il record DNS per quel record. Se trova una corrispondenza, puoi procedere all'emissione di un certificato.

AWS DevOps
AttivitàDescrizioneCompetenze richieste

Crea la IAM politica per cert-manager.

È necessaria una IAM policy per fornire al cert-manager l'autorizzazione a convalidare la proprietà del dominio Route 53. La IAM policy policy.json di esempio viene fornita nella 1-IAMRole directory del repository di nd-to-end crittografia GitHub E clonato su Amazon EKS.

Inserisci il seguente comando AWS CLI per creare la policy. IAM

aws iam create-policy \ --policy-name PolicyForCertManager \ --policy-document file://policy.json
AWS DevOps

Crea il IAM ruolo per cert-manager.

Dopo aver creato la IAM politica, è necessario creare un IAM ruolo. Il IAM ruolo di trustpolicy.json esempio viene fornito nella 1-IAMRole directory.

Immettete il seguente comando AWS CLI per creare il IAM ruolo.

aws iam create-role \ --role-name RoleForCertManager \ --assume-role-policy-document file://trustpolicy.json
AWS DevOps

Collegare la policy al ruolo.

Immettete il seguente comando AWS CLI per allegare la IAM politica al IAM ruolo. Sostituiscilo AWS_ACCOUNT_ID con l'ID del tuo AWS account.

aws iam attach-role-policy \ --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/PolicyForCertManager \ --role-name RoleForCertManager
AWS DevOps
AttivitàDescrizioneCompetenze richieste

Implementa l'NGINXIngress Controller.

Installa la versione più recente di nginx-ingress utilizzo di Helm. È possibile modificare la nginx-ingress configurazione in base alle proprie esigenze prima di distribuirla. Questo modello utilizza un Network Load Balancer annotato e rivolto internamente, disponibile nella directory. 5-Nginx-Ingress-Controller 

Installa l'NGINXIngress Controller eseguendo il seguente comando Helm dalla directory. 5-Nginx-Ingress-Controller

helm install test-nginx nginx-stable/nginx-ingress  -f  5-Nginx-Ingress-Controller/values_internal_nlb.yaml

AWS DevOps

Verificare che l'NGINXIngress Controller sia installato.

Immettere il comando helm list. L'output dovrebbe mostrare che l'NGINXIngress Controller è installato.

AWS DevOps

Crea un record Route 53 A.

Il record A punta al Network Load Balancer creato da NGINX Ingress Controller.

  1. Ottieni il DNS nome del Network Load Balancer. Per istruzioni, consulta Ottenere il DNS nome di un sistema di ELB bilanciamento del carico.

  2. Sulla console Amazon Route 53, scegli Hosted Zones.

  3. Seleziona la zona ospitata pubblica in cui desideri creare il record, quindi scegli Crea record.

  4. Inserisci un nome per il record. 

  5. In Tipo di record, scegli A - Indirizza il traffico verso IPv4 alcune AWS risorse.  

  6. Abilita Alias.

  7. In Indirizza il traffico verso, procedi come segue:

    1. Scegli Alias to Network Load Balancer.

    2. Scegli la AWS regione in cui viene distribuito il Network Load Balancer.

    3. Immettere il DNS nome del Network Load Balancer.

  8. Scegli Crea record.

AWS DevOps
AttivitàDescrizioneCompetenze richieste

Implementazione. NGINX VirtualServer

La NGINX VirtualServer risorsa è una configurazione di bilanciamento del carico alternativa alla risorsa in ingresso. La configurazione per creare la NGINX VirtualServer risorsa è disponibile nel nginx_virtualserver.yaml file della directory. 6-Nginx-Virtual-Server Immettete il seguente comando kubectl per creare la NGINX VirtualServer risorsa.

kubectl apply -f  nginx_virtualserver.yaml

Importante: assicurati di aggiornare il nome di dominio dell'applicazione, il segreto del certificato e il nome del servizio dell'applicazione nel nginx_virtualserver.yaml file.

AWS DevOps

Verifica che NGINX VirtualServer sia stato creato.

Immettete il seguente comando kubectl per verificare che la NGINX VirtualServer risorsa sia stata creata correttamente.

kubectl get virtualserver

Nota: verifica che la Host colonna corrisponda al nome di dominio dell'applicazione.

AWS DevOps

Implementa il server NGINX Web con TLS abilitato.

Questo modello utilizza un server NGINX Web con TLS enabled come applicazione per testare la end-to-end crittografia. I file di configurazione necessari per distribuire l'applicazione di test sono disponibili nella demo-webserver directory. 

Immettete il seguente comando kubectl per distribuire l'applicazione di test.

kubectl apply -f nginx-tls-ap.yaml

AWS DevOps

Verificate che le risorse dell'applicazione di test siano state create.

Immettete i seguenti comandi kubectl per verificare che vengano create le risorse richieste per l'applicazione di test:

  • kubectl get deployments

    Nota: convalidate la Ready colonna e la Available colonna.

  • kubectl get pods | grep -i example-deploy

    Nota: i pod devono essere in running stato.

  • kubectl get configmap 

  • kubectl get svc 

AWS DevOps

Convalida l'applicazione.

  1. Immettete il seguente comando sostituendolo <application-domain-name> con il DNS nome Route53 creato in precedenza.

    curl --verbose https://<application-domain-name>

  2. Verifica di poter accedere all'applicazione.

AWS DevOps

Risorse correlate

AWSrisorse

Altre risorse