Versión 1.14

Fortalece la seguridad de la app con Anthos Service Mesh y Anthos Config Management

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

En este instructivo, se muestra cómo mejorar la posición de seguridad de tu clúster y app. Imagina que eres un administrador de plataforma cuya organización administra las apps para la tienda en línea con Anthos Service Mesh, un conjunto de herramientas que te ayuda a supervisar y administrar una malla de servicios confiable. Eres responsable de garantizar que la malla y las apps sean seguras.

Puedes evitar una configuración incorrecta y validar de forma automática las políticas de Anthos Service Mesh mediante el controlador de políticas y el Sincronizador de configuración de Anthos Config Management. El controlador de políticas permite la aplicación de políticas completamente programables para tus clústeres. El controlador de políticas también viene con una biblioteca predeterminada de plantillas de restricciones que puedes usar con el paquete de seguridad de Anthos Service Mesh para auditar el cumplimiento de las vulnerabilidades de seguridad de tu malla y las prácticas recomendadas. El Sincronizador de configuración concilia de forma continua el estado de los clústeres con un conjunto central de archivos de configuración declarativos de Kubernetes. Si usas el controlador de políticas y el Sincronizador de configuración juntos, puedes aplicar restricciones de forma continua en las opciones de configuración de la política de Anthos Service Mesh.

En el siguiente diagrama, se muestra una descripción general de cómo funcionan Anthos Service Mesh, el controlador de políticas y el Sincronizador de configuración en conjunto en este instructivo para administrar y proteger una puerta de enlace de entrada y las apps de ejemplo Online Boutique que utilizas en este instructivo:

Un diagrama que muestra la arquitectura que crearás para este instructivo

Objetivos

  • Crear un clúster de Google Kubernetes Engine (GKE) y registrarlo en una flota.
  • Instalar el controlador de políticas, el Sincronizador de configuración y Anthos Service Mesh en un clúster.
  • Configura el Sincronizador de configuración para sincronizar varios repositorios
  • Aplica las prácticas recomendadas para implementar archivos de configuración, apps y recursos de Istio con el Sincronizador de configuración.
  • Implementa archivos de configuración de clúster, las apps de muestra Online Boutique y una puerta de enlace de entrada con el Sincronizador de configuración.
  • Aprovecha el paquete de políticas de Anthos Service Mesh del controlador de políticas para aplicar las siguientes prácticas recomendadas de seguridad:
    • Garantizar que todas las cargas de trabajo en la malla tengan una inserción automática de archivo adicional.
    • Encripta todo el tráfico en la malla.
    • Garantiza que todas las cargas de trabajo en la malla tengan control de acceso detallado.

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

  • GKE.
  • Anthos. En la facturación de Anthos, se incluye la facturación de Anthos Service Mesh y los componentes de Anthos Config Management.

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Cuando finalices este instructivo, podrás borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta Cómo realizar una limpieza.

Antes de comenzar

  1. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Obtén información sobre cómo verificar si la facturación está habilitada en un proyecto.

Prepare el entorno

En esta sección, prepararás el entorno para poder instalar Anthos Service Mesh, el controlador de políticas y el Sincronizador de configuración:

  1. En la consola de Google Cloud, activa Cloud Shell.

    Activar Cloud Shell

  2. Actualiza a la versión más reciente de Google Cloud CLI:

    gcloud components update
    
  3. Para almacenar los archivos que creas en este instructivo, crea un directorio:

    mkdir ~/asm-acm-tutorial-dir
    
  4. Para simplificar el resto del instructivo, crea las siguientes variables de entorno:

    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)')
    

    Reemplaza PROJECT_ID por el ID del proyecto que deseas usar para este instructivo.

    Si se te solicita que autorices a Cloud Shell, haz clic en Autorizar para completar la operación.

  5. Habilita las API que necesitarás para este instructivo:

    gcloud

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

    Config Connector

    En este instructivo, se incluyen recursos de Config Connector. Puedes usar estos recursos para completar las mismas tareas que completas en la pestaña gcloud. Para usar estos recursos, instala Config Connector y aplica los recursos de la manera que mejor se adapte a tu entorno.

    Usa el siguiente manifiesto 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 operación puede tardar más de un minuto en completarse.

