Nota

Proteggi i servizi Web Kubernetes utilizzando il controller di entrata Nginx, il proxy OAuth2 e i domini di Identity Oracle

Introduzione

La protezione dei servizi Web in hosting Kubernetes deve essere semplice. Se la tua applicazione non dispone del supporto integrato per l'integrazione di provider di identità esterno (IdP) o hai bisogno di una soluzione Single Sign-On (SSO) per semplificare la gestione e ridurre la necessità di singoli meccanismi di autenticazione per servizio, OAuth2 Proxy offre la flessibilità di connettere qualsiasi applicazione a quasi tutti i provider di identità (IdP).

OAuth2 Il proxy funge da proxy inverso davanti ai servizi Kubernetes. Intercetta il traffico, reindirizza gli utenti a un server di autorizzazione esterno (come Okta o GitHub) per il login e convalida i token di accesso prima di inoltrare le richieste ai servizi backend.

Obiettivo

Prerequisiti

Task 1: creare un cluster OKE

  1. Eseguire il login a OCI Console, passare a Oracle Container Engine for Kubernetes e fare clic su Crea.

  2. Nella procedura guidata Crea cluster fare clic su Creazione rapida.

    Creazione rapida

  3. Immettere le informazioni riportate di seguito e fare clic su Successivo.

    • Nome: immettere il nome del cluster.
    • Versione Kubernetes: selezionare la versione che si desidera utilizzare.
    • Endpoint API Kubernetes: selezionare endpoint pubblico.
    • Tipo di nodo: selezionare Gestito.
    • Nodi di lavoro Kubernetes: selezionare Lavoratori privati.
    • Conteggio nodi: 1.

    Crea cluster

  4. Rivedere e fare clic su Crea cluster. Attendere che il cluster diventi disponibile.

  5. Aggiornare la lista di sicurezza associata alla subnet del servizio.

    1. Fare clic su Subnet di servizio.

      Subnet servizi

    2. Fare clic su Elenco di sicurezza e aggiungere le regole riportate di seguito.

      • Ingresso:

        Regole di entrata della lista di sicurezza

      • Uscita:

        Regole di uscita della lista di sicurezza

  6. Aggiornare la lista di sicurezza associata alla subnet dei nodi di lavoro per consentire le connessioni dai load balancer.

    1. Fare clic sul nome della VCN.

      VCN cluster OKE

    2. In Risorse selezionare Elenchi di sicurezza e fare clic sulla lista di sicurezza dei nodi.

      Liste di sicurezza

    3. Aggiungere la seguente regola di entrata alla lista di sicurezza dei nodi.

      Ingresso lista di sicurezza nodi

    4. Fare clic su Aggiungi regole di entrata.

Task 2: impostare il controller di entrata Nginx

  1. Una volta che il cluster è disponibile, puoi accedervi utilizzando OCI Cloud Shell. Fare clic su Accedi al cluster, quindi copiare ed eseguire il comando seguente in OCI Cloud Shell.

    Accesso a cluster

  2. Eseguire il comando kubectl get node per ottenere la lista dei nodi disponibili.

    Recupera nodi

  3. Aggiungere il repository helm del controller di entrata Nginx. Per ulteriori informazioni, vedere Panoramica del controller NGINX in entrata e helm.

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    
  4. Creare il file values-override.yaml.

    controller:
      allowSnippetAnnotations: true
      service:
        annotations:
          oci.oraclecloud.com/load-balancer-type: "lb"
          service.beta.kubernetes.io/oci-load-balancer-backend-protocol: "TCP"
          service.beta.kubernetes.io/oci-load-balancer-shape: "flexible"
          service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10"
          service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "10"
    
  5. Distribuire il controller di entrata Nginx.

    helm install ingress-nginx ingress-nginx/ingress-nginx -f values-override.yaml
    
  6. Salvare il file yaml seguente denominato application.yaml.

    ---
    # Create ClusterIP service
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
    spec:
      ports:
      - port: 5000
        targetPort: 5000
      selector:
        app: httpbin
    ---
    # Deployment of a sample web application
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: httpbin
          version: v1
      template:
        metadata:
          labels:
            app: httpbin
            version: v1
        spec:
          containers:
          - image: mendhak/http-https-echo
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 5000
            env:
            - name: HTTP_PORT
              value: "5000"
    
  7. Creare le risorse dell'applicazione.

    kubectl apply -f application.yaml
    
  8. Crea un record DNS per l'indirizzo IP pubblico associato al load balancer.

    • Recupera l'indirizzo IP pubblico del load balancer.

      $ kubectl get svc ingress-nginx-controller
      NAME                       TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
      ingress-nginx-controller   LoadBalancer   10.96.152.30   158.180.61.74   80:31957/TCP,443:30838/TCP   32s
      
    • Creare il record DNS. Se non si dispone di un server DNS, il servizio DNS con caratteri jolly è gratuito nip.io.

    In questo caso il nome FQDN è 158-180-61-74.nip.io.

  9. Salvare il file yaml seguente denominato ingress.yaml.

    Nota: assicurarsi di aggiornare le voci host con il nome FQDN.

    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: httpbin-ingress-nginx
    spec:
      ingressClassName: nginx
      tls:
      - hosts:
          - "<YOUR-FQDN>"
      rules:
        - host: "<YOUR-FQDN>"
          http:
            paths:
              - pathType: Prefix
                path: "/"
                backend:
                  service:
                    name: httpbin
                    port:
                      number: 5000
    
  10. Eseguire il comando seguente per creare la risorsa in entrata.

    kubectl apply -f ingress.yaml
    
  11. Eseguire il test della connettività al servizio.

    $ curl -k https://<YOUR-FQDN> 
    {
      "path": "/",
      "headers": {
        "host": "158-180-61-74.nip.io",
        "x-request-id": "b0320217391a922acecbfe10758b3ffe",
        "x-real-ip": "10.0.10.167",
        "x-forwarded-for": "10.0.10.167",
        "x-forwarded-host": "158-180-61-74.nip.io",
        "x-forwarded-port": "443",
        "x-forwarded-proto": "https",
        "x-forwarded-scheme": "https",
        "x-scheme": "https",
        "user-agent": "curl/7.87.0",
        "accept": "*/*"
      },
      "method": "GET",
      "body": "",
      "fresh": false,
      "hostname": "158-180-61-74.nip.io",
      "ip": "10.0.10.167",
      "ips": [
        "10.0.10.167"
      ],
      "protocol": "https",
      "query": {},
      "subdomains": [
        "158-180-61-74"
      ],
      "xhr": false,
      "os": {
        "hostname": "httpbin-644874bcdb-ll4mb"
      },
      "connection": {}
    }
    

