Fortaleça a segurança do seu aplicativo com Cloud Service Mesh, Config Sync e Policy Controller


Este tutorial mostra como melhorar a postura de segurança do seu cluster e dos seus aplicativos. Imagine que você é um administrador de plataforma cuja organização gerencia os aplicativos da sua loja virtual com o Cloud Service Mesh , um conjunto de ferramentas que ajuda a monitorar e gerenciar um service mesh confiável. Você é responsável por garantir que seu mesh e seus aplicativos estejam seguros.

Você pode evitar configurações incorretas e validar automaticamente suas 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 ​​para seus clusters. O Policy Controller também inclui uma biblioteca padrão de modelos de restrição que você pode usar com o pacote de segurança do Cloud Service Mesh para auditar a conformidade das vulnerabilidades de segurança e das práticas recomendadas do seu mesh. O Config Sync reconcilia continuamente o estado dos clusters com um conjunto central de arquivos de configuração declarativos do Kubernetes. O uso conjunto do Policy Controller e do Config Sync permite que você aplique restrições continuamente às suas configurações de política do Cloud Service Mesh.

O diagrama a seguir mostra uma visão geral de como o Cloud Service Mesh, o Policy Controller e o Config Sync funcionam juntos neste tutorial para gerenciar e proteger um gateway de entrada e os aplicativos de exemplo do Online Boutique que você usa neste tutorial:

Um diagrama mostrando a arquitetura que você cria para este tutorial

Objetivos

  • Crie um cluster do Google Kubernetes Engine (GKE) e registre o cluster em uma frota .
  • Instale o Policy Controller, o Config Sync e o Cloud Service Mesh em um cluster.
  • Configurar o Config Sync para sincronizar vários repositórios
  • Aplique as melhores práticas para implantar configurações, aplicativos e recursos do Istio com o Config Sync.
  • Implante configurações de cluster, os aplicativos de exemplo do 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:
    • Garanta que todas as cargas de trabalho na malha tenham injeção automática de sidecar.
    • Criptografe todo o tráfego na malha.
    • Garanta que todas as cargas de trabalho na malha tenham controle de acesso granular.

Custos

Neste documento, usa 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 custos com base na sua utilização projetada, 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

  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. Make sure that billing is enabled for your Google Cloud project.

Prepare seu ambiente

Nesta seção, você prepara seu ambiente para poder 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. Atualize para a versão mais recente do Google Cloud CLI:

    gcloud components update
    
  3. Para armazenar os arquivos que você criar 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 você deseja usar para este tutorial.

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

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

    gcloud

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

    Conector de configuração

    Este tutorial inclui recursos do Config Connector . Você pode usá-los para concluir as mesmas tarefas que realiza na aba gcloud . Para utilizar esses recursos, instale o Config Connector e aplique-os da maneira que melhor se adequar ao seu ambiente.

    Use o seguinte manifesto Services :

    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
    

    Esta operação pode levar mais de um minuto para ser concluída.

Configurar um cluster do GKE

Nesta seção, você cria um cluster do GKE e o registra em uma frota . As frotas são umGoogle Cloud conceito para organizar logicamente clusters e outros recursos, permitindo que você use e gerencie recursos de vários clusters e aplique políticas consistentes em todos os seus sistemas.

O cluster criado nesta seção é o cluster no qual você instala o Cloud Service Mesh, o Policy Controller e o Config Sync. É também o cluster onde você implanta os aplicativos de exemplo do Online Boutique.

Para configurar seu cluster, conclua as seguintes 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}
    

    Conector de configuração

    Use os seguintes manifestos ContainerCluster e ContainerNodePool :

    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.

    Esta operação pode levar mais de cinco minutos para ser concluída.

  2. Para garantir a criação bem-sucedida do cluster do GKE, descreva seu status:

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

    A saída é semelhante à seguinte:

    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 seu cluster em uma frota:

    gcloud

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

    A saída é semelhante à seguinte:

    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.
    

    Conector de configuração

    Use o seguinte manifesto GKEHubMembership :

    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
    

    A saída é semelhante à seguinte:

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

Explorar os repositórios

Na seção de instalação a seguir, você aplicará um arquivo manifesto acm-config.yaml . Este manifesto configura seu cluster para sincronizar a partir da pasta asm-acm-tutorial do repositório de exemplo. Esta 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 o 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 de proteção de seus clusters, malhas e aplicações sem precisar manipular os arquivos e executar comandos git repetidamente.

