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 Cloud 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 Cloud Service Mesh mediante el Controlador de políticas y el Sincronizador de configuración. El controlador de políticas permite la aplicación de políticas completamente programables para tus clústeres. Policy Controller también incluye una biblioteca predeterminada plantillas de restricciones que puedes usar con el Paquete de seguridad de la malla de servicios de Cloud para auditar el cumplimiento de las vulnerabilidades y prácticas recomendadas de seguridad en malla. 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 Cloud Service Mesh.
En el siguiente diagrama, se muestra una descripción general de cómo funcionan Cloud 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:
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 Cloud 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 Cloud 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 documento, usarás los siguientes componentes facturables de Google Cloud:
- GKE.
- GKE Enterprise. The billing for GKE Enterprise includes billing for the Cloud Service Mesh, Config Sync, and Policy Controller.
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.
Antes de comenzar
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
Prepare el entorno
En esta sección, prepararás tu entorno para poder instalar Malla de servicios de Cloud, Policy Controller y Sincronizador de configuración:
-
In the Google Cloud console, activate Cloud Shell.
Actualiza a la versión más reciente de Google Cloud CLI:
gcloud components update
Para almacenar los archivos creados en este instructivo, crea un directorio:
mkdir ~/asm-acm-tutorial-dir
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.
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 incluye Config Connector de Google Cloud. Puedes usar estos recursos para completar las mismas tareas que completas en la pestaña
gcloud
. Para utilizar estos recursos, instalar Config Connector y aplicar los recursos de la forma 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 crearás en esta sección es el que instalarás. Cloud Service Mesh, Policy Controller y Sincronizador de configuración están activados. 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:
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
yContainerNodePool
: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 entornoPROJECT_NUMBER
que se recuperó antes.Esta operación puede tardar más de cinco minutos en completarse.
Para garantizar la creación correcta 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
Conéctate al clúster de GKE:
gcloud container clusters get-credentials ${CLUSTER} \ --zone ${CLUSTER_ZONE} \ --project ${PROJECT_ID}
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
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, aplicarás un
el archivo de manifiesto 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. 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 deRootSync
, contiene todos los archivos de configuración del clúster, incluidosRepoSyncs
,Constraints
. ,ClusterRole
,RoleBindings
y los recursos incluidos en algunos espacios de nombres del sistema, comoistio-system
.ingress-gateway
, como primerRepoSync
, contiene todos los recursos necesarios para implementar una puerta de enlace de entrada y protegerla de forma progresiva durante este instructivo.online-boutique
, como segundoRepoSync
, 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 Cloud Service Mesh administrado
Ahora que creaste y registraste tu clúster, puedes instalar el Sincronizador de configuración, el controlador de políticas y Cloud Service Mesh en el clúster y configurarlo para que se sincronice con los archivos de configuración de RootSync
predeterminados:
Habilita el operador
ConfigManagement
, que administra el Sincronizador de configuración y Policy Controller: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
Habilita Cloud Service Mesh en tu 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
Habilita la administración automática de Cloud Service Mesh para permitir que Google aplique la configuración recomendada de Cloud 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
Habilita el Sincronizador de configuración y Policy Controller:
gcloud
Guarda el siguiente manifiesto 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 Google Cloud CLI, consulta gcloud apply spec fields.
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 tu clúster. Luego, El Sincronizador de configuración comienza a sincronizar todos los parámetros de configuración del
RootSync
predeterminado tu clúster. Estos parámetros de configuración instalan y configuran la siguiente clave componentes:Los objetos
RepoSync
que configuran las apps Online Boutique y la puerta de enlace de entrada se sincronizan:Dado que los conciliadores
RepoSync
necesitan permisos adicionales para crear recursos de Istio, también se aplican unClusterRole
y dos objetosRoleBinding
a fin de otorgar estos permisos al clúster:
Para garantizar la instalación correcta de Policy Controller y El Sincronizador de configuración, verifica el estado:
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
oNOT_INSTALLED
en las filasStatus
oPolicy_Controller
, espera unos minutos y vuelve a ejecutargcloud beta container fleet config-management status
.Para garantizar la instalación correcta de Cloud 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 destate.code: OK
, espera unos minutos y vuelve a ejecutargcloud container fleet mesh describe
. Antes de continuar con el instructivo, debes asegurarte de que el camposervicemesh.controlPlaneManagement.details.code
tenga el valorREVISION_READY
.
Implementa una puerta de enlace de entrada y una aplicación de muestra
En esta sección, implementarás el Aplicación de muestra Online Boutique y una puerta de enlace de entrada para administrar el tráfico de entrada.
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 manifiestoacm-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.
Consulta el estado del Sincronizador de configuración de
RootSync
y los dosRepoSyncs
: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 destatus: SYNCED
, espera unos minutos y vuelve a ejecutargcloud 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.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
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}")
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 Controlador de políticas para aplicar políticas desde la Paquete de políticas de la malla de servicios de Cloud creando 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.
Para aplicar la inserción de proxies de sidecar, aplica restricciones.
En el siguiente comando, se usa
sed
para actualizar el manifiestoacm-config.yaml
para 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:
Un objeto
Constraint
K8sRequiredLabels
que requiereNamespace
en la malla para que contenga Etiqueta de inyección del proxy de sidecar de Cloud Service Mesh:Una
Constraint
AsmSidecarInjection
que prohíbe que cualquierPod
de la malla omita la inserción de sidecar del proxy de Istio:
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 destatus: SYNCED
, espera unos minutos y vuelve a ejecutargcloud alpha anthos config sync repo describe
.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 ejecutarkubectl 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
yPods
, hay0
TOTAL-VIOLATIONS
para estasConstraints
.Para ver estos
Constraints
en funcionamiento, intenta crear unNamespace
en tu clúster sin unlabel
ni unannotation
: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.
Para aplicar la encriptación de tráfico, aplica restricciones.
En el siguiente comando, se usa
sed
para actualizar el manifiestoacm-config.yaml
para 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:
Un
Constraint
AsmPeerAuthnMeshStrictMtls
que aplica elPeerAuthentication
de mTLS a nivel de malla en el espacio de nombresistio-system
:Una restricción referencial
Config
en el espacio de nombresgatekeeper-system
Esta restricción referencial permite queAsmPeerAuthnMeshStrictMtls
Constraint
haga referencia a otro objeto en su definición (por ejemplo, si buscas cualquierPeerAuthentication
enistio-system
Namespace
):Una
Constraint
DestinationRuleTLSEnabled
que prohíbe inhabilitar TLS para todos los hosts y subconjuntos de hosts enDestinationRules
de Istio:Una
Constraint
AsmPeerAuthnStrictMtls
que exige que todas lasPeerAuthentications
no puedan reemplazar la mTLSSTRICT
:
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 destatus: SYNCED
, espera unos minutos y vuelve a ejecutargcloud alpha anthos config sync repo describe
.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" } ]
Para solucionar el problema, implementa un
PeerAuthentication
en elistio-system
. Para evitar que todos tus servicios de la malla acepten tráfico de texto simple, establece una políticaPeerAuthentication
en toda la malla con el modo mTLS establecido enSTRICT
. 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í.En el siguiente comando, se usa
sed
para actualizar el manifiestoacm-config.yaml
para 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
dePeerAuthentication
de mTLS en el espacio de nombresistio-system
. Esto aplica mTLSSTRICT
a toda la malla: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 destatus: SYNCED
, espera unos minutos y vuelve a ejecutargcloud alpha anthos config sync repo describe
.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 comandokubectl get constraints
hasta que obtengas los valores en la columnaTOTAL-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.
Para aplicar un control de acceso detallado, aplica restricciones.
En el siguiente comando, se usa
sed
para actualizar el manifiestoacm-config.yaml
para 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:
Un
Constraint
AsmAuthzPolicyDefaultDeny
que aplica elAuthorizationPolicy
predeterminado de denegación a nivel de malla en el espacio de nombresistio-system
:Una
Constraint
AsmAuthzPolicyEnforceSourcePrincipals
que exige que cualquierAuthorizationPolicies
defina principales de origen detallados (además de “*”). Solo la puerta de enlace de entrada en el espacio de nombresasm-ingress
es una excepción a esta regla para recibir el tráfico de los usuarios finales y redireccionar el tráfico a la aplicaciónfrontend
de Online Boutique.
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 destatus: SYNCED
, espera unos minutos y vuelve a ejecutargcloud alpha anthos config sync repo describe
.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" } ]
Para solucionar el problema, implementa
AuthorizationPolicy
en el espacio de nombresistio-system
.En el siguiente comando, se usa
sed
para actualizar el manifiestoacm-config.yaml
para 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 nombresistio-system
: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 destatus: SYNCED
, espera unos minutos y vuelve a ejecutargcloud alpha anthos config sync repo describe
.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 comandokubectl get constraints
hasta que obtengas los valores en la columnaTOTAL-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
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.Para solucionar este problema, implementa
AuthorizationPolicies
más detallados en los espacios de nombresasm-ingress
yonlineboutique
.En el siguiente comando, se usa
sed
para actualizar el manifiestoacm-config.yaml
para 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:
Un
AuthorizationPolicy
en el espacio de nombresasm-ingress
:Un
AuthorizationPolicy
por aplicación en el espacio de nombresonlineboutique
. Este es el ejemplo de la app decartservice
:Un
ServiceAccount
por app en los espacios de nombresasm-ingress
yonlineboutique
para tener una identidad única por app evaluada comoprincipal
enAuthorizationPolicies
. Este es el ejemplo de la app decartservice
:
Consulta el estado del Sincronizador de configuración de
RootSync
y los dosRepoSyncs
: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 destatus: SYNCED
, espera unos minutos y vuelve a ejecutargcloud 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.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 GKE Enterprise
Puedes ver el estado de las funciones de seguridad de GKE Enterprise, incluidas las políticas de autenticación y autorización, en la consola de Google Cloud.
En la consola de Google Cloud, ve a la página Seguridad de GKE Enterprise.
Ir a Seguridad de GKE Enterprise
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.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
yonlineboutique
).Las tarjetas de Control de acceso de servicio y Estado de mTLS proporcionan una descripción general de alto nivel.
En la lista Cargas de trabajo, se muestra el control de acceso del servicio y el estado de mTLS de cada carga de trabajo.
Ya protegiste tu clúster y tu malla con el controlador de políticas y el Sincronizador de configuración.
Limpia
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 Google Cloud:
gcloud projects delete PROJECT_ID
Borra los recursos individuales
Para borrar los recursos individuales, haz lo siguiente:
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
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
Borra los archivos que creaste:
rm -r ~/asm-acm-tutorial-dir
¿Qué sigue?
- Descubre las prácticas recomendadas de seguridad de Cloud Service Mesh.
- Obtén más información sobre el paquete de políticas de Cloud Service Mesh.
- Explora la biblioteca de plantillas de restricciones del controlador de políticas.
- Explora arquitecturas de referencia, diagramas y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.