Proteja os serviços do Kubernetes com o Istio

Este tutorial destina-se a utilizadores e administradores do Kubernetes que tenham interesse em usar a rede de serviços Istio para implementar serviços do Kubernetes em segurança e ativar a comunicação TLS mútua (mTLS).

Istio e Cloud Service Mesh

O Istio não é um produto Google suportado. Em alternativa, recomendamos que execute o serviço de malha de nuvem gerido. Para mais informações, consulte o artigo Aprovisione o Cloud Service Mesh num cluster do GKE Autopilot.

O Cloud Service Mesh oferece as seguintes vantagens:

  • Pode aprovisionar o Cloud Service Mesh gerido através da API Fleet sem ferramentas do lado do cliente, como o istioctl.
  • O Cloud Service Mesh injeta automaticamente proxies sidecar em cargas de trabalho sem conceder privilégios elevados aos seus contentores.
  • Pode ver painéis de controlo detalhados para a sua malha e serviços sem qualquer configuração adicional e, em seguida, usar estas métricas para configurar objetivos de nível de serviço (SLOs) e alertas para monitorizar o estado das suas aplicações.
  • O plano de controlo da Cloud Service Mesh gerida é atualizado automaticamente para garantir que recebe os patches e as funcionalidades de segurança mais recentes.
  • O plano de dados gerido da Cloud Service Mesh atualiza automaticamente os proxies sidecar nas suas cargas de trabalho para que não tenha de reiniciar os serviços quando estiverem disponíveis atualizações de proxy e patches de segurança.
  • O Cloud Service Mesh é um produto suportado e pode ser configurado através das APIs Istio de código aberto padrão. Para mais informações, consulte as funcionalidades suportadas.

Objetivos

Este tutorial inclui os seguintes passos:

  • Crie um cluster do GKE Autopilot.
  • Instale o Istio através da ferramenta de linha de comandos istioctl.
  • Implemente uma aplicação de exemplo para testar a autenticação TLS mútua (mTLS).
  • Configure o Istio para usar a autenticação mTLS para a comunicação de serviço para serviço através de um recurso personalizado PeerAuthentication.
  • Valide a autenticação mTLS através do painel de controlo do Kiali.

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização prevista, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

