En este tutorial se explica cómo mejorar la postura de seguridad de tu clúster y tu aplicación. Supongamos que eres un administrador de una plataforma cuya organización gestiona las aplicaciones de su tienda online con Cloud Service Mesh, un conjunto de herramientas que te ayuda a monitorizar y gestionar una malla de servicios fiable. Es tu responsabilidad asegurarte de que tu red de malla y tus aplicaciones sean seguras.
Puedes evitar errores de configuración y validar automáticamente tus políticas de Cloud Service Mesh con Policy Controller y Config Sync. Policy Controller permite aplicar políticas totalmente programables en tus clústeres. Policy Controller también incluye una biblioteca predeterminada de plantillas de restricciones que puedes usar con el paquete de seguridad de Cloud Service Mesh para auditar el cumplimiento de las vulnerabilidades de seguridad y las prácticas recomendadas de tu malla. Config Sync reconcilia continuamente el estado de los clústeres con un conjunto central de archivos de configuración declarativos de Kubernetes. Si usas Policy Controller y Config Sync juntos, podrás aplicar restricciones de forma continua a las configuraciones de políticas de tu malla de servicios de Cloud.
En el siguiente diagrama se muestra cómo funcionan conjuntamente Cloud Service Mesh, Policy Controller y Config Sync en este tutorial para gestionar y proteger una puerta de enlace de entrada y las aplicaciones de ejemplo Online Boutique que se usan en este tutorial:
Prepara tu entorno
En esta sección, se prepara el entorno para poder instalar Cloud Service Mesh, Policy Controller y Config Sync:
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Actualiza a la versión más reciente de Google Cloud CLI:
gcloud components updatePara almacenar los archivos que crees en este tutorial, crea un directorio:
mkdir ~/asm-acm-tutorial-dirPara simplificar el resto del tutorial, 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)')Sustituye
PROJECT_IDpor el ID del proyecto que quieras usar en este tutorial.Si se te pide que autorices Cloud Shell, haz clic en Autorizar para completar la operación.
Habilita las APIs que necesitas para este tutorial:
gcloud
gcloud services enable \ mesh.googleapis.com \ anthos.googleapis.comConfig Connector
Este tutorial incluye recursos de Config Connector. Puedes usar estos recursos para completar las mismas tareas que realizas en la pestaña
gcloud. Para utilizar estos recursos, instala Config Connector y aplica los recursos de la forma que mejor se adapte a tu entorno.Usa el siguiente
Servicesmanifiesto: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_IDEsta operación puede tardar más de un minuto.
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}. \ --labels mesh_id=proj-${PROJECT_NUMBER}Config Connector
Usa los siguientes manifiestos
ContainerClusteryContainerNodePool: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.Sustituye
PROJECT_NUMBERpor el valor de la variable de entornoPROJECT_NUMBERque has obtenido antes.Esta operación puede tardar más de cinco minutos en completarse.
Para asegurarte de que el clúster de GKE se ha creado correctamente, describe su estado:
gcloud container clusters list \ --zone ${CLUSTER_ZONE} \ --project ${PROJECT_ID}El resultado debería ser similar al siguiente:
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 RUNNINGConé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-identityEl resultado debería ser similar al siguiente:
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
GKEHubMembershipmanifiesto: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-tutorialPara asegurarte de que el clúster de GKE se ha registrado correctamente, describe su estado:
gcloud container fleet memberships listEl resultado debería ser similar al siguiente:
NAME EXTERNAL_ID LOCATION asm-acm-tutorial 0e12258c-8831-4d81-b5c0-5e7099a468cc globalroot-sync, como repositorio deRootSync, contiene todas las configuraciones de tu clúster, incluidasRepoSyncs,Constraints,ClusterRole,RoleBindingsy 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 progresivamente a lo largo de este tutorial.online-boutique, como segundoRepoSync, contiene todos los recursos necesarios para implementar las aplicaciones de Online Boutique y protegerlas progresivamente a lo largo de este tutorial.Habilita el operador
ConfigManagement, que gestiona Config Sync y Policy Controller:gcloud
gcloud beta container fleet config-management enableConfig Connector
Usa el siguiente
GKEHubFeaturemanifiesto:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeature metadata: name: configmanagement spec: projectRef: external: PROJECT_ID location: global resourceID: configmanagementHabilita Cloud Service Mesh en tu flota.
gcloud
gcloud container fleet mesh enableConfig Connector
Usa el siguiente
GKEHubFeaturemanifiesto:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeature metadata: name: servicemesh spec: projectRef: external: PROJECT_ID location: global resourceID: servicemeshHabilita la gestión automática de Cloud Service Mesh para que Google aplique la configuración recomendada de Cloud Service Mesh gestionado:
gcloud
gcloud container fleet mesh update \ --management automatic \ --memberships ${MEMBERSHIP}Config Connector
Usa el siguiente
GKEHubFeatureMembershipmanifiesto: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_AUTOMATICHabilita Config Sync y Policy Controller:
gcloud
Guarda el siguiente archivo de manifiesto como
acm-config.yamlen 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: truePara obtener más información sobre los campos de configuración de la CLI de Google Cloud, consulta Campos de especificación de aplicación de gcloud.
Aplica el archivo:
gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlConfig Connector
Usa el siguiente
GKEHubFeatureMembershipmanifiesto: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: truePolicy Controller y Config Sync están instalados en tu clúster. A continuación, Config Sync empieza a sincronizar todas las configuraciones del
RootSyncpredeterminado con tu clúster. Estas configuraciones instalan y configuran los siguientes componentes clave:Los objetos
RepoSyncque configuran las aplicaciones de Online Boutique y la puerta de enlace de entrada se sincronizan:Como los reconciliadores de
RepoSyncnecesitan permisos adicionales para crear recursos de Istio, también se aplican a tu clúster un objetoClusterRoley dos objetosRoleBindingpara conceder estos permisos:
Para asegurarte de que Policy Controller y Config Sync se han instalado correctamente, comprueba el estado:
gcloud beta container fleet config-management statusEl resultado debería ser similar al siguiente:
Name: asm-acm-tutorial Status: SYNCED Last_Synced_Token: 4b3384d Sync_Branch: main Last_Synced_Time: 2022-05-04T21:32:58Z Policy_Controller: INSTALLEDSi ves
PENDINGoNOT_INSTALLEDen las filasStatusoPolicy_Controller, espera unos minutos y vuelve a ejecutargcloud beta container fleet config-management status.Para asegurarte de que Cloud Service Mesh se ha instalado correctamente, describe su estado:
gcloud container fleet mesh describeEl resultado debería ser similar al siguiente:
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: ERRORen lugar destate.code: OK, espera unos minutos y vuelve a ejecutargcloud container fleet mesh describe. Antes de continuar con el tutorial, debes asegurarte de que el camposervicemesh.controlPlaneManagement.details.codetenga el valorREVISION_READY.Despliega la aplicación de ejemplo Online Boutique y la puerta de enlace de entrada.
El siguiente comando usa
sedpara actualizar el manifiestoacm-config.yamly conseguir que Config Sync implemente los recursos que necesitas para implementar la pasarela de entrada y la aplicación de ejemplo.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.yamlTen en cuenta que este paso puede tardar unos minutos en completarse.
Consulta el estado de Config Sync de
RootSyncy de los dosRepoSyncs:gcloud alpha anthos config sync repo describeLa salida es similar a la 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: RECONCILINGen 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-namey--sync-namespace. Para ver los recursos gestionados en detalle, añade la marca--managed-resources. Para obtener más información, consulta Ver el estado de Config Sync en varios clústeres.Espera a que se aprovisione la dirección IP pública de la pasarela de entrada:
until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; doneObtén la dirección IP pública de la pasarela 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 ha implementado correctamente:
echo http://${EXTERNAL_IP}Para aplicar la inyección de proxies de sidecar, aplica restricciones.
El siguiente comando usa
sedpara actualizar el manifiestoacm-config.yamly conseguir que Config Sync 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.yamlEl comando anterior implementa los siguientes recursos:
Un
K8sRequiredLabelsConstraintque requiere que cualquierNamespacede la malla contenga la etiqueta de inyección de proxy sidecar de Cloud Service Mesh específica:Un
AsmSidecarInjectionConstraintque prohíbe que cualquierPodde la malla omita la inyección de sidecar de proxy de Istio:
Consulta el estado de Config Sync de
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemLa salida es similar a la 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: RECONCILINGen lugar destatus: SYNCED, espera unos minutos y vuelve a ejecutargcloud alpha anthos config sync repo describe.Verifica que se hayan creado los
Constraints:kubectl get constraintsPolicy Controller puede tardar unos minutos en evaluar estas restricciones. Si no ve ningún valor en la columna
TOTAL-VIOLATIONS, espere y vuelva a ejecutarkubectl get constraints.La salida es similar a la 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 0Como hemos configurado correctamente
NamespacesyPods, hay0TOTAL-VIOLATIONSpara estosConstraints.Para ver estos
Constraintsen acción, intenta crear unNamespaceen tu clúster sinlabelniannotation:kubectl create namespace testLa salida 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"}Para aplicar el cifrado del tráfico, aplica restricciones.
El siguiente comando usa
sedpara actualizar el manifiestoacm-config.yamly conseguir que Config Sync 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.yamlEl comando anterior implementa los siguientes recursos:
Un
AsmPeerAuthnMeshStrictMtlsConstraintque aplica el mTLS a nivel de mallaPeerAuthenticationen el espacio de nombresistio-system:Una restricción referencial
Configen el espacio de nombresgatekeeper-system. Esta restricción referencial permite queAsmPeerAuthnMeshStrictMtlsConstrainthaga referencia a otro objeto en su definición (por ejemplo, buscar cualquierPeerAuthenticationenistio-systemNamespace):Un
DestinationRuleTLSEnabledConstraintque prohíbe inhabilitar TLS para todos los hosts y subconjuntos de hosts en IstioDestinationRules:Un
AsmPeerAuthnStrictMtlsConstraintque obliga a que todos losPeerAuthenticationsno puedan sobrescribirSTRICTmTLS:
Consulta el estado de Config Sync de
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemLa salida es similar a la 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: RECONCILINGen 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 la infracción
PeerAuthentication:kubectl get asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls -ojsonpath='{.status.violations}' | jqLa salida es similar a la 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
PeerAuthenticationen elistio-system. Para evitar que todos tus servicios de la malla acepten tráfico sin cifrar, define una políticaPeerAuthenticationen toda la malla con el modo mTLS definido comoSTRICT. Cuando implementas la política, el plano de control aprovisiona automáticamente certificados TLS para que las cargas de trabajo puedan autenticarse entre sí.El siguiente comando usa
sedpara actualizar el manifiestoacm-config.yamly conseguir que Config Sync 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.yamlEl comando anterior implementa el siguiente
STRICTmTLSPeerAuthenticationen el espacio de nombresistio-system. Esto aplica mTLSSTRICTa toda la malla:Consulta el estado de Config Sync de
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemLa salida es similar a la 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: RECONCILINGen lugar destatus: SYNCED, espera unos minutos y vuelve a ejecutargcloud alpha anthos config sync repo describe.Verifica que se hayan creado los
Constraints:kubectl get constraintsTen en cuenta que Policy Controller puede tardar unos minutos en evaluar estos
Constraints. Espera y vuelve a ejecutar este comandokubectl get constraintshasta que obtengas valores en la columnaTOTAL-VIOLATIONSde cada línea.La salida es similar a la 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 0Para aplicar un control de acceso pormenorizado, aplica restricciones.
El siguiente comando usa
sedpara actualizar el manifiestoacm-config.yamly conseguir que Config Sync 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.yamlEl comando anterior implementa los siguientes recursos:
Un
AsmAuthzPolicyDefaultDenyConstraintque aplica la denegación predeterminada a nivel de mallaAuthorizationPolicyen el espacio de nombresistio-system:Un
AsmAuthzPolicyEnforceSourcePrincipalsConstraintque obliga a que cualquierAuthorizationPoliciesdefina principales de origen granulares (que no sean "*"). La única excepción a esta regla es la pasarela de entrada del espacio de nombresasm-ingress, que puede recibir el tráfico de los usuarios finales y redirigirlo a la aplicaciónfrontendde Online Boutique.
Consulta el estado de Config Sync de
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemLa salida es similar a la 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: RECONCILINGen 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 la infracción asociada:
kubectl get asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies -ojsonpath='{.status.violations}' | jqLa salida es similar a la 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" } ]Soluciona el problema implementando el
AuthorizationPolicyen el espacio de nombresistio-system.El siguiente comando usa
sedpara actualizar el manifiestoacm-config.yamly conseguir que Config Sync 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.yamlEl comando anterior implementa el siguiente
AuthorizationPolicyde denegación total en el espacio de nombresistio-system:Consulta el estado de Config Sync de
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemLa salida es similar a la 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: RECONCILINGen lugar destatus: SYNCED, espera unos minutos y vuelve a ejecutargcloud alpha anthos config sync repo describe.Verifica que se hayan creado los
Constraints:kubectl get constraintsTen en cuenta que Policy Controller puede tardar unos minutos en evaluar estos
Constraints. Espera y vuelve a ejecutar este comandokubectl get constraintshasta que obtengas valores en la columnaTOTAL-VIOLATIONSde cada línea.La salida es similar a la 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 0Visita la aplicación Online Boutique desde tu navegador:
echo http://${EXTERNAL_IP}Deberías recibir el error
RBAC: access denied, que confirma que el valor predeterminado de denegaciónAuthorizationPolicyse aplica a toda la malla.Para solucionar este problema, implementa
AuthorizationPoliciesmás granulares en los espacios de nombresasm-ingressyonlineboutique.El siguiente comando usa
sedpara actualizar el manifiestoacm-config.yamly conseguir que Config Sync 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.yamlEl comando anterior implementa los siguientes recursos:
Un
AuthorizationPolicyen el espacio de nombresasm-ingressUn
AuthorizationPolicypor aplicación en el espacio de nombresonlineboutique. A continuación se muestra un ejemplo de la aplicacióncartservice:Un
ServiceAccountpor aplicación en los espacios de nombresasm-ingressyonlineboutiquepara tener una identidad única por aplicación evaluada comoprincipalenAuthorizationPolicies. Aquí tienes un ejemplo de la aplicacióncartservice:
Consulta el estado de Config Sync de
RootSyncy de los dosRepoSyncs:gcloud alpha anthos config sync repo describeLa salida es similar a la 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: RECONCILINGen 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-namey--sync-namespace. Para ver los recursos gestionados en detalle, puedes añadir la marca--managed-resources. Para obtener más información, consulta Ver el estado de Config Sync en varios clústeres.Vuelve a visitar la aplicación Online Boutique desde tu navegador:
echo http://${EXTERNAL_IP}Si esperas unos minutos, el sitio web debería volver a funcionar correctamente.
En la Google Cloud consola, ve a la página Seguridad de GKE Enterprise.
Ir a Seguridad de GKE Enterprise
En Resumen de políticas se muestra el estado de la seguridad de las aplicaciones, incluido el control de acceso a servicios (
AuthorizationPolicies) y mTLS.Haz clic en Auditoría de políticas para ver los estados de las políticas de cargas de trabajo del clúster y de ambos espacios de nombres (
asm-ingressyonlineboutique).Las tarjetas Control de acceso a los servicios y Estado de mTLS ofrecen una descripción general.

