Esercizio - Abilitare SSL/TLS per il controller di ingresso front-end

Completato

La sicurezza e la privacy online dei dati degli utenti sono di importanza primaria per l'azienda Fruit Smoothies. È importante che il sito Web ratings consenta le connessioni HTTPS a tutti i clienti. Il controller di ingresso NGINX supporta la terminazione TLS e offre diversi modi per recuperare e configurare i certificati per HTTPS. Questo esercizio illustra come usare cert-manager, che offre le funzionalità di generazione automatica di certificati Let's Encrypt e di gestione.

In questo esercizio si vedrà come:

  • Distribuire cert-manager tramite Helm
  • Distribuire una risorsa ClusterIssuer per Let's Encrypt
  • Abilitare SSL/TLS per il servizio Web ratings per il controller di ingresso
  • Testare l'applicazione

Diagram that shows the deployed resources on the Azure Kubernetes Service cluster.

Distribuire cert-manager

cert-manager è un controller gestione dei certificati di Kubernetes che consente di automatizzare la gestione dei certificati in ambienti nativi del cloud. cert-manager supporta varie origini, tra cui Let's Encrypt, HashiCorp Vault, Venafi, le coppie di chiavi di firma semplici o i certificati autofirmati. Si userà cert-manager per verificare che il certificato del sito Web sia valido e aggiornato e provare a rinnovare i certificati a un orario stabilito, prima della scadenza del certificato.

cert-manager le usa risorse personalizzate di Kubernetes. Una risorsa personalizzata di Kubernetes è un oggetto che consente di estendere l'API Kubernetes o di introdurre l'API in un cluster. Si usano i file CRD (Custom Resource Definition) per definire i tipi di oggetti e il server API gestisce il ciclo di vita dell'oggetto.

In questo caso si userà Helm per installare cert-manager e quindi configurarlo per l'uso di Let's Encrypt come autorità di certificazione.

  1. Per iniziare, creare uno spazio dei nomi per cert-manager.

    kubectl create namespace cert-manager
    
  2. Per trovare e installare cert-manager, si userà il repository Jetstack di Helm. Prima di tutto, eseguire il codice seguente per aggiungere il repository Jetstack di Helm.

    helm repo add jetstack https://charts.jetstack.io
    helm repo update
    
  3. Eseguire quindi il comando seguente per installare cert-manager distribuendo le risorse CRD di cert-manager.

    kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.yaml
    
  4. Installare il grafico Helm di cert-manager.

    helm install cert-manager \
        --namespace cert-manager \
        --version v0.14.0 \
        jetstack/cert-manager
    
  5. Al termine dell'installazione, verrà visualizzato un output simile all'esempio seguente.

    NAME: cert-manager
    LAST DEPLOYED: Tue Jan  7 13:11:19 2020
    NAMESPACE: cert-manager
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    cert-manager has been deployed successfully!
    
  6. Verificare l'installazione controllando lo spazio dei nomi cert-manager per i pod in esecuzione.

    kubectl get pods --namespace cert-manager
    

    Si noterà che i pod cert-manager, cert-manager-cainjector e cert-manager-webhook sono nello stato Running. Il provisioning del webhook necessario per gli asset TLS potrebbe richiedere alcuni minuti.

    NAME                                       READY   STATUS    RESTARTS   AGE
    cert-manager-5c6866597-zw7kh               1/1     Running   0          2m
    cert-manager-cainjector-577f6d9fd7-tr77l   1/1     Running   0          2m
    cert-manager-webhook-787858fcdb-nlzsq      1/1     Running   0          2m
    

Distribuire una risorsa ClusterIssuer per Let's Encrypt

cert-manager verificherà che il certificato del sito Web sia valido e aggiornato e proverà anche a rinnovare i certificati a un orario stabilito, prima della scadenza del certificato. È tuttavia necessario configurare un ClusterIssuer prima di poter iniziare il processo di rilascio dei certificati. L'autorità di certificazione del cluster funge da interfaccia per un servizio di rilascio di certificati, come Let's Encrypt.

Let's Encrypt è un'autorità di certificazione no profit che fornisce certificati TLS. Let's Encrypt consente di configurare un server HTTP che ottiene automaticamente un certificato considerato attendibile dal browser. Il processo di recupero e installazione di un certificato è completamente automatizzato, senza intervento umano, e viene gestito eseguendo un agente di gestione dei certificati nel server Web. Per altre informazioni su Let's Encrypt, vedere la sezione Altre informazioni alla fine di questo modulo.

  1. Modificare il file denominato cluster-issuer.yaml usando l'editor integrato.

    code cluster-issuer.yaml
    
  2. Incollare il testo seguente nel file.

    apiVersion: cert-manager.io/v1alpha2
    kind: ClusterIssuer
    metadata:
      name: letsencrypt
    spec:
      acme:
        server: https://acme-v02.api.letsencrypt.org/directory
        email: <your email> # IMPORTANT: Replace with a valid email from your organization
        privateKeySecretRef:
          name: letsencrypt
        solvers:
        - http01:
            ingress:
              class: nginx
    

    Nella chiave email si aggiornerà il valore sostituendo <your email> con l'indirizzo di posta elettronica valido di un amministratore certificati ottenuto dall'organizzazione.

  3. Per salvare il file, premere CTRL+S. Per chiudere l'editor, premere CTRL+Q.

  4. Applicare la configurazione eseguendo il comando kubectl apply. Distribuire l'autorità di certificazione del cluster nello spazio dei nomi ratingsapp.

    kubectl apply \
        --namespace ratingsapp \
        -f cluster-issuer.yaml
    

    Verrà visualizzato un output simile a questo esempio.

    clusterissuer.cert-manager.io/letsencrypt created
    