Task 3: impostare un'applicazione riservata nei domini di Identity Oracle

  1. Passare a Domini di Identity Oracle nella console OCI e fare clic sul dominio OracleIdentityCloudService.

  2. Selezionare Applicazioni integrate dal menu a sinistra, quindi fare clic su Aggiungi applicazione.

  3. Selezionare Applicazione riservata e fare clic su Avvia workflow.

    Nuova applicazione riservata

  4. Immettere il nome, la descrizione e fare clic su Successivo dell'applicazione.

    Dettagli applicazione

  5. Configurare i parametri oAuth dell'applicazione.

    1. Nella sezione Autorizzazione, selezionare Codice autorizzazione.

    2. Immettere gli URL riportati di seguito e fare clic su Successivo.

      • URL di reindirizzamento: https://<YOUR-FQDN>/oauth2/callback.
      • URL di reindirizzamento dopo logout: https://<YOUR-FQDN>.
      • URL di logout: https://<YOUR-FQDN>/oauth2/sign_out.

    Parametri oauth dell'applicazione

  6. In Criterio livello Web, selezionare Ignora ed esegui in seguito e fare clic su Fine.

    policy-livello web

  7. Fare clic su Attiva per abilitare l'applicazione.

    Attiva applicazione

  8. Passare a Gruppi nel menu a sinistra e associare i gruppi di utenti autorizzati a eseguire l'autenticazione a questa applicazione.

    Associa gruppi di utenti all'applicazione

  9. Prendere nota di Client ID e Client Secret.

    ID client e segreto applicazione

  10. Fare clic sul dominio OracleIdentityCloudService ed espandere l'URL del dominio.

    URL dominio di Identity

    Ad esempio: l'URL del dominio di Identity sarà https://idcs-01234567890abcdef.identity.oraclecloud.com (il numero di porta viene rimosso).

Task 4: distribuire il proxy OAuth2