Configura un clúster de GKE

En esta sección, crearás un clúster de GKE y, luego, lo registrarás en una flota. Las flotas son un concepto de Google Cloud que organiza de manera lógica los clústeres y otros recursos, lo que te permite usar y administrar capacidades de varios clústeres y aplicar políticas coherentes en tus sistemas.

El clúster que creas en esta sección es el clúster en el que instalarás Anthos Service Mesh, el controlador de políticas y el Sincronizador de configuración. También es el clúster en el que implementarás las apps de ejemplo Online Boutique.

Para configurar tu clúster, completa los siguientes pasos:

  1. Crea un clúster de 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

    Usa los siguientes manifiestos ContainerCluster y 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
    

    Reemplaza PROJECT_NUMBER por el valor de la variable de entorno PROJECT_NUMBER que recuperaste antes.

    Esta operación puede tardar más de cinco minutos en completarse.

  2. Para garantizar la creación exitosa del clúster de GKE, describe su estado:

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

    El resultado es similar a este:

    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. Conéctate al clúster de GKE:

    gcloud container clusters get-credentials ${CLUSTER} \
        --zone ${CLUSTER_ZONE} \
        --project ${PROJECT_ID}
    
  4. Registra tu clúster en una flota:

    gcloud

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

    El resultado es similar a este:

    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

    Usa el siguiente manifiesto 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 garantizar el registro correcto del clúster de GKE, describe su estado:

    gcloud container fleet memberships list
    

    El resultado es similar a este:

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

Explora los repositorios

En la siguiente sección de instalación, aplicas un manifiesto de Anthos Config Management acm-config.yaml. En este manifiesto, se configura el clúster para que se sincronice desde la carpeta asm-acm-tutorial del repositorio de muestra de Anthos Config Management. Esta carpeta contiene todos los archivos de configuración que necesitas para completar el resto del instructivo.

Para simplificar este instructivo, usa los comandos de sed a fin de actualizar acm-config.yaml. Con el archivo acm-config.yaml, el Sincronizador de configuración implementa los manifiestos necesarios para cada paso de este instructivo. La actualización de un solo archivo te ayuda a enfocarte en los conceptos y el flujo de protección de los clústeres, la malla y las aplicaciones sin manipular los archivos ni ejecutar los comandos de git de manera repetida.

Para usar la capacidad del Sincronizador de configuración de sincronizar varios repositorios, usa los siguientes recursos:

  • root-sync, como repositorio de RootSync, contiene todos los archivos de configuración del clúster, incluidos RepoSyncs, Constraints. , ClusterRole, RoleBindings y los recursos incluidos en algunos espacios de nombres del sistema, como istio-system.
  • ingress-gateway, como primer RepoSync, contiene todos los recursos necesarios para implementar una puerta de enlace de entrada y protegerla de forma progresiva durante este instructivo.
  • online-boutique, como segundo RepoSync, contiene todos los recursos necesarios para implementar las apps de Online Boutique y protegerlas de forma progresiva durante este instructivo.

Instala el controlador de políticas, el Sincronizador de configuración y Anthos Service Mesh administrado