Abilitare SSL/TLS per il servizio Web ratings per il controller di ingresso

L'ultima parte di questa procedura prevede la configurazione del file di ingresso Kubernetes per consentire al sito Web ratings di abilitare SSL/TLS.

  1. Modificare il file denominato ratings-web-ingress.yaml usando l'editor integrato.

    code ratings-web-ingress.yaml
    
  2. Sostituire il contenuto esistente nel file con il testo seguente. Si noti l'aggiunta dell'annotazione cert-manager.io/issuer e la nuova sezione tls.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ratings-web-ingress
      annotations:
        kubernetes.io/ingress.class: nginx
        cert-manager.io/cluster-issuer: letsencrypt
    spec:
      tls:
        - hosts:
          - frontend.<ingress ip>.nip.io # IMPORTANT: update <ingress ip> with the dashed public IP of your ingress, for example frontend.13-68-177-68.nip.io
          secretName: ratings-web-cert
      rules:
      - host: frontend.<ingress ip>.nip.io # IMPORTANT: update <ingress ip> with the dashed public IP of your ingress, for example frontend.13-68-177-68.nip.io
        http:
          paths:
          - backend:
              serviceName: ratings-web
              servicePort: 80
            path: /
    

    In questo file aggiornare il valore di <ingress ip> nella chiave host con l'IP pubblico con trattini dell'ingresso recuperato in precedenza, ad esempio frontend.13.68.177.68.nip.io. Questo valore consente di accedere all'ingresso tramite un nome host invece di un indirizzo IP.

  3. Per salvare il file, premere CTRL+S. Per chiudere l'editor, premere CTRL+Q.

  4. Applicare la configurazione eseguendo il comando kubectl apply. Distribuire il file di ingresso Kubernetes aggiornato nello spazio dei nomi ratingsapp.

    kubectl apply \
        --namespace ratingsapp \
        -f ratings-web-ingress.yaml
    

    Verrà visualizzato un output simile a questo esempio.

    ingress.networking.k8s.io/ratings-web-ingress configured
    
  5. Verificare che il certificato sia stato rilasciato.

    kubectl describe cert ratings-web-cert --namespace ratingsapp
    

    Si otterrà un output simile a questo esempio.

    Name:         ratings-web-cert
    Namespace:    ratingsapp
    API Version:  cert-manager.io/v1alpha2
    Kind:         Certificate
    
    [..]
    
    Spec:
      Dns Names:
        frontend.13-68-177-68.nip.io
      Issuer Ref:
        Group:      cert-manager.io
        Kind:       ClusterIssuer
        Name:       letsencrypt
      Secret Name:  ratings-web-cert
    Status:
      Conditions:
        Last Transition Time:  2020-01-07T22:27:23Z
        Message:               Certificate is up to date and has not expired
        Reason:                Ready
        Status:                True
        Type:                  Ready
      Not After:               2020-04-06T21:27:22Z
    Events:
      Type    Reason        Age   From          Message
      ----    ------        ----  ----          -------
      Normal  GeneratedKey  36s   cert-manager  Generated a new private key
      Normal  Requested     36s   cert-manager  Created new CertificateRequest resource "ratings-web-cert-1603291776"
      Normal  Issued        34s   cert-manager  Certificate issued successfully
    

Testare l'applicazione

Aprire il nome host configurato nel controller di ingresso in un Web browser tramite SSL/TLS per visualizzare e interagire con l'applicazione. Ad esempio, in https://frontend.13.68.177.68.nip.io.

Screenshot of the ratings-web application.

Verificare che il front-end sia accessibile tramite HTTPS e che il certificato sia valido.

Screenshot of the valid SSL/TLS certificate.

Riepilogo

In questo esercizio è stato distribuito cert-manager e lo si è configurato in modo da consentire il rilascio automatico di certificati Let's Encrypt. Il controller di ingresso creato in precedenza è stato quindi configurato per gestire il traffico TLS/SSL crittografato tramite i certificati generati.

Ora si configurerà il monitoraggio per il cluster del servizio Azure Kubernetes.