Stiamo utilizzando il proxy OAuth2 per gestire la complessità OAuth2 o OpenID Connect (OIDC) e garantire l'autenticazione di tutte le richieste inoltrate alle applicazioni.

  1. Salvare il file yaml seguente denominato oauth2-proxy.yaml e sostituire i segnaposto con i valori applicabili.

    Nota:

    • <Identity Domain URL>: https://idcs-01234567890abcdef.identity.oraclecloud.com/

    • <Identity Domain FQDN>: idcs-01234567890abcdef.identity.oraclecloud.com

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        k8s-app: oauth2-proxy
      name: oauth2-proxy
    spec:
      replicas: 1
      selector:
        matchLabels:
          k8s-app: oauth2-proxy
      template:
        metadata:
          labels:
            k8s-app: oauth2-proxy
        spec:
          containers:
          - args:
            - --provider=oidc
            - --provider-display-name="Oracle Identity Domains"
            - --oidc-issuer-url=<Identity Domain URL>
            - --redirect-url=https://<YOUR-FQDN>/oauth2/callback
            - --upstream=file:///dev/null
            - --http-address=0.0.0.0:4180
            - --email-domain=*
            - --set-xauthrequest=true
            - --session-cookie-minimal=true
            - --whitelist-domain=<Identity Domain FQDN>
            env:
            - name: OAUTH2_PROXY_CLIENT_ID
              value: "<APPLICATION_CLIENT_ID>"
            - name: OAUTH2_PROXY_CLIENT_SECRET
              value: "<APPLICATION_CLIENT_SECRET>"
            # docker run -ti --rm python:3-alpine python -c 'import secrets,base64; print(base64.b64encode(base64.b64encode(secrets.token_bytes(16))));'     
            - name: OAUTH2_PROXY_COOKIE_SECRET
              value: "<OUTPUT_OF_THE_ABOVE_DOCKER_COMMAND>"
            image: quay.io/oauth2-proxy/oauth2-proxy:latest
            imagePullPolicy: Always
            name: oauth2-proxy
            ports:
            - containerPort: 4180
              protocol: TCP
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        k8s-app: oauth2-proxy
      name: oauth2-proxy
    spec:
      ports:
      - name: http
        port: 4180
        protocol: TCP
        targetPort: 4180
      selector:
        k8s-app: oauth2-proxy
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: oauth2-proxy
      annotations:
        nginx.ingress.kubernetes.io/configuration-snippet: |
          set $xheader "";
          if ( $request_uri = "/oauth2/sign_out" ){
            set $xheader "https://<Identity Domain FQDN>/oauth2/v1/userlogout;
          }
          proxy_set_header X-Auth-Request-Redirect ${xheader};
    spec:
      ingressClassName: nginx
      rules:
      - host: <YOUR-FQDN>
        http:
          paths:
          - path: /oauth2
            pathType: Prefix
            backend:
              service:
                name: oauth2-proxy
                port:
                  number: 4180
      tls:
      - hosts:
        - <YOUR-FQDN>
    
  2. Distribuire il proxy OAuth2 in OKE.

    kubectl apply -f oauth2-proxy.yaml
    

    Verificare che il pod sia in esecuzione.

    kubectl get pods -l k8s-app=oauth2-proxy
    
  3. Configurare Nginx in modo che utilizzi il proxy OAuth2 per l'autenticazione delle richieste.

    Aggiornare il file ingress.yaml con le annotazioni di autenticazione.

    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: httpbin-ingress-nginx
      annotations:
        nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
        nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
        nginx.ingress.kubernetes.io/auth-response-headers: "x-auth-request-user, x-auth-request-email"
    spec:
      ingressClassName: nginx
      tls:
      - hosts:
          - "<YOUR-FQDN>"
      rules:
        - host: "<YOUR-FQDN>"
          http:
            paths:
              - pathType: Prefix
                path: "/"
                backend:
                  service:
                    name: httpbin
                    port:
                      number: 5000
    
  4. Provare a connettersi all'applicazione. Si dovrebbe essere reindirizzati alla pagina di autenticazione Oracle. Una volta completata l'autenticazione, è necessario essere reindirizzati all'applicazione.

    Pagina Autenticazione

    Esistono due intestazioni che identificano l'utente autenticato.

    "x-auth-request-user": "xxxx@oracle.com"
    "x-auth-request-email": "xxxx@oracle.com"
    
  5. Per uscire dall'applicazione, è possibile accedere a /oauth2/sign_out nella pagina.

    https://<YOUR-FQDN>/oauth2/sign_out
    

    Problema noto: il reindirizzamento successivo alla disconnessione non funziona. Questo problema viene registrato qui: aggiungere un parametro id_token_hint all'URL del provider di logout per il provider OIDC.

Task 5: Cancella risorse

  1. Eseguire il comando riportato di seguito per eliminare tutte le risorse distribuite Kubernetes.

    kubectl delete -f oauth2-proxy.yaml -f ingress.yaml -f application.yaml
    helm uninstall ingress-nginx
    
  2. Eliminare l'applicazione dai domini di Identity Oracle.

  3. Eliminare il cluster OKE.

  4. Eliminare la VCN creata per il cluster OKE.

    Nota:

    • È necessario attendere la fine dell'eliminazione del cluster OKE e del pool di nodi.

    • Il nome della VCN contiene il nome del cluster OKE: oke-vcn-quick-<oke-cluster-name>-<random-string>.

Conferme

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi a più contenuti gratuiti sulla formazione su Oracle Learning YouTube channel. Inoltre, visita education.oracle.com/learning-explorer per diventare un Oracle Learning Explorer.

Per la documentazione del prodotto, visita l'Oracle Help Center.