Versión 1.14

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

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 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.
  • Implementar las apps de ejemplo Online Boutique y una puerta de enlace de entrada.
  • Aprovechar el paquete de políticas de Anthos Service Mesh para aplicar las siguientes prácticas recomendadas:
    • 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. Abre una sesión de Cloud Shell. Para abrir esta sesión, en la esquina superior derecha de esta página, haz clic en Activar Cloud Shell y, luego, en Confirmar. Se abrirá una sesión de Cloud Shell dentro de un marco en la parte inferior de la página. Completa los siguientes comandos en esa sesión de Cloud Shell.
  2. Actualiza a la versión más reciente de Google Cloud CLI:

    gcloud components update
    
  3. Para almacenar los archivos que crearás en este instructivo, crea un directorio con una variable de entorno:

    WORK_DIR=~/asm-acm-tutorial-dir
    mkdir $WORK_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
    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 services enable \
        container.googleapis.com \
        gkehub.googleapis.com \
        mesh.googleapis.com \
        anthos.googleapis.com
    

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

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

    El resultado es similar a este:

    kubeconfig entry generated for asm-acm-tutorial.
    NAME: asm-acm-tutorial
    LOCATION: us-east4-a
    MASTER_VERSION: 1.21.10-gke.2000
    MASTER_IP: 34.85.159.120
    MACHINE_TYPE: e2-standard-4
    NODE_VERSION: 1.21.10-gke.2000
    NUM_NODES: 4
    STATUS: RUNNING
    
  2. Registra tu clúster en una flota:

    gcloud container fleet memberships register ${CLUSTER} \
        --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.
    

Explora el repositorio

En la siguiente sección de instalación, aplicas un manifiesto de Anthos Config Management acm-config.yaml. Este manifiesto configura tu 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.

A fin de simplificar la experiencia en este instructivo, usa comandos sed de modo que puedas actualizar el archivo acm-config.yaml para implementar los manifiestos necesarios en cada paso. Actualizar un solo archivo permite que te enfoques en los conceptos y el flujo para proteger tus clústeres, mallas y aplicaciones sin manipular de forma repetida los archivos ni ejecutar los comandos de git add|commit|push.

Antes de aplicar el manifiesto acm-config.yaml, es útil comprender la estructura y el contenido generales del repositorio.

Para usar la capacidad del Sincronizador de configuración de sincronizarse con varios repositorios, el repositorio asc-acm-tutorial contiene dos carpetas de nivel superior; root-sync y online-boutique.

La carpeta root-sync

La carpeta root-sync es el repositorio raíz. Este repositorio se divide en varias subcarpetas, y cada una de estas subcarpetas contiene recursos y políticas para una parte diferente de este instructivo.

Hay dos carpetas que contienen recursos para configurar la app de ejemplo Online Boutique y la puerta de enlace de entrada:

  • init: recursos para configurar RepoSync para las apps Online Boutique.
  • deployments: recursos para implementar la puerta de enlace de entrada y los espacios de nombres y las apps Online Boutique.

Existen tres carpetas que contienen recursos para implementar las diferentes políticas de Anthos Service Mesh:

  • enforce-sidecar-injection: recursos para implementar políticas a fin de aplicar la inserción de archivo adicional para Namespace y Pod.
  • enforce-strict-mtls: recursos para implementar políticas a fin de aplicar el modo STRICT de mTLS para toda la malla y cualquier PeerAuthentication.
  • enforce-authorization-policies: Recursos para implementar políticas a fin de aplicar el valor predeterminadodeny AuthorizationPolicy para toda la malla, así como para aplicar los principales de origen detallados a cualquier AuthorizationPolicies.

Las tres carpetas restantes contienen recursos para implementar los recursos que corrigen los incumplimientos de políticas de Anthos Service Mesh:

  • fix-strict-mtls: recursos para implementar PeerAuthentication de mTLS del modo predeterminado STRICT en el espacio de nombres istio-system.
  • fix-default-deny-authorization-policy: recursos para implementar deny AuthorizationPolicy de forma predeterminada en el espacio de nombres istio-system.
  • deploy-authorization-policies: recursos para implementar los recursos detallados AuthorizationPolicy a fin de que las app de ejemplo Online Boutique funcionen.

La carpeta online-boutique

La carpeta online-boutique es un repositorio de espacio de nombres. Este repositorio contiene los recursos que necesitas para implementar las apps de ejemplo Online Boutique mediante Kustomize.

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