Para utilizar 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 do seu cluster, incluindo RepoSyncs , Constraints , ClusterRole , RoleBindings e recursos incluídos em alguns namespaces do sistema, como istio-system .
  • ingress-gateway , como um 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 aplicativos 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, você pode instalar o Config Sync, o Policy Controller e o Cloud Service Mesh em seu cluster e configurá-lo para sincronizar a partir das configurações do RootSync padrão:

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

    gcloud

    gcloud beta container fleet config-management enable
    

    Conector de configuração

    Use o seguinte manifesto GKEHubFeature :

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

    gcloud

    gcloud container fleet mesh enable
    

    Conector de configuração

    Use o seguinte manifesto GKEHubFeature :

    apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
    kind: GKEHubFeature
    metadata:
      name: servicemesh
    spec:
      projectRef:
        external: PROJECT_ID
      location: global
      resourceID: servicemesh
    
  3. Habilite 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}
    

    Conector de configuração

    Use o seguinte manifesto GKEHubFeatureMembership :

    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. Habilitar sincronização de configuração e controlador de política:

    gcloud

    Salve o seguinte manifesto 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 do 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
    

    Conector de configuração

    Use o seguinte manifesto GKEHubFeatureMembership :

    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 são instalados no seu cluster. Em seguida, o Config Sync começa a sincronizar todas as configurações do RootSync padrão com o seu cluster. Essas configurações instalam e configuram os seguintes componentes principais:

    • Os objetos RepoSync que configuram os aplicativos do 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 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
    

    A saída é semelhante à seguinte:

    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 bem-sucedida do Cloud Service Mesh, descreva seu status:

    gcloud container fleet mesh describe
    

    A saída é semelhante à seguinte:

    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, certifique-se de que o campo servicemesh.controlPlaneManagement.details.code tenha o valor REVISION_READY .

Implantar um gateway de entrada e um aplicativo de exemplo

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

  1. Implante o aplicativo de exemplo 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 aplicativo de exemplo.

    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
    

    Observe que esta etapa pode levar alguns minutos para ser concluída.

  2. Veja o status do Config Sync para o RootSync e os dois RepoSyncs :

    gcloud alpha anthos config sync repo describe
    

    A saída é 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 visualizar apenas as informações de um repositório, você pode usar os sinalizadores --sync-name e --sync-namespace . Para visualizar os recursos gerenciados em detalhes, adicione o sinalizador --managed-resources . Para obter mais informações, consulte Exibir o status da sincronização de configuração em vários clusters .

  3. Aguarde até que o endereço IP público do gateway de entrada seja provisionado:

    until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done
    
  4. Obtenha 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 aplicativo Online Boutique foi implantado com sucesso:

    echo http://${EXTERNAL_IP}
    

Aplique políticas para proteger sua malha

Nas seções a seguir, você utilizará o Policy Controller para impor políticas do pacote de políticas do Cloud Service Mesh criando restrições .

Aplicar injeção de proxies sidecar

