Aumente a segurança do seu app com o Cloud Service Mesh, o Config Sync e o Policy Controller


Neste tutorial, mostramos como melhorar a postura de segurança do cluster e do app. Imagine que você é o administrador de uma plataforma onde uma organização gerencia os apps da loja on-line com o Cloud Service Mesh, um pacote de ferramentas que ajuda a monitorar e gerenciar uma malha de serviço confiável. Você é responsável por garantir a segurança da malha e dos apps.

É possível evitar configurações incorretas e validar automaticamente as políticas do Cloud Service Mesh usando o Policy Controller e o Config Sync. O Policy Controller permite a aplicação de políticas totalmente programáveis nos clusters. O Policy Controller também tem uma biblioteca padrão de modelos de restrição que pode ser usada com o pacote de segurança do Cloud Service Mesh para auditar a compliance das vulnerabilidades de segurança da malha e práticas recomendadas. O Config Sync reconcilia continuamente o estado dos clusters com um conjunto central de arquivos de configuração declarativos do Kubernetes. Usar o Policy Controller e o Config Sync juntos permite que você aplique restrições continuamente nas configurações de políticas do Cloud Service Mesh.

No diagrama a seguir, oferecemos uma visão geral de como o Cloud Service Mesh, o Policy Controller e o Config Sync funcionam juntos para gerenciar e proteger um gateway de entrada e os apps de exemplo da Online Boutique utilizados neste tutorial:

Um diagrama que mostra a arquitetura criada para este tutorial

Objetivos

  • Criar um cluster do Google Kubernetes Engine (GKE) e registrá-lo em uma frota.
  • Instalar o Policy Controller, o Config Sync e o Cloud Service Mesh em um cluster.
  • Configurar o Config Sync para sincronizar vários repositórios.
  • Usar as práticas recomendadas para implantar configurações, apps e recursos do Istio com o Config Sync.
  • Implantar configurações de cluster, os apps de exemplo da Online Boutique e um gateway de entrada com o Config Sync.
  • Aproveite o pacote de políticas do Cloud Service Mesh do Policy Controller para aplicar as seguintes práticas recomendadas de segurança:
    • Garantir que todas as cargas de trabalho na malha tenham injeção automática de arquivo secundário.
    • Criptografe todo o tráfego na malha.
    • Garanta que todas as cargas de trabalho na malha tenham controle de acesso granular.

Custos

Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:

  • GKE.
  • GKE Enterprise. The billing for GKE Enterprise includes billing for the Cloud Service Mesh, Config Sync, and Policy Controller.

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.

Novos usuários do Google Cloud podem estar qualificados para um teste sem custo financeiro.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpeza.