Ahora que creaste y registraste el 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 en la carpeta asc-acm-tutorial:

  1. Habilita Anthos Config Management en tu flota:

    gcloud beta container fleet config-management enable
    
  2. Habilita Anthos Service Mesh en la flota.

    gcloud container fleet mesh enable
    
  3. Habilita la administración automática del plano de control de Anthos Service Mesh para permitir que Google aplique la configuración recomendada de Anthos Service Mesh administrada:

    gcloud container fleet mesh update \
        --control-plane automatic \
        --memberships ${CLUSTER}
    
  4. Para instalar y configurar el Sincronizador de configuración y el controlador de políticas, crea el siguiente manifiesto de Anthos Config Management:

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

    Para obtener más información sobre los campos de configuración de Anthos Config Management, consulta gcloud apply spec field.

  5. Aplica el siguiente archivo:

    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    Después de aplicar este archivo, el controlador de políticas y el Sincronizador de configuración se instalan en tu clúster. A continuación, el Sincronizador de configuración comienza a sincronizar todos los archivos de configuración de la carpeta asm-acm-tutorial en tu clúster. Estos archivos de configuración instalan y configuran los siguientes componentes clave:

    • Se sincroniza el objeto RepoSync que configura la app Online Boutique:

      apiVersion: configsync.gke.io/v1beta1
      kind: RepoSync
      metadata:
        name: repo-sync
      spec:
        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
    • Dado que el conciliador RepoSync necesita permisos adicionales para crear recursos de Istio, el repositorio también contiene roles del clúster y vinculaciones de roles del clúster a fin de otorgar estos permisos. Este es el manifiesto del rol del clúster que se aplica de forma automática al clúster:

      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"
        verbs:
        - "*"
  6. 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.

  7. 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-05-05T23:33:44.041608250Z'
    membershipSpecs:
      projects/841604900168/locations/global/memberships/asm-acm-tutorial:
        mesh:
          controlPlane: AUTOMATIC
    membershipStates:
      projects/841604900168/locations/global/memberships/asm-acm-tutorial:
        servicemesh:
          controlPlaneManagement:
            details:
            - code: REVISION_READY
              details: 'Ready: asm-managed'
            state: ACTIVE
        state:
          code: OK
          description: 'Revision(s) ready for use: asm-managed.'
          updateTime: '2022-05-05T23:45:38.800808838Z'
    name: projects/PROJECT_ID/locations/global/features/servicemesh
    resourceState:
      state: ACTIVE
    spec: {}
    state:
      state: {}
    updateTime: '2022-05-05T23:45:44.848011023Z'
    

    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" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    Este paso puede tardar unos minutos en completarse.

  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/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 también 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.

  3. Consulta el estado del Sincronizador de configuración de RepoSync:

    gcloud alpha anthos config sync repo describe \
        --sync-name repo-sync \
        --sync-namespace onlineboutique
    

    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//online-boutique/deployments@main:HEAD",
        "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.

  4. 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
    
  5. 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}")
    
  6. 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 archivo acm-config.yaml 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" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    El comando anterior aplica 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 archivo acm-config.yaml 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" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    El comando anterior aplica 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",
        "kind": "AsmPeerAuthnMeshStrictMtls",
        "message": "Root namespace <istio-system> does not have a strict mTLS PeerAuthentication",
        "name": "mesh-level-strict-mtls"
      }
    ]
    
  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 archivo acm-config.yaml 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" $WORK_DIR/acm-config.yaml
    gcloud beta container hub config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    El comando anterior aplica 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 archivo acm-config.yaml 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" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    El comando anterior aplica 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",
        "kind": "AsmAuthzPolicyDefaultDeny",
        "message": "Root namespace <istio-system> does not have a default deny AuthorizationPolicy",
        "name": "default-deny-authorization-policies"
      }
    ]
    
  4. Para solucionar el problema, implementa AuthorizationPolicy en el espacio de nombres istio-system.

    El siguiente comando usa sed para actualizar el archivo acm-config.yaml 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" $WORK_DIR/acm-config.yaml
    gcloud beta container hub config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    Con el comando anterior, se aplica 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 predeterminadaAuthorizationPolicy 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 archivo acm-config.yaml 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" $WORK_DIR/acm-config.yaml
    gcloud beta container hub config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    El comando anterior aplica los siguientes recursos:

  9. 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.

  10. Consulta el estado del Sincronizador de configuración de RepoSync:

    gcloud alpha anthos config sync repo describe \
        --sync-name repo-sync \
        --sync-namespace onlineboutique
    

    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/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.

  11. 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, 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

  1. En la consola, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra los recursos individuales

Para borrar los recursos individuales, haz lo siguiente:

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

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

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

    rm -r $WORK_DIR
    

¿Qué sigue?