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 malha de serviços na nuvem gerido é 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.

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. Mude 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 serviço gerido da Google Cloud para o 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.