Nesta seção, você aplica políticas para garantir que todas as cargas de trabalho na malha tenham a injeção automática de sidecar habilitada.

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

    O comando a seguir usa sed para atualizar o manifesto acm-config.yaml para 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:

    • Uma Constraint K8sRequiredLabels que requer que qualquer Namespace na malha contenha o rótulo de injeção de proxy sidecar específico 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
    • Uma Constraint AsmSidecarInjection que proíbe qualquer Pod na malha de ignorar a injeção do sidecar do proxy 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 Controlador de Políticas avaliar essas restrições. Se você não vir valores 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 essas Constraints .

  4. Para ver essas Constraints em ação, tente criar um Namespace no seu cluster sem um label nem uma annotation :

    kubectl create namespace test
    

    A saída é semelhante ao seguinte erro:

    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ê aplica políticas para garantir que todo o tráfego na malha seja criptografado .

  1. Para impor a criptografia de tráfego, aplique restrições.

    O comando a seguir usa sed para atualizar o manifesto acm-config.yaml para 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:

    • Uma Constraint AsmPeerAuthnMeshStrictMtls que impõe a PeerAuthentication mTLS de nível de 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 a Constraint AsmPeerAuthnMeshStrictMtls faça referência a outro objeto em sua definição (por exemplo, ao procurar por qualquer PeerAuthentication no Namespace istio-system ):

      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"
    • Uma Constraint DestinationRuleTLSEnabled que proíbe desabilitar o TLS para todos os hosts e subconjuntos de hosts no Istio DestinationRules :

      apiVersion: constraints.gatekeeper.sh/v1beta1
      kind: DestinationRuleTLSEnabled
      metadata:
        name: destination-rule-tls-enabled
      spec:
        enforcementAction: deny
        match:
          kinds:
          - apiGroups:
            - networking.istio.io
            kinds:
            - DestinationRule
    • Uma Constraint AsmPeerAuthnStrictMtls que impõe que todas PeerAuthentications não podem substituir STRICT mTLS:

      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 obter 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 uma PeerAuthentication no istio-system . Para impedir que todos os seus 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 . Ao implantar a política, o plano de controle provisiona automaticamente certificados TLS para que as cargas de trabalho possam se autenticar entre si.

    O comando a seguir usa sed para atualizar o manifesto acm-config.yaml para 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 implementa a seguinte PeerAuthentication STRICT mTLS no namespace istio-system . Isso aplica o 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
    

    Observe que pode levar alguns minutos para que o Controlador de Políticas avalie essas Constraints . Aguarde e execute novamente o comando kubectl get constraints até obter os valores na coluna TOTAL-VIOLATIONS para 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ê aplica políticas para garantir que todas as cargas de trabalho na malha tenham controle de acesso granular .

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

    O comando a seguir usa sed para atualizar o manifesto acm-config.yaml para 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:

    • Uma Constraint AsmAuthzPolicyDefaultDeny que impõe a negação padrão de nível de malha AuthorizationPolicy no namespace istio-system :

      apiVersion: constraints.gatekeeper.sh/v1beta1
      kind: AsmAuthzPolicyDefaultDeny
      metadata:
        name: default-deny-authorization-policies
      spec:
        enforcementAction: deny
        parameters:
          rootNamespace: istio-system
          strictnessLevel: High
    • Uma Constraint AsmAuthzPolicyEnforceSourcePrincipals que impõe que qualquer AuthorizationPolicies defina entidades de origem granulares (exceto "*"). Somente o gateway de entrada no namespace asm-ingress é uma exceção a essa regra, pois recebe o tráfego dos usuários finais e redireciona o tráfego para o aplicativo frontend da Boutique Online.

      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 obter 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 a AuthorizationPolicy no namespace istio-system .

    O comando a seguir usa sed para atualizar o manifesto acm-config.yaml para 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 a seguinte AuthorizationPolicy deny-all 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
    

    Observe que pode levar alguns minutos para que o Controlador de Políticas avalie essas Constraints . Aguarde e execute novamente o comando kubectl get constraints até obter os valores na coluna TOTAL-VIOLATIONS para 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 aplicativo Online Boutique no seu navegador:

    echo http://${EXTERNAL_IP}
    

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

  8. Corrija esse problema implantando AuthorizationPolicies mais granulares nos namespaces asm-ingress e onlineboutique .

    O comando a seguir usa sed para atualizar o manifesto acm-config.yaml para 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:

    • Uma 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"
    • Uma AuthorizationPolicy por aplicativo no namespace onlineboutique , aqui está o exemplo para o aplicativo 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 aplicativo nos namespaces asm-ingress e onlineboutique para que cada aplicativo tenha uma identidade única avaliada como principal nas AuthorizationPolicies . Aqui está o exemplo para o aplicativo cartservice :

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

    gcloud alpha anthos config sync repo describe
    

    A saída é 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 visualizar apenas as informações de um repositório, você pode usar os sinalizadores --sync-name e --sync-namespace . Para visualizar em detalhes os recursos gerenciados, você pode adicionar o sinalizador --managed-resources . Para obter mais informações, consulte Exibir o status da sincronização de configuração em vários clusters .

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

    echo http://${EXTERNAL_IP}
    

    Se você esperar alguns minutos, verá que o site estará funcionando corretamente novamente, conforme o esperado.

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

Você pode visualizar o status dos recursos de segurança do GKE Enterprise, incluindo políticas de autenticação e autorização, no Google Cloud console.

  1. No Google Cloud console, acesse a página GKE Enterprise Security .

    Acesse o GKE Enterprise Security

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

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

    Os cartões de controle de acesso ao serviço e de status mTLS fornecem uma visão geral de alto nível.

    Visão geral de alto nível do controle de acesso ao serviço e status do mTLS

    A lista de 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 seu controle de acesso de serviço e status mTLS

Agora você protegeu seu cluster e sua malha com o Policy Controller e o Config Sync.

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados ​​neste tutorial, exclua o projeto que contém os recursos 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 seu cluster da frota:

    gcloud

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

    A saída é semelhante à seguinte:

    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.
    

    Conector de configuração

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

    gcloud

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

    Pressione y quando solicitado. Este comando pode levar mais de cinco minutos para ser concluído.

    A saída é semelhante à seguinte:

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

    Conector de configuração

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

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

O que vem a seguir