Antes de começar

  1. In the Google Cloud console, on the project selector page, select or create 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 (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

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

Preparar o ambiente

Nesta seção, você vai preparar o ambiente para instalar o Cloud Service Mesh, o Policy Controller e o Config Sync:

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  2. Faça upgrade para a versão mais recente do Google Cloud CLI:

    gcloud components update
    
  3. Para armazenar os arquivos criados neste tutorial, crie um diretório:

    mkdir ~/asm-acm-tutorial-dir
    
  4. Para simplificar o restante do tutorial, crie as seguintes variáveis de ambiente:

    PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    CLUSTER=asm-acm-tutorial
    CLUSTER_ZONE=us-east4-a
    MEMBERSHIP=asm-acm-tutorial
    PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')
    

    Substitua PROJECT_ID pelo ID do projeto que quer usar neste tutorial.

    Se for solicitado que você autorize o Cloud Shell, clique em Autorizar para concluir a operação.

  5. Ative as APIs necessárias para este tutorial:

    gcloud

    gcloud services enable \
        mesh.googleapis.com \
        anthos.googleapis.com
    

    Config Connector

    Este tutorial inclui recursos do Config Connector. É possível usar esses recursos para realizar as mesmas tarefas que você concluiu na guia gcloud. Para utilizar esses recursos, instale o Config Connector e aplique os recursos da maneira que funcionar melhor para seu ambiente.

    Use o manifesto Services a seguir:

    apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1
    kind: Service
    metadata:
      annotations:
        cnrm.cloud.google.com/deletion-policy: "abandon"
        cnrm.cloud.google.com/disable-dependent-services: "false"
      name: mesh.googleapis.com
    spec:
      resourceID: mesh.googleapis.com
      projectRef:
        external: PROJECT_ID
    ---
    apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1
    kind: Service
    metadata:
      annotations:
        cnrm.cloud.google.com/deletion-policy: "abandon"
        cnrm.cloud.google.com/disable-dependent-services: "false"
      name: anthos.googleapis.com
    spec:
      resourceID: anthos.googleapis.com
      projectRef:
        external: PROJECT_ID
    

    A conclusão dessa operação pode levar mais de um minuto.

  6. Configurar um cluster do GKE

    Nesta seção, você criará um cluster do GKE e o registrará em uma frota. As frotas são um conceito doGoogle Cloud para organizar logicamente clusters e outros recursos. Elas permitem que você use e gerencie recursos de vários clusters e aplique políticas consistentes nos seus sistemas.

    O cluster criado nesta seção é o que recebe a instalação do Cloud Service Mesh, Policy Controller e Config Sync. É também o cluster em que você implanta os apps de exemplo da Online Boutique.

    Para configurar o cluster, siga estas etapas:

    1. Crie um cluster do GKE:

      gcloud

      gcloud container clusters create ${CLUSTER} \
          --zone ${CLUSTER_ZONE} \
          --machine-type=e2-standard-4 \
          --num-nodes 4 \
          --workload-pool ${PROJECT_ID}.svc.id.goog \
          --labels mesh_id=proj-${PROJECT_NUMBER}
      

      Config Connector

      Use os manifestos ContainerCluster e ContainerNodePool abaixo:

      apiVersion: container.cnrm.cloud.google.com/v1beta1
      kind: ContainerNodePool
      metadata:
        annotations:
          cnrm.cloud.google.com/project-id: PROJECT_ID
        name: asm-acm-tutorial
      spec:
        clusterRef:
          name: asm-acm-tutorial
        location: us-east4-a
        nodeConfig:
          machineType: e2-standard-4
        nodeCount: 4
      ---
      apiVersion: container.cnrm.cloud.google.com/v1beta1
      kind: ContainerCluster
      metadata:
        annotations:
          cnrm.cloud.google.com/project-id: PROJECT_ID
          cnrm.cloud.google.com/remove-default-node-pool: "true"
        labels:
          mesh_id: proj-PROJECT_NUMBER
        name: asm-acm-tutorial
      spec:
        location: us-east4-a
        initialNodeCount: 1
        workloadIdentityConfig:
          workloadPool: PROJECT_ID.svc.id.goog
      

      Substitua PROJECT_NUMBER pelo valor da variável de ambiente PROJECT_NUMBER recuperada anteriormente.

      A conclusão dessa operação pode levar mais de cinco minutos.

    2. Para garantir a criação do cluster do GKE, descreva o status dele:

      gcloud container clusters list \
          --zone ${CLUSTER_ZONE} \
          --project ${PROJECT_ID}
      

      O resultado será assim:

      NAME                LOCATION      MASTER_VERSION   MASTER_IP      MACHINE_TYPE   NODE_VERSION     NUM_NODES  STATUS
      asm-acm-tutorial    us-east4-a    1.23.12-gke.100  35.186.179.30  e2-standard-4  1.23.12-gke.100  3          RUNNING
      
    3. Conecte-se ao cluster do GKE:

      gcloud container clusters get-credentials ${CLUSTER} \
          --zone ${CLUSTER_ZONE} \
          --project ${PROJECT_ID}
      
    4. Registre o cluster em uma frota.

      gcloud

      gcloud container fleet memberships register ${MEMBERSHIP} \
          --project ${PROJECT_ID} \
          --gke-cluster ${CLUSTER_ZONE}/${CLUSTER} \
          --enable-workload-identity
      

      O resultado será assim:

      kubeconfig entry generated for asm-acm-tutorial.
      Waiting for membership to be created...done.
      Created a new membership [projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial] for the cluster [asm-acm-tutorial]
      Generating the Connect Agent manifest...
      Deploying the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]...
      Deployed the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect].
      Finished registering the cluster [asm-acm-tutorial] with the Fleet.
      

      Config Connector

      Use o manifesto GKEHubMembership a seguir:

      apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
      kind: GKEHubMembership
      metadata:
        annotations:
          cnrm.cloud.google.com/project-id: PROJECT_ID
        name: asm-acm-tutorial
      spec:
        location: global
        authority:
          issuer: https://container.googleapis.com/v1/projects/PROJECT_ID/locations/us-east4-a/clusters/asm-acm-tutorial
        endpoint:
          gkeCluster:
            resourceRef:
              name: asm-acm-tutorial
      
    5. Para garantir o registro bem-sucedido do cluster do GKE, descreva seu status:

      gcloud container fleet memberships list
      

      O resultado será assim:

      NAME              EXTERNAL_ID                           LOCATION
      asm-acm-tutorial  0e12258c-8831-4d81-b5c0-5e7099a468cc  global
      

    Analisar os repositórios

    Na seção de instalação a seguir, você vai aplicar um arquivo de manifesto acm-config.yaml. Esse manifesto configura seu cluster para sincronizar com a pasta asm-acm-tutorial do repositório de exemplo. Essa pasta contém todos os arquivos de configuração necessários para concluir o restante do tutorial.

    Para simplificar este tutorial, use os comandos sed para atualizar acm-config.yaml. Com o arquivo acm-config.yaml, o Config Sync implanta os manifestos necessários para cada etapa deste tutorial. Atualizar um único arquivo ajuda você a se concentrar nos conceitos e no fluxo da proteção dos clusters, da malha e dos aplicativos sem manipular os arquivos e executar comandos git repetidamente.

    Para usar a capacidade do Config Sync de sincronizar vários repositórios, use os seguintes recursos:

    • root-sync, como um repositório RootSync, contém todas as configurações no cluster, inclusive RepoSyncs, Constraints, ClusterRole, RoleBindings e recursos incluídos em alguns namespaces do sistema, como istio-system.
    • ingress-gateway, como o primeiro RepoSync, contém todos os recursos necessários para implantar um gateway de entrada e protegê-lo progressivamente ao longo deste tutorial.
    • online-boutique, como um segundo RepoSync, contém todos os recursos necessários para implantar os apps da Online Boutique e protegê-los progressivamente ao longo deste tutorial.

    Instalar o Policy Controller, o Config Sync e o Cloud Service Mesh gerenciado

    Agora que você criou e registrou seu cluster, é possível instalar o Config Sync, o Policy Controller e o Cloud Service Mesh no cluster e configurá-lo para sincronização usando as configurações do RootSync padrão:

    1. Ative o operador ConfigManagement, que gerencia o Config Sync e o Policy Controller:

      gcloud

      gcloud beta container fleet config-management enable
      

      Config Connector

      Use o manifesto GKEHubFeature a seguir:

      apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
      kind: GKEHubFeature
      metadata:
        name: configmanagement
      spec:
        projectRef:
          external: PROJECT_ID
        location: global
        resourceID: configmanagement
      
    2. Ative o Cloud Service Mesh na frota.

      gcloud

      gcloud container fleet mesh enable
      

      Config Connector

      Use o manifesto GKEHubFeature a seguir:

      apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
      kind: GKEHubFeature
      metadata:
        name: servicemesh
      spec:
        projectRef:
          external: PROJECT_ID
        location: global
        resourceID: servicemesh
      
    3. Ative o gerenciamento automático do Cloud Service Mesh para permitir que o Google aplique a configuração recomendada do Cloud Service Mesh gerenciado:

      gcloud

      gcloud container fleet mesh update \
          --management automatic \
          --memberships ${MEMBERSHIP}
      

      Config Connector

      Use o manifesto GKEHubFeatureMembership a seguir:

      apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
      kind: GKEHubFeatureMembership
      metadata:
        name: servicemesh-membership
      spec:
        projectRef:
          external: PROJECT_ID
        location: global
        membershipRef:
          name: asm-acm-tutorial
        featureRef:
          name: servicemesh
        mesh:
          management: MANAGEMENT_AUTOMATIC
      
    4. Ative o Config Sync e o Policy Controller:

      gcloud

      Salve o manifesto a seguir como acm-config.yaml no diretório ~/asm-acm-tutorial-dir:

      applySpecVersion: 1
      spec:
        configSync:
          enabled: true
          policyDir: asm-acm-tutorial/root-sync/init
          secretType: none
          sourceFormat: unstructured
          syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
          syncBranch: main
        policyController:
          enabled: true
          referentialRulesEnabled: true
          templateLibraryInstalled: true
      

      Para saber mais sobre os campos de configuração da Google Cloud CLI, consulte gcloud apply spec fields.

      Aplique o arquivo:

      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      Config Connector

      Use o manifesto GKEHubFeatureMembership a seguir:

      apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
      kind: GKEHubFeatureMembership
      metadata:
        name: configmanagement-membership
      spec:
        projectRef:
          external: PROJECT_ID
        location: global
        membershipRef:
          name: asm-acm-tutorial
        featureRef:
          name: configmanagement
        configmanagement:
          configSync:
            sourceFormat: unstructured
            git:
              policyDir: asm-acm-tutorial/root-sync/init
              secretType: none
              syncBranch: main
              syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
          policyController:
            enabled: true
            referentialRulesEnabled: true
            templateLibraryInstalled: true
      

      O Policy Controller e o Config Sync estão instalados no cluster. Em seguida, o Config Sync começa a sincronizar todas as configurações do RootSync padrão com o cluster. Essas configurações instalam e configuram os seguintes componentes-chave:

      • Os objetos RepoSync que configuram os apps da Online Boutique e o gateway de entrada são sincronizados:

        apiVersion: configsync.gke.io/v1beta1
        kind: RepoSync
        metadata:
          name: repo-sync
        spec:
          override:
            enableShellInRendering: true
          sourceFormat: unstructured
          git:
            repo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
            revision: HEAD
            branch: main
            dir: asm-acm-tutorial/online-boutique/init
            auth: none
        apiVersion: configsync.gke.io/v1beta1
        kind: RepoSync
        metadata:
          name: repo-sync
        spec:
          override:
            enableShellInRendering: true
          sourceFormat: unstructured
          git:
            repo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
            revision: HEAD
            branch: main
            dir: asm-acm-tutorial/ingress-gateway/init
            auth: none
      • Como os reconciliadores RepoSync precisam de permissões adicionais para criar recursos do Istio, um objeto ClusterRole e dois objetos RoleBinding para conceder essas permissões também são aplicados ao seu cluster:

        apiVersion: rbac.authorization.k8s.io/v1
        kind: ClusterRole
        metadata:
          labels:
            rbac.authorization.k8s.io/aggregate-to-edit: "true"
          name: custom:aggregate-to-edit:istio
        rules:
        - apiGroups:
          - "networking.istio.io"
          - "security.istio.io"
          resources:
          - "virtualservices"
          - "authorizationpolicies"
          - "gateways"
          verbs:
          - "*"
        apiVersion: rbac.authorization.k8s.io/v1
        kind: RoleBinding
        metadata:
          name: repo-sync
        subjects:
        - kind: ServiceAccount
          name: ns-reconciler-onlineboutique
          namespace: config-management-system
        roleRef:
          kind: ClusterRole
          name: edit
          apiGroup: rbac.authorization.k8s.io
        apiVersion: rbac.authorization.k8s.io/v1
        kind: RoleBinding
        metadata:
          name: repo-sync
        subjects:
        - kind: ServiceAccount
          name: ns-reconciler-asm-ingress
          namespace: config-management-system
        roleRef:
          kind: ClusterRole
          name: edit
          apiGroup: rbac.authorization.k8s.io
    5. Para garantir a instalação bem-sucedida do Policy Controller e do Config Sync, verifique o status:

      gcloud beta container fleet config-management status
      

      O resultado será assim:

      Name: asm-acm-tutorial
      Status: SYNCED
      Last_Synced_Token: 4b3384d
      Sync_Branch: main
      Last_Synced_Time: 2022-05-04T21:32:58Z
      Policy_Controller: INSTALLED
      

      Se você vir PENDING ou NOT_INSTALLED nas linhas Status ou Policy_Controller, aguarde alguns minutos e execute gcloud beta container fleet config-management status novamente.

    6. Para garantir a instalação do Cloud Service Mesh, descreva o status dele:

      gcloud container fleet mesh describe
      

      O resultado será assim:

      createTime: '2022-09-13T23:12:56.477042921Z'
      membershipSpecs:
        projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial:
          mesh:
            management: MANAGEMENT_AUTOMATIC
      membershipStates:
        projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial:
          servicemesh:
            controlPlaneManagement:
              details:
              - code: REVISION_READY
                details: 'Ready: asm-managed'
              state: ACTIVE
            dataPlaneManagement:
              details:
              - code: OK
                details: Service is running.
              state: ACTIVE
          state:
            code: OK
            description: |-
              Revision(s) ready for use: asm-managed.
              All Canonical Services have been reconciled successfully.
            updateTime: '2022-09-14T00:19:10.571552206Z'
      name: projects/PROJECT_ID/locations/global/features/servicemesh
      resourceState:
        state: ACTIVE
      spec: {}
      state:
        state: {}
      updateTime: '2022-09-14T00:19:14.135113118Z'
      

      Se você vir state.code: ERROR em vez de state.code: OK, aguarde alguns minutos e execute gcloud container fleet mesh describe novamente. Antes de prosseguir com o tutorial, verifique se o campo servicemesh.controlPlaneManagement.details.code tem o valor REVISION_READY.

    Implantar um gateway de entrada e um app de exemplo

    Nesta seção, você vai implantar o aplicativo de amostra Online Boutique e um gateway de entrada para gerenciar o tráfego de entrada.

    1. Implante o aplicativo de amostra Online Boutique e o gateway de entrada.

      O comando a seguir usa sed para atualizar o manifesto acm-config.yaml para que o Config Sync implante os recursos necessários para implantar o gateway de entrada e o app de amostra.

      sed -i "s,root-sync/init,root-sync/deployments,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      Essa etapa pode levar alguns minutos para ser concluída.

    2. Veja o status do Config Sync de RootSync e dos dois RepoSyncs:

      gcloud alpha anthos config sync repo describe
      

      A resposta é semelhante a:

      getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deployments@main",
          "status": "SYNCED"
        },
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/deployments@main",
          "status": "SYNCED"
        },
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/deployments@main",
          "status": "SYNCED"
        }
      ]
      

      Se você vir status: RECONCILING em vez de status: SYNCED, aguarde alguns minutos e execute gcloud alpha anthos config sync repo describe novamente.

      Para ver apenas as informações de um repositório, use as sinalizações --sync-name e --sync-namespace. Para ver os recursos gerenciados em detalhes, adicione a flag --managed-resources. Para mais informações, consulte Ver o status do Config Sync em vários clusters.

    3. Aguarde o provisionamento do endereço IP público do gateway de entrada:

      until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done
      
    4. Anote o endereço IP público do gateway de entrada:

      EXTERNAL_IP=$(kubectl get svc asm-ingressgateway -n asm-ingress -o jsonpath="{.status.loadBalancer.ingress[*].ip}")
      
    5. Acesse o endereço IP do seu navegador para verificar se o app Online Boutique foi implantado:

      echo http://${EXTERNAL_IP}
      

    Aplicar políticas para proteger a malha

    Nas seções a seguir, você aproveita o controlador de políticas para aplicar políticas do pacote de políticas do Cloud Service Mesh criando restrições.

    Aplicar injeção de proxies sidecar

    Nesta seção, você aplicará políticas para garantir que todas as cargas de trabalho na malha tenham a injeção automática de arquivo secundário ativada.

    1. Para aplicar a injeção de proxies sidecar, aplique restrições.

      O comando a seguir usa sed para atualizar o manifesto acm-config.yaml e fazer com que o Config Sync implante os recursos associados.

      sed -i "s,root-sync/deployments,root-sync/enforce-sidecar-injection,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      O comando anterior implanta os seguintes recursos:

      • Um K8sRequiredLabels Constraint que exige que qualquer Namespace na malha contenha o rótulo de injeção de proxy sidecar do Cloud Service Mesh:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: K8sRequiredLabels
        metadata:
          name: namespace-sidecar-injection-label
        spec:
          enforcementAction: deny
          match:
            kinds:
            - apiGroups:
              - ""
              kinds:
              - Namespace
            excludedNamespaces:
            - config-management-monitoring
            - config-management-system
            - default
            - gatekeeper-system
            - gke-connect
            - istio-system
            - kube-node-lease
            - kube-public
            - kube-system
            - resource-group-system
          parameters:
            labels:
            - allowedRegex: enabled
              key: istio-injection
      • Um AsmSidecarInjection Constraint que proíbe qualquer Pod na malha de ignorar a injeção do sidecar do proxy do Istio:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: AsmSidecarInjection
        metadata:
          name: pod-sidecar-injection-annotation
        spec:
          enforcementAction: deny
          match:
            kinds:
            - apiGroups:
              - ""
              kinds:
              - Pod
            excludedNamespaces:
            - kube-system
          parameters:
            strictnessLevel: High
    2. Veja o status do Config Sync para o RootSync:

      gcloud alpha anthos config sync repo describe \
          --sync-name root-sync \
          --sync-namespace config-management-system
      

      A saída é semelhante a:

      getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-sidecar-injection@main",
          "status": "SYNCED"
        }
      ]
      

      Se você vir status: RECONCILING em vez de status: SYNCED, aguarde alguns minutos e execute gcloud alpha anthos config sync repo describe novamente.

    3. Verifique se as Constraints foram criadas:

      kubectl get constraints
      

      Pode levar alguns minutos para o Policy Controller avaliar essas restrições. Se os valores não aparecerem na coluna TOTAL-VIOLATIONS, aguarde e execute kubectl get constraints novamente.

      A saída é semelhante a:

      NAME                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      podsidecarinjectionannotation.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
      
      NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
      

      Como configuramos corretamente nossos Namespaces e Pods, há 0 TOTAL-VIOLATIONS para esses Constraints.

    4. Para ver essas Constraints em funcionamento, tente criar um Namespace no cluster sem um label nem um annotation:

      kubectl create namespace test
      

      A resposta será semelhante a esta:

      Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [namespace-sidecar-injection-label] you must provide labels: {"istio-injection"}
      

    Aplicar criptografia de tráfego

    Nesta seção, você aplicará políticas para garantir que todo o tráfego na malha seja criptografado.

    1. Para aplicar a criptografia do tráfego, aplique restrições.

      O comando a seguir usa sed para atualizar o manifesto acm-config.yaml e fazer com que o Config Sync implante os recursos associados.

      sed -i "s,root-sync/enforce-sidecar-injection,root-sync/enforce-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      O comando anterior implanta os seguintes recursos:

      • Um AsmPeerAuthnMeshStrictMtls Constraint que aplica o mTLS PeerAuthentication no nível da malha no namespace istio-system:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: AsmPeerAuthnMeshStrictMtls
        metadata:
          name: mesh-level-strict-mtls
        spec:
          enforcementAction: deny
          parameters:
            rootNamespace: istio-system
            strictnessLevel: High
      • Uma restrição referencial Config no namespace gatekeeper-system. Essa restrição referencial permite que o AsmPeerAuthnMeshStrictMtls Constraint faça referência a outro objeto na definição (por exemplo, pesquisar qualquer PeerAuthentication no istio-system Namespace):

        apiVersion: config.gatekeeper.sh/v1alpha1
        kind: Config
        metadata:
          name: config
        spec:
          sync:
            syncOnly:
              - group: ""
                version: "v1"
                kind: "Namespace"
              - group: "security.istio.io"
                version: "v1beta1"
                kind: "PeerAuthentication"
              - group: "security.istio.io"
                version: "v1beta1"
                kind: "AuthorizationPolicy"
      • Um Constraint DestinationRuleTLSEnabled que proíbe a desativação do TLS para todos os hosts e subconjuntos de hosts no DestinationRules do Istio:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: DestinationRuleTLSEnabled
        metadata:
          name: destination-rule-tls-enabled
        spec:
          enforcementAction: deny
          match:
            kinds:
            - apiGroups:
              - networking.istio.io
              kinds:
              - DestinationRule
      • Um Constraint AsmPeerAuthnStrictMtls que exige que todos os PeerAuthentications não substituam mTLS STRICT:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: AsmPeerAuthnStrictMtls
        metadata:
          name: peerauthentication-strict-mtls
        spec:
          enforcementAction: deny
          match:
            kinds:
            - apiGroups:
              - security.istio.io
              kinds:
              - PeerAuthentication
          parameters:
            strictnessLevel: High
    2. Veja o status do Config Sync para o RootSync:

      gcloud alpha anthos config sync repo describe \
          --sync-name root-sync \
          --sync-namespace config-management-system
      

      A saída é semelhante a:

      getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-strict-mtls@main",
          "status": "SYNCED"
        }
      ]
      

      Se você vir status: RECONCILING em vez de status: SYNCED, aguarde alguns minutos e execute gcloud alpha anthos config sync repo describe novamente.

    3. Execute o seguinte comando para ver mais informações sobre a violação PeerAuthentication:

      kubectl get asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls -ojsonpath='{.status.violations}'  | jq
      

      A saída é semelhante a:

      [
        {
          "enforcementAction": "deny",
          "group": "constraints.gatekeeper.sh",
          "kind": "AsmPeerAuthnMeshStrictMtls",
          "message": "Root namespace <istio-system> does not have a strict mTLS PeerAuthentication",
          "name": "mesh-level-strict-mtls",
          "version": "v1beta1"
        }
      ]
      
    4. Corrija o problema implantando um PeerAuthentication no istio-system. Para impedir que todos os serviços na malha aceitem tráfego de texto simples, defina uma política PeerAuthentication para toda a malha, com o modo mTLS definido como STRICT. Quando você implanta a política, o plano de controle provisiona certificados TLS automaticamente, para que as cargas de trabalho possam ser autenticadas entre si.

      O comando a seguir usa sed para atualizar o manifesto acm-config.yaml e fazer com que o Config Sync implante os recursos associados.

      sed -i "s,root-sync/enforce-strict-mtls,root-sync/fix-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      O comando anterior implanta o seguinte PeerAuthentication mTLS STRICT no namespace istio-system. Isso aplica mTLS STRICT a toda a malha:

      apiVersion: security.istio.io/v1beta1
      kind: PeerAuthentication
      metadata:
        name: default
      spec:
        mtls:
          mode: STRICT
    5. Veja o status do Config Sync para o RootSync:

      gcloud alpha anthos config sync repo describe \
          --sync-name root-sync \
          --sync-namespace config-management-system
      

      A saída é semelhante a:

      getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-strict-mtls@main",
          "status": "SYNCED"
        }
      ]
      

      Se você vir status: RECONCILING em vez de status: SYNCED, aguarde alguns minutos e execute gcloud alpha anthos config sync repo describe novamente.

    6. Verifique se as Constraints foram criadas:

      kubectl get constraints
      

      Pode levar alguns minutos para o Policy Controller avaliar esses Constraints. Aguarde e execute novamente o comando kubectl get constraints até receber valores na coluna TOTAL-VIOLATIONS de cada linha.

      A saída é semelhante a:

      NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
      NAME                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls   deny                 0
      NAME                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled   deny                 0
      NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls   deny                 0
      NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
      

    Aplicar controle de acesso granular

    Nesta seção, você aplicará políticas para garantir que todas as cargas de trabalho na malha tenham controle de acesso granular.

    1. Para aplicar o controle de acesso granular, aplique restrições.

      O comando a seguir usa sed para atualizar o manifesto acm-config.yaml e fazer com que o Config Sync implante os recursos associados.

      sed -i "s,root-sync/fix-strict-mtls,root-sync/enforce-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      O comando anterior implanta os seguintes recursos:

      • UmaAsmAuthzPolicyDefaultDeny Constraint que aplica a negação padrão da malha AuthorizationPolicy na página istio-system namespace:

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: AsmAuthzPolicyDefaultDeny
        metadata:
          name: default-deny-authorization-policies
        spec:
          enforcementAction: deny
          parameters:
            rootNamespace: istio-system
            strictnessLevel: High
      • Um AsmAuthzPolicyEnforceSourcePrincipals Constraint, que determina que qualquer AuthorizationPolicies esteja definindo principais de origem granulares (que não sejam "*"). Somente o gateway de entrada no namespace asm-ingress é uma exceção a essa regra para receber o tráfego dos usuários finais e redirecionar o tráfego para o app frontend da Online Boutique.

        apiVersion: constraints.gatekeeper.sh/v1beta1
        kind: AsmAuthzPolicyEnforceSourcePrincipals
        metadata:
          name: authz-source-principals-not-all
        spec:
          enforcementAction: deny
          match:
            kinds:
            - apiGroups:
              - security.istio.io
              kinds:
              - AuthorizationPolicy
            excludedNamespaces:
              - asm-ingress
    2. Veja o status do Config Sync para o RootSync:

      gcloud alpha anthos config sync repo describe \
          --sync-name root-sync \
          --sync-namespace config-management-system
      

      A saída é semelhante a:

      getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-authorization-policies@main",
          "status": "SYNCED"
        }
      ]
      

      Se você vir status: RECONCILING em vez de status: SYNCED, aguarde alguns minutos e execute gcloud alpha anthos config sync repo describe novamente.

    3. Execute o seguinte comando para ver mais informações sobre a violação associada:

      kubectl get asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies -ojsonpath='{.status.violations}'  | jq
      

      A saída é semelhante a:

      [
        {
          "enforcementAction": "deny",
          "group": "constraints.gatekeeper.sh",
          "kind": "AsmAuthzPolicyDefaultDeny",
          "message": "Root namespace <istio-system> does not have a default deny AuthorizationPolicy",
          "name": "default-deny-authorization-policies",
          "version": "v1beta1"
        }
      ]
      
    4. Corrija o problema implantando o AuthorizationPolicy no namespace istio-system.

      O comando a seguir usa sed para atualizar o manifesto acm-config.yaml e fazer com que o Config Sync implante os recursos associados.

      sed -i "s,root-sync/enforce-authorization-policies,root-sync/fix-default-deny-authorization-policy,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      O comando anterior implanta o seguinte AuthorizationPolicy de negação de todos no namespace istio-system:

      apiVersion: security.istio.io/v1beta1
      kind: AuthorizationPolicy
      metadata:
        name: deny-all
      spec:
        {}
    5. Veja o status do Config Sync para o RootSync:

      gcloud alpha anthos config sync repo describe \
          --sync-name root-sync \
          --sync-namespace config-management-system
      

      A saída é semelhante a:

      getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-default-deny-authorization-policy@main",
          "status": "SYNCED"
        }
      ]
      

      Se você vir status: RECONCILING em vez de status: SYNCED, aguarde alguns minutos e execute gcloud alpha anthos config sync repo describe novamente.

    6. Verifique se as Constraints foram criadas:

      kubectl get constraints
      

      Pode levar alguns minutos para o Policy Controller avaliar esses Constraints. Aguarde e execute novamente o comando kubectl get constraints até receber valores na coluna TOTAL-VIOLATIONS de cada linha.

      A saída é semelhante a:

      NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
      NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
      NAME                                                                                      ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies   deny                 0
      NAME                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls   deny                 0
      NAME                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled   deny                 0
      NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls   deny                 0
      NAME                                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
      asmauthzpolicyenforcesourceprincipals.constraints.gatekeeper.sh/authz-source-principals-not-all   deny                 0
      
    7. Acesse o app "Online Boutique" no seu navegador:

      echo http://${EXTERNAL_IP}
      

      Você receberá o erro: RBAC: access denied, que confirma que a negação padrão AuthorizationPolicy é aplicada a toda a malha.

    8. Para corrigir esse problema, implante uma AuthorizationPolicies mais granular nos namespaces asm-ingress e onlineboutique.

      O comando a seguir usa sed para atualizar o manifesto acm-config.yaml e fazer com que o Config Sync implante os recursos associados.

      sed -i "s,root-sync/fix-default-deny-authorization-policy,root-sync/deploy-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml
      gcloud beta container fleet config-management apply \
          --membership ${MEMBERSHIP} \
          --config ~/asm-acm-tutorial-dir/acm-config.yaml
      

      O comando anterior implanta os seguintes recursos:

      • Um AuthorizationPolicy no namespace asm-ingress:

        apiVersion: security.istio.io/v1beta1
        kind: AuthorizationPolicy
        metadata:
          name: asm-ingressgateway
        spec:
          selector:
            matchLabels:
              asm: ingressgateway
          rules:
          - to:
            - operation:
                ports:
                - "8080"
      • Um AuthorizationPolicy por app no namespace onlineboutique. Veja o exemplo do app cartservice:

        apiVersion: security.istio.io/v1beta1
        kind: AuthorizationPolicy
        metadata:
          name: cartservice
        spec:
          selector:
            matchLabels:
              app: cartservice
          rules:
          - from:
            - source:
                principals:
                - cluster.local/ns/onlineboutique/sa/frontend
                - cluster.local/ns/onlineboutique/sa/checkoutservice
            to:
            - operation:
                paths:
                - /hipstershop.CartService/AddItem
                - /hipstershop.CartService/GetCart
                - /hipstershop.CartService/EmptyCart
                methods:
                - POST
                ports:
                - "7070"
      • Uma ServiceAccount por app nos namespaces asm-ingress e onlineboutique para que uma identidade exclusiva por app seja avaliada como principal em AuthorizationPolicies. Veja o exemplo do app cartservice:

        apiVersion: v1
        kind: ServiceAccount
        metadata:
          name: cartservice
    9. Veja o status do Config Sync de RootSync e dos dois RepoSyncs:

      gcloud alpha anthos config sync repo describe
      

      A resposta é semelhante a:

      getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial
      [
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deploy-authorization-policies@main",
          "status": "SYNCED"
        },
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/authorization-policies@main",
          "status": "SYNCED"
        },
        {
          "clusters": [
            "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial"
          ],
          "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
          "errors": [],
          "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/authorization-policies@main",
          "status": "SYNCED"
        }
      ]
      

      Se você vir status: RECONCILING em vez de status: SYNCED, aguarde alguns minutos e execute gcloud alpha anthos config sync repo describe novamente.

      Para ver apenas as informações de um repositório, use as sinalizações --sync-name e --sync-namespace. Para ver em detalhes os recursos gerenciados, adicione a flag --managed-resources. Para mais informações, consulte Ver o status do Config Sync em vários clusters.

    10. Acesse o app Online Boutique novamente no seu navegador:

      echo http://${EXTERNAL_IP}
      

      Depois de alguns minutos, o site voltará a funcionar.

    Confira o status dos recursos de segurança do GKE Enterprise

    É possível ver o status dos recursos de segurança do GKE Enterprise, incluindo políticas de autenticação e autorização, no console Google Cloud .

    1. No console do Google Cloud , acesse a página Segurança do GKE Enterprise.

      Acessar a segurança do GKE Enterprise

      O Resumo da política exibe o status da segurança do aplicativo, incluindo o controle de acesso ao serviço (AuthorizationPolicies) e a mTLS.

    2. Clique em Auditoria de políticas para ver os status da política da carga de trabalho para o cluster e os dois namespaces (asm-ingress e onlineboutique).

      Os cards Controle de acesso ao serviço e Status mTLS oferecem uma visão geral de alto nível.

      Visão geral de controle de acesso ao serviço e status mTLS

      A lista Cargas de trabalho mostra o controle de acesso ao serviço e o status mTLS de cada carga de trabalho.

      Lista detalhada de cada carga de trabalho e dos respectivos controles de acesso e status mTLS

    Você protegeu o cluster e a malha com o Policy Controller e o Config Sync.

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Excluir o projeto

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Excluir recursos individuais

Para excluir os recursos individuais:

  1. Cancele o registro do cluster na frota:

    gcloud

    gcloud container fleet memberships unregister ${CLUSTER} \
        --project=${PROJECT_ID} \
        --gke-cluster=${CLUSTER_ZONE}/${CLUSTER}
    

    O resultado será assim:

    kubeconfig entry generated for asm-acm-tutorial.
    Waiting for membership to be deleted...done.
    Deleting membership CR in the cluster...done.
    Deleting namespace [gke-connect] in the cluster...done.
    

    Config Connector

    kubectl delete -f ~/asm-acm-tutorial-dir/fleet-membership.yaml
    
  2. Exclua o cluster:

    gcloud

    gcloud container clusters delete ${CLUSTER} \
        --zone ${CLUSTER_ZONE}
    

    Pressione y quando for solicitado. A conclusão desse comando pode levar cerca de cinco minutos.

    O resultado será assim:

    Deleting cluster asm-acm-tutorial...done.
    Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-east4-a/clusters/asm-acm-tutorial].
    

    Config Connector

    kubectl delete -f ~/asm-acm-tutorial-dir/container-cluster.yaml
    
  3. Exclua os arquivos que você criou:

    rm -r ~/asm-acm-tutorial-dir
    

A seguir