Ahora que creaste y registraste tu clúster, puedes instalar el Sincronizador de configuración, el controlador de políticas y Anthos Service Mesh en el clúster y configurarlo para que se sincronice con los archivos de configuración de RootSync predeterminados:

  1. Habilita Anthos Config Management en tu flota:

    gcloud

    gcloud beta container fleet config-management enable
    

    Config Connector

    Usa el siguiente manifiesto GKEHubFeature:

    apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
    kind: GKEHubFeature
    metadata:
      name: configmanagement
    spec:
      projectRef:
        external: PROJECT_ID
      location: global
      resourceID: configmanagement
    
  2. Habilita Anthos Service Mesh en la flota.

    gcloud

    gcloud container fleet mesh enable
    

    Config Connector

    Usa el siguiente manifiesto GKEHubFeature:

    apiVersion: gkehub.cnrm.cloud.google.com/v1beta1
    kind: GKEHubFeature
    metadata:
      name: servicemesh
    spec:
      projectRef:
        external: PROJECT_ID
      location: global
      resourceID: servicemesh
    
  3. Habilita la administración automática de Anthos Service Mesh para permitir que Google aplique la configuración recomendada de Anthos Service Mesh administrado:

    gcloud

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

    Config Connector

    Usa el siguiente manifiesto 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. Habilita el Sincronizador de configuración y el Controlador de políticas:

    gcloud

    Guarda el siguiente manifiesto de Anthos Config Management como acm-config.yaml en el directorio ~/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 obtener más información sobre los campos de configuración de Anthos Config Management, consulta gcloud apply spec field.

    Aplica el siguiente archivo:

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

    Config Connector

    Usa el siguiente manifiesto 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
    

    El controlador de políticas y el Sincronizador de configuración están instalados en el clúster. A continuación, el Sincronizador de configuración comienza a sincronizar todos los archivos de configuración del RootSync predeterminado con el clúster. Estos archivos de configuración instalan y configuran los siguientes componentes clave:

  5. Para garantizar la instalación correcta del controlador de políticas y del Sincronizador de configuración, consulta el estado de Anthos Config Management:

    gcloud beta container fleet config-management status
    

    El resultado es similar a este:

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

    Si ves PENDING o NOT_INSTALLED en las filas Status o Policy_Controller, espera unos minutos y vuelve a ejecutar gcloud beta container fleet config-management status.

  6. Para garantizar la instalación correcta de Anthos Service Mesh, describe su estado:

    gcloud container fleet mesh describe
    

    El resultado es similar a este:

    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'
    

    Si ves state.code: ERROR en lugar de state.code: OK, espera unos minutos y vuelve a ejecutar gcloud container fleet mesh describe. Antes de continuar con el instructivo, debes asegurarte de que el campo servicemesh.controlPlaneManagement.details.code tenga el valor REVISION_READY.

Implementa una puerta de enlace de entrada y una aplicación de muestra

En esta sección, implementarás la aplicación de muestra de Online Boutique y una puerta de enlace de entrada para administrar el tráfico de entrada.

  1. Implementa la aplicación de muestra Online Boutique y la puerta de enlace de entrada.

    En el siguiente comando, se usa sed a fin de actualizar el manifiesto acm-config.yaml para que el Sincronizador de configuración implemente los recursos que necesitas a fin de usar la puerta de enlace de entrada y la app de muestra.

    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
    

    Este paso puede tardar unos minutos en completarse.

  2. Consulta el estado del Sincronizador de configuración de RootSync y los dos RepoSyncs:

    gcloud alpha anthos config sync repo describe
    

    El resultado es similar al siguiente:

    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"
      }
    ]
    

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

    Para ver solo la información de un repositorio, puedes usar las marcas --sync-name y --sync-namespace. Para ver los recursos administrados en detalle, agrega la marca --managed-resources. Para obtener más información, consulta Visualiza el estado del Sincronizador de configuración en varios clústeres.

  3. Espera a que se aprovisione la dirección IP pública de la puerta de enlace de entrada:

    until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done
    
  4. Obtén la dirección IP pública de la puerta de enlace de entrada:

    EXTERNAL_IP=$(kubectl get svc asm-ingressgateway -n asm-ingress -o jsonpath="{.status.loadBalancer.ingress[*].ip}")
    
  5. Visita la dirección IP desde tu navegador para verificar que la aplicación Online Boutique se haya implementado correctamente:

    echo http://${EXTERNAL_IP}
    

Aplica políticas para proteger tu malla

En las siguientes secciones, aprovecharás el Controlador de políticas para aplicar las políticas del paquete de políticas de Anthos Service Mesh mediante la creación de restricciones.

Aplica la inyección de proxies de sidecar