La lista Cargas de trabajo muestra el control de acceso al servicio y el estado de mTLS de cada carga de trabajo.

Configurar un clúster de GKE
En esta sección, creará un clúster de GKE y, a continuación, lo registrará en una flota. Las flotas son unGoogle Cloud concepto para organizar de forma lógica clústeres y otros recursos, lo que te permite usar y gestionar funciones de varios clústeres, así como aplicar políticas coherentes en tus sistemas.
El clúster que crees en esta sección es el clúster en el que instalarás Cloud Service Mesh, Policy Controller y Config Sync. También es el clúster en el que se implementan las aplicaciones de ejemplo de Online Boutique.
Para configurar el clúster, sigue estos pasos:
Explorar los repositorios
En la siguiente sección de instalación, se aplica un archivo acm-config.yaml de manifiesto. Este manifiesto configura tu clúster para que se sincronice desde la carpeta asm-acm-tutorial del repositorio de ejemplo. Esta carpeta contiene todos los archivos de configuración que necesitas para completar el resto del tutorial.
Para simplificar este tutorial, usarás comandos de sed para actualizar el acm-config.yaml. Con el archivo acm-config.yaml, Config Sync implementa los manifiestos necesarios para cada paso de este tutorial.
Actualizar un solo archivo te ayuda a centrarte en los conceptos y el flujo de protección de tus clústeres, malla y aplicaciones sin tener que manipular los archivos ni ejecutar los comandos git repetidamente.
Para aprovechar la capacidad de Config Sync de sincronizar varios repositorios, utiliza los siguientes recursos:
Instalar Policy Controller, Config Sync y Cloud Service Mesh gestionado
Ahora que has creado y registrado tu clúster, puedes instalar Config Sync, Policy Controller y Cloud Service Mesh en él, así como configurarlo para que se sincronice con las configuraciones del RootSync predeterminado:
Desplegar una pasarela de entrada y una aplicación de ejemplo
En esta sección, desplegarás la aplicación de ejemplo Online Boutique y una puerta de enlace de entrada para gestionar el tráfico de entrada.
Aplicar políticas para proteger tu malla
En las siguientes secciones, utilizarás Policy Controller para aplicar políticas del paquete de políticas de Cloud Service Mesh creando restricciones.
Implementar la inserción de proxies de sidecar
En esta sección, aplicará políticas para asegurarse de que todas las cargas de trabajo de la malla tengan habilitada la inyección automática de sidecar.
Forzar el cifrado del tráfico
En esta sección, aplicarás políticas para asegurarte de que todo el tráfico de la malla esté cifrado.
Aplica controles de acceso pormenorizados
En esta sección, se aplican políticas para asegurarse de que todas las cargas de trabajo de la malla tengan un control de acceso granular.
Ver el estado de las funciones de seguridad de GKE Enterprise
Puedes consultar el estado de las funciones de seguridad de GKE Enterprise, incluidas las políticas de autenticación y autorización, en la Google Cloud consola.
Ahora has protegido tu clúster y tu malla con Policy Controller y Config Sync.