O Cloud Shell está pré-instalado com o software necessário para este tutorial, incluindo o kubectl, a CLI gcloud e o Terraform. Se não usar o Cloud Shell, tem de instalar a CLI gcloud.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.

  3. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  4. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  5. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the GKE API:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable container.googleapis.com
  8. Install the Google Cloud CLI.

  9. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  10. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  11. Create or select a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.
    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  12. Verify that billing is enabled for your Google Cloud project.

  13. Enable the GKE API:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable container.googleapis.com
  14. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/container.clusterAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    Replace the following:

    • PROJECT_ID: Your project ID.
    • USER_IDENTIFIER: The identifier for your user account. For example, myemail@example.com.
    • ROLE: The IAM role that you grant to your user account.
  15. Prepare o ambiente

    Para configurar o seu ambiente, siga estes passos:

    1. Defina variáveis de ambiente:

      export PROJECT_ID=PROJECT_ID
      gcloud config set project $PROJECT_ID
      gcloud config set compute/region us-central1
      

      Substitua PROJECT_ID pelo seu Google Cloud ID do projeto.

    2. Clone o repositório do GitHub:

      git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
      
    3. Altere para o diretório de trabalho:

      cd kubernetes-engine-samples/service-mesh/istio-tutorial
      

    Crie um cluster do GKE

    Ative as capacidades do Linux que o Istio requer: NET_RAW e NET_ADMIN. Por predefinição, o GKE Autopilot não permite NET_ADMIN, mas pode ativar NET_ADMIN através do comando --workload-policies=allow-net-admin nas versões 1.27 e posteriores do GKE:

    gcloud container clusters create-auto istio-cluster \
        --location="us-central1" \
        --workload-policies="allow-net-admin"
    

    Para saber mais sobre a segurança do GKE Autopilot, consulte as Configurações de segurança incorporadas.

    Instale o Istio

    Pode instalar o Istio num cluster do GKE através do Istioctl.

    Neste tutorial, instala o Istio com o perfil de configuração predefinido recomendado para implementações de produção.

    1. Instale o Istio:

      • Para instalar a versão mais recente do Istio:

        curl -L https://istio.io/downloadIstio | sh -
        
      • Para instalar uma versão específica do Istio:

        export ISTIO_VERSION=VERSION_NUMBER
        curl -L https://istio.io/downloadIstio | TARGET_ARCH=$(uname -m) sh -
        

        Substitua VERSION_NUMBER pela versão do Istio que quer instalar. Para informações sobre os lançamentos do Istio, consulte os anúncios de lançamentos.

    2. Adicione a ferramenta de linha de comandos istioctl ao PATH:

      cd istio-*
      export PATH=$PWD/bin:$PATH
      
    3. Instale o Istio no cluster:

      istioctl install --set profile="default" -y
      

      Este passo pode demorar alguns minutos.

    4. Aguarde até que os pods do Istio estejam prontos:

      watch kubectl get pods -n istio-system
      

      O resultado é semelhante ao seguinte:

      NAME                                    READY   STATUS        RESTARTS   AGE
      istio-ingressgateway-5c47bff876-wjm96   1/1     Running       0          2m54s
      istiod-5fc7cb65cd-k8cp4                 1/1     Running       0          2m57s
      

      Quando os pods do Istio estiverem Running, regresse à linha de comandos premindo Ctrl+C.

    Implemente a aplicação de exemplo

    Nesta secção, vai usar a aplicação de exemplo Bank of Anthos para criar uma malha de serviços com autenticação mTLS.

    1. Adicione uma etiqueta de espaço de nomes que instrui o Istio a ativar a injeção automática de proxies sidecar do Envoy:

      kubectl label namespace default istio-injection=enabled
      
    2. Implemente a aplicação de exemplo:

      cd ..
      git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
      kubectl apply -f bank-of-anthos/extras/jwt/jwt-secret.yaml
      kubectl apply -f bank-of-anthos/kubernetes-manifests/
      
    3. Aguarde até que a aplicação esteja pronta:

      watch kubectl get pods
      

      O resultado é semelhante ao seguinte:

      NAME                                 READY   STATUS    RESTARTS   AGE
      accounts-db-0                        2/2     Running   0          2m16s
      balancereader-5c695f78f5-x4wlz       2/2     Running   0          3m8s
      contacts-557fc79c5-5d7fg             2/2     Running   0          3m7s
      frontend-7dd589c5d7-b4cgq            2/2     Running   0          3m7s
      ledger-db-0                          2/2     Running   0          3m6s
      ledgerwriter-6497f5cf9b-25c6x        2/2     Running   0          3m5s
      loadgenerator-57f6896fd6-lx5df       2/2     Running   0          3m5s
      transactionhistory-6c498965f-tl2sk   2/2     Running   0          3m4s
      userservice-95f44b65b-mlk2p          2/2     Running   0          3m4s
      

      Quando os auriculares estiverem Running, regresse à linha de comandos premindo Ctrl+C.

    4. Reveja o seguinte manifesto:

      # Copyright 2020 Google LLC
      #
      # Licensed under the Apache License, Version 2.0 (the "License");
      # you may not use this file except in compliance with the License.
      # You may obtain a copy of the License at
      #
      #      http://www.apache.org/licenses/LICENSE-2.0
      #
      # Unless required by applicable law or agreed to in writing, software
      # distributed under the License is distributed on an "AS IS" BASIS,
      # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
      # See the License for the specific language governing permissions and
      # limitations under the License.
      
      apiVersion: networking.istio.io/v1alpha3
      kind: Gateway
      metadata:
        name: frontend-gateway
      spec:
        selector:
          istio: ingressgateway # use Istio default gateway implementation
        servers:
        - port:
            number: 80
            name: http
            protocol: HTTP
          hosts:
          - "*"
      ---
      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: frontend-ingress
      spec:
        hosts:
        - "*"
        gateways:
        - frontend-gateway
        http:
        - route:
          - destination:
              host: frontend
              port:
                number: 80

      Este manifesto descreve os recursos Gateway e VirtualService do Istio que expõem a aplicação e usam o Istio como o controlador de entrada.

    5. Aplique o manifesto ao cluster:

      kubectl apply -f bank-of-anthos/extras/istio/frontend-ingress.yaml
      

    Configure o mTLS

    A autenticação TLS mútua (mTLS) está ativada por predefinição no Istio. Isto significa que o Istio monitoriza as cargas de trabalho do servidor que foram migradas para proxies do Istio e configura automaticamente os proxies do cliente para estabelecer ligações mTLS com estas cargas de trabalho. O Istio também configura os proxies de cliente para não usarem o mTLS quando se ligam a cargas de trabalho sem proxies sidecar.

    O Istio pode configurar o mTLS para funcionar em três modos:

    • PERMISSIVE: as cargas de trabalho aceitam tráfego mTLS e de texto simples.
    • STRICT: as cargas de trabalho só aceitam tráfego mTLS.
    • DISABLE: o mTLS está desativado. Use este modo se quiser usar a sua própria solução de segurança.

    Pode aplicar a configuração de mTLS globalmente, por espaço de nomes ou por carga de trabalho. Neste tutorial, aplica a configuração por espaço de nomes através do modo STRICT mTLS.

    1. Reveja o seguinte manifesto:

      apiVersion: security.istio.io/v1beta1
      kind: PeerAuthentication
      metadata:
        name: default
      spec:
        mtls:
            mode: STRICT

      Este manifesto descreve um recurso personalizado do Istio de autenticação de pares.

    2. Aplique o manifesto ao cluster:

      kubectl apply -f peer-authentication.yaml
      

    Para mais informações sobre o mTLS no Istio, consulte o artigo Autenticação TLS mútua.

    Verifique se o mTLS está ativado

    O Kiali é um painel de controlo de observabilidade baseado na Web para a malha de serviços do Istio que oferece uma vista gráfica do seu ambiente de microsserviços, o que lhe permite monitorizar e resolver problemas das suas aplicações. Pode usar o Kiali para verificar se a autenticação mTLS está ativada e a funcionar corretamente na malha de serviços do Istio. O Kiali requer o Prometheus como uma origem de dados de telemetria. Este tutorial usa o Google Cloud Managed Service for Prometheus.

    Instale uma interface de consultas

    1. Crie uma conta de serviço do IAM com o roles/monitoring.viewer para permitir que a interface de consulta aceda às métricas:

      gcloud iam service-accounts create monitoring \
          --display-name="Service account for query interface"
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member "serviceAccount:monitoring@PROJECT_ID.iam.gserviceaccount.com" \
          --role roles/monitoring.viewer
      gcloud iam service-accounts add-iam-policy-binding \
        monitoring@PROJECT_ID.iam.gserviceaccount.com \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:PROJECT_ID.svc.id.goog[monitoring/default]"
      
    2. Crie um namespace do Kubernetes:

      kubectl create namespace monitoring
      
    3. Anote a conta de serviço predefinida do Kubernetes no espaço de nomes para configurar a federação de identidades da carga de trabalho para o GKE:

      kubectl annotate serviceaccount -n monitoring default \
          iam.gke.io/gcp-service-account=monitoring@PROJECT_ID.iam.gserviceaccount.com --overwrite
      
    4. Implemente a carga de trabalho da interface de consulta:

      kubectl -n monitoring apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
      
    5. Reveja o seguinte manifesto:

      apiVersion: monitoring.googleapis.com/v1
      kind: PodMonitoring
      metadata:
        name: istiod
        namespace: istio-system
      spec:
        selector:
          matchLabels:
            app: istiod
        endpoints:
        - port: 15014
          path: /metrics
          timeout: 30s
          interval: 60s

      Este manifesto descreve um recurso PodMonitoring que recolhe métricas do Istio e do Envoy Proxy.

    6. Aplique o manifesto ao cluster:

      kubectl apply -f pod-monitorings.yaml
      
    7. Obtenha um link para a aplicação de exemplo:

      INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
      echo "http://$INGRESS_HOST"
      
    8. Abra o link para ver a aplicação de exemplo. Inicie sessão com o nome de utilizador e a palavra-passe predefinidos para gerar tráfego entre os microsserviços.

    Instale o Kiali

    Recomendamos que instale o Kiali através do operador do Kiali.

    1. Instale o operador Kiali:

      helm repo add kiali https://kiali.org/helm-charts
      helm repo update
      helm install \
          --namespace kiali-operator \
          --create-namespace \
          kiali-operator \
          kiali/kiali-operator
      
    2. Reveja o seguinte manifesto:

      apiVersion: kiali.io/v1alpha1
      kind: Kiali
      metadata:
        name: kiali
        namespace: istio-system
      spec:
        deployment:
          namespace: istio-system
        auth:
          strategy: anonymous
        external_services:
          custom_dashboards:
            prometheus:
              url: "http://frontend.monitoring:9090/"
              auth:
                type: none
          prometheus:
            url: "http://frontend.monitoring:9090/"
            auth:
              type: none
          tracing:
            enabled: false
          grafana:
            enabled: false

      Este manifesto descreve um recurso personalizado do operador que define o servidor Kiali.

    3. Aplique o manifesto ao cluster:

      kubectl apply -f kiali.yaml
      
    4. Aguarde até o servidor Kiali estar pronto:

      watch kubectl get pods -n istio-system
      

      O resultado é semelhante ao seguinte:

      NAME                                    READY   STATUS    RESTARTS   AGE
      istio-ingressgateway-6845466857-92zp8   1/1     Running   0          9m11s
      istiod-6b47d84cf-4cqlt                  1/1     Running   0          12m
      

      Quando os auriculares estiverem Running, regresse à linha de comandos premindo Ctrl+C.

    5. Configure o encaminhamento de portas no serviço do servidor Kiali para aceder ao painel de controlo:

      kubectl -n istio-system port-forward svc/kiali 8080:20001
      
    6. Abra a pré-visualização Web. No Kiali, aceda à secção Gráfico e selecione a opção Segurança no menu pendente Apresentação. Esta vista apresenta o estado de segurança de cada nó no gráfico. Os nós com um emblema mTLS ativado indicam que o mTLS está ativado para esse serviço, e os nós sem o emblema indicam que o mTLS não está ativado.

    Limpar

    Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

    Elimine o projeto

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Elimine os recursos individuais

    Se usou um projeto existente e não o quer eliminar, elimine os recursos individuais.

    1. Elimine o Kiali:

      kubectl -n istio-system delete kiali kiali
      helm uninstall --namespace kiali-operator kiali-operator
      
    2. Elimine os recursos de monitorização:

      kubectl -n monitoring delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
      
    3. Elimine a aplicação de exemplo:

      kubectl delete -f bank-of-anthos/extras/istio/frontend-ingress.yaml
      kubectl delete -f bank-of-anthos/kubernetes-manifests
      
    4. Desinstale o Istio:

      istioctl uninstall --purge -y
      
    5. Elimine o cluster do GKE:

      gcloud container clusters delete --location us-central1 istio-cluster --quiet
      

    O que se segue?