En esta sección, aplicarás políticas para garantizar que todas las cargas de trabajo de la malla tengan habilitada la inyección automática de sidecar.

  1. Para aplicar la inserción de proxies de sidecar, aplica restricciones.

    El siguiente comando usa sed para actualizar el manifiesto de Anthos Config Management a fin de que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    El comando anterior implementa los siguientes recursos:

  2. Consulta el estado del Sincronizador de configuración de RootSync:

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

    El resultado es similar al siguiente:

    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"
      }
    ]
    

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

  3. Verifica que se hayan creado Constraints:

    kubectl get constraints
    

    El controlador de políticas puede tardar unos minutos en evaluar estas restricciones. Si no ves valores en la columna TOTAL-VIOLATIONS, espera y vuelve a ejecutar kubectl get constraints.

    El resultado es similar al siguiente:

    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
    

    Debido a que configuraste correctamente Namespaces y Pods, hay 0 TOTAL-VIOLATIONS para estas Constraints.

  4. Para ver estos Constraints en funcionamiento, intenta crear un Namespace en tu clúster sin un label ni un annotation:

    kubectl create namespace test
    

    El resultado es similar al siguiente error:

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

Aplica la encriptación de tráfico

En esta sección, aplicarás políticas para garantizar que todo el tráfico de la malla esté encriptado.

  1. Para aplicar la encriptación de tráfico, aplica restricciones.

    El siguiente comando usa sed para actualizar el manifiesto de Anthos Config Management a fin de que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    El comando anterior implementa los siguientes recursos:

  2. Consulta el estado del Sincronizador de configuración de RootSync:

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

    El resultado es similar al siguiente:

    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"
      }
    ]
    

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

  3. Ejecuta el siguiente comando para obtener más información sobre el incumplimiento PeerAuthentication:

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

    El resultado es similar al siguiente:

    [
      {
        "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. Para solucionar el problema, implementa un PeerAuthentication en el istio-system. Para evitar que todos tus servicios de la malla acepten tráfico de texto simple, establece una política PeerAuthentication en toda la malla con el modo mTLS establecido en STRICT. Cuando implementas la política, el plano de control aprovisiona automáticamente certificados TLS para que las cargas de trabajo se puedan autenticar entre sí.

    El siguiente comando usa sed para actualizar el manifiesto de Anthos Config Management a fin de que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    El comando anterior implementa el siguiente STRICT de PeerAuthentication de mTLS en el espacio de nombres istio-system. Esto aplica mTLS STRICT a toda la malla:

    apiVersion: security.istio.io/v1beta1
    kind: PeerAuthentication
    metadata:
      name: default
    spec:
      mtls:
        mode: STRICT
  5. Consulta el estado del Sincronizador de configuración de RootSync:

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

    El resultado es similar al siguiente:

    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"
      }
    ]
    

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

  6. Verifica que se hayan creado Constraints:

    kubectl get constraints
    

    Ten en cuenta que el controlador de políticas puede tardar unos minutos en evaluar estas Constraints. Espera y ejecuta de nuevo este comando kubectl get constraints hasta que obtengas los valores en la columna TOTAL-VIOLATIONS para cada línea.

    El resultado es similar al siguiente:

    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
    

Aplica control de acceso detallado

En esta sección, aplicarás políticas para garantizar que todas las cargas de trabajo de la malla tengan control de acceso detallado.

  1. Para aplicar un control de acceso detallado, aplica restricciones.

    El siguiente comando usa sed para actualizar el manifiesto de Anthos Config Management a fin de que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    El comando anterior implementa los siguientes recursos:

  2. Consulta el estado del Sincronizador de configuración de RootSync:

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

    El resultado es similar al siguiente:

    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"
      }
    ]
    

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

  3. Ejecuta el siguiente comando para obtener más información sobre el incumplimiento asociado:

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

    El resultado es similar al siguiente:

    [
      {
        "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. Para solucionar el problema, implementa AuthorizationPolicy en el espacio de nombres istio-system.

    El siguiente comando usa sed para actualizar el manifiesto de Anthos Config Management a fin de que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    Con el comando anterior, se implementa el siguiente comando AuthorizationPolicy de denegación completo en el espacio de nombres istio-system:

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: deny-all
    spec:
      {}
  5. Consulta el estado del Sincronizador de configuración de RootSync:

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

    El resultado es similar al siguiente:

    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"
      }
    ]
    

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

  6. Verifica que se hayan creado Constraints:

    kubectl get constraints
    

    Ten en cuenta que el controlador de políticas puede tardar unos minutos en evaluar estas Constraints. Espera y ejecuta de nuevo este comando kubectl get constraints hasta que obtengas los valores en la columna TOTAL-VIOLATIONS para cada línea.

    El resultado es similar al siguiente:

    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. Visita la aplicación Online Boutique desde tu navegador:

    echo http://${EXTERNAL_IP}
    

    Deberías recibir el siguiente error: RBAC: access denied que confirma que la denegación predeterminada AuthorizationPolicy se aplica a toda la malla.

  8. Para solucionar este problema, implementa AuthorizationPolicies más detallados en los espacios de nombres asm-ingress y onlineboutique.

    El siguiente comando usa sed para actualizar el manifiesto de Anthos Config Management a fin de que el Sincronizador de configuración implemente los recursos asociados.

    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
    

    El comando anterior implementa los siguientes recursos:

  9. Consulta el estado del Sincronizador de configuración de RootSync y los dos RepoSyncs:

    gcloud alpha anthos config sync repo describe
    

    El resultado es similar al siguiente:

    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"
      }
    ]
    

    Si ves status: RECONCILING en lugar de status: SYNCED, espera unos minutos y vuelve a ejecutar gcloud alpha anthos config sync repo describe.

    Para ver solo la información de un repositorio, puedes usar las marcas --sync-name y --sync-namespace. Para ver en detalle los recursos administrados, puedes agregar la marca --managed-resources. Para obtener más información, consulta Visualiza el estado del Sincronizador de configuración en varios clústeres.

  10. Visita la aplicación Online Boutique de nuevo desde tu navegador:

    echo http://${EXTERNAL_IP}
    

    Si espera unos minutos, deberías ver que el sitio web funciona correctamente nuevamente.

Consulta el estado de las funciones de seguridad de Anthos

Puedes ver el estado de las funciones de seguridad de Anthos, incluidas las políticas de autenticación y autorización, en la consola de Google Cloud.

  1. En la consola de Google Cloud, ve a la página Seguridad de Anthos.

    Ir a Seguridad de Anthos

    En Resumen de la política, se muestra el estado de la seguridad de la aplicación, incluido el control de acceso de servicio (AuthorizationPolicies) y la mTLS.

  2. Haz clic en Auditoría de la política para ver los estados de las políticas de cargas de trabajo del clúster y de ambos espacios de nombres (asm-ingress y onlineboutique).

    Las tarjetas de Control de acceso de servicio y Estado de mTLS proporcionan una descripción general de alto nivel.

    Descripción general de alto nivel del control de acceso al servicio y el estado de mTLS

    En la lista Cargas de trabajo, se muestra el control de acceso del servicio y el estado de mTLS de cada carga de trabajo.

    Lista detallada de cada carga de trabajo y su control de acceso a servicios y estado de mTLS

Ya protegiste tu clúster y tu malla con el controlador de políticas y el Sincronizador de configuración.

Realiza una limpieza

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

    Borra un proyecto de Cloud:

    gcloud projects delete PROJECT_ID

Borra los recursos individuales

Para borrar los recursos individuales, haz lo siguiente:

  1. Cancela el registro de tu clúster de la flota:

    gcloud

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

    El resultado es similar a este:

    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. Borra el clúster

    gcloud

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

    Presiona y cuando se te solicite. Este comando puede demorar más de cinco minutos en completarse.

    El resultado es similar a este:

    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. Borra los archivos que creaste:

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

¿Qué sigue?