Este tutorial mostra como melhorar a postura de segurança do cluster e da app. Imagine que é um administrador de plataforma cuja organização está a gerir as apps para a respetiva loja online com o Cloud Service Mesh, um conjunto de ferramentas que ajuda a monitorizar e gerir uma malha de serviços fiável. É responsável por garantir que a sua rede de malha e apps estão seguras.
Pode evitar a configuração incorreta e validar automaticamente as políticas do Cloud Service Mesh com o Policy Controller e o Config Sync. O Policy Controller permite a aplicação de políticas totalmente programáveis para os seus clusters. O Policy Controller também inclui uma biblioteca predefinida de modelos de restrições que pode usar com o pacote de segurança do Cloud Service Mesh para auditar a conformidade das vulnerabilidades de segurança e das práticas recomendadas da sua malha. O Config Sync reconcilia continuamente o estado dos clusters com um conjunto central de ficheiros de configuração declarativos do Kubernetes. A utilização do Policy Controller e do Config Sync em conjunto permite-lhe aplicar continuamente restrições nas suas configurações de políticas do Cloud Service Mesh.
O diagrama seguinte mostra uma vista geral de como a Cloud Service Mesh, o Policy Controller e o Config Sync funcionam em conjunto neste tutorial para gerir e proteger um gateway de entrada e as apps de exemplo da Online Boutique que usa neste tutorial:
Prepare o seu ambiente
Nesta secção, prepara o seu ambiente para poder instalar o Cloud Service Mesh, o Policy Controller e o 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.
Atualize para a versão mais recente da CLI do Google Cloud:
gcloud components updatePara armazenar os ficheiros que criar neste tutorial, crie um diretório:
mkdir ~/asm-acm-tutorial-dirPara simplificar o resto do tutorial, crie as seguintes variáveis de ambiente:
PROJECT_ID=PROJECT_ID gcloud config set project $PROJECT_ID CLUSTER=asm-acm-tutorial CLUSTER_ZONE=us-east4-a MEMBERSHIP=asm-acm-tutorial PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')Substitua
PROJECT_IDpelo ID do projeto que quer usar para este tutorial.Se lhe for pedido para autorizar o Cloud Shell, clique em Autorizar para concluir a operação.
Ative as APIs de que precisa para este tutorial:
gcloud
gcloud services enable \ mesh.googleapis.com \ anthos.googleapis.comConfig Connector
Este tutorial inclui recursos do Config Connector. Pode usar estes recursos para concluir as mesmas tarefas que conclui no separador
gcloud. Para usar estes recursos, instale o Config Connector e aplique os recursos da forma mais adequada para o seu ambiente.Use o seguinte manifesto
Services:apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1 kind: Service metadata: annotations: cnrm.cloud.google.com/deletion-policy: "abandon" cnrm.cloud.google.com/disable-dependent-services: "false" name: mesh.googleapis.com spec: resourceID: mesh.googleapis.com projectRef: external: PROJECT_ID --- apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1 kind: Service metadata: annotations: cnrm.cloud.google.com/deletion-policy: "abandon" cnrm.cloud.google.com/disable-dependent-services: "false" name: anthos.googleapis.com spec: resourceID: anthos.googleapis.com projectRef: external: PROJECT_IDEsta operação pode demorar mais de um minuto a ser concluída.
Crie um cluster do GKE:
gcloud
gcloud container clusters create ${CLUSTER} \ --zone ${CLUSTER_ZONE} \ --machine-type=e2-standard-4 \ --num-nodes 4 \ --workload-pool ${PROJECT_ID}. \ --labels mesh_id=proj-${PROJECT_NUMBER}Config Connector
Use os seguintes manifestos
ContainerClustereContainerNodePool: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.Substitua
PROJECT_NUMBERpelo valor da variável de ambientePROJECT_NUMBERobtida anteriormente.Esta operação pode demorar mais de cinco minutos a ser concluída.
Para garantir a criação bem-sucedida do cluster do GKE, descreva o respetivo estado:
gcloud container clusters list \ --zone ${CLUSTER_ZONE} \ --project ${PROJECT_ID}O resultado é semelhante ao seguinte:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS asm-acm-tutorial us-east4-a 1.23.12-gke.100 35.186.179.30 e2-standard-4 1.23.12-gke.100 3 RUNNINGLigue-se ao cluster do GKE:
gcloud container clusters get-credentials ${CLUSTER} \ --zone ${CLUSTER_ZONE} \ --project ${PROJECT_ID}Registe o cluster numa frota:
gcloud
gcloud container fleet memberships register ${MEMBERSHIP} \ --project ${PROJECT_ID} \ --gke-cluster ${CLUSTER_ZONE}/${CLUSTER} \ --enable-workload-identityO resultado é semelhante ao seguinte:
kubeconfig entry generated for asm-acm-tutorial. Waiting for membership to be created...done. Created a new membership [projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial] for the cluster [asm-acm-tutorial] Generating the Connect Agent manifest... Deploying the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]... Deployed the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]. Finished registering the cluster [asm-acm-tutorial] with the Fleet.Config Connector
Use o seguinte manifesto
GKEHubMembership:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubMembership metadata: annotations: cnrm.cloud.google.com/project-id: PROJECT_ID name: asm-acm-tutorial spec: location: global authority: issuer: https://container.googleapis.com/v1/projects/PROJECT_ID/locations/us-east4-a/clusters/asm-acm-tutorial endpoint: gkeCluster: resourceRef: name: asm-acm-tutorialPara garantir o registo bem-sucedido do cluster do GKE, descreva o respetivo estado:
gcloud container fleet memberships listO resultado é semelhante ao seguinte:
NAME EXTERNAL_ID LOCATION asm-acm-tutorial 0e12258c-8831-4d81-b5c0-5e7099a468cc globalroot-sync, como um repositórioRootSynccontém todas as configurações no seu cluster, incluindoRepoSyncs,Constraints,ClusterRole,RoleBindingse recursos incluídos em alguns espaços de nomes do sistema, comoistio-system.ingress-gateway, como primeiroRepoSync, contém todos os recursos necessários para implementar um gateway de entrada e protegê-lo progressivamente ao longo deste tutorial.online-boutique, como um segundoRepoSync, contém todos os recursos necessários para implementar as apps Online Boutique e protegê-las progressivamente ao longo deste tutorial.Ative o operador
ConfigManagement, que gere o Config Sync e o Policy Controller:gcloud
gcloud beta container fleet config-management enableConfig Connector
Use o seguinte manifesto
GKEHubFeature:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeature metadata: name: configmanagement spec: projectRef: external: PROJECT_ID location: global resourceID: configmanagementAtive o Cloud Service Mesh na sua frota.
gcloud
gcloud container fleet mesh enableConfig Connector
Use o seguinte manifesto
GKEHubFeature:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeature metadata: name: servicemesh spec: projectRef: external: PROJECT_ID location: global resourceID: servicemeshAtive a gestão automática do Cloud Service Mesh para permitir que a Google aplique a configuração recomendada do Cloud Service Mesh gerido:
gcloud
gcloud container fleet mesh update \ --management automatic \ --memberships ${MEMBERSHIP}Config Connector
Use o seguinte manifesto
GKEHubFeatureMembership:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeatureMembership metadata: name: servicemesh-membership spec: projectRef: external: PROJECT_ID location: global membershipRef: name: asm-acm-tutorial featureRef: name: servicemesh mesh: management: MANAGEMENT_AUTOMATICAtive o Config Sync e o Policy Controller:
gcloud
Guarde o seguinte manifesto como
acm-config.yamlno diretório~/asm-acm-tutorial-dir:applySpecVersion: 1 spec: configSync: enabled: true policyDir: asm-acm-tutorial/root-sync/init secretType: none sourceFormat: unstructured syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples syncBranch: main policyController: enabled: true referentialRulesEnabled: true templateLibraryInstalled: truePara saber mais sobre os campos de configuração da CLI gcloud, consulte os campos de especificação de aplicação da gcloud.
Aplique o ficheiro:
gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlConfig Connector
Use o seguinte manifesto
GKEHubFeatureMembership:apiVersion: gkehub.cnrm.cloud.google.com/v1beta1 kind: GKEHubFeatureMembership metadata: name: configmanagement-membership spec: projectRef: external: PROJECT_ID location: global membershipRef: name: asm-acm-tutorial featureRef: name: configmanagement configmanagement: configSync: sourceFormat: unstructured git: policyDir: asm-acm-tutorial/root-sync/init secretType: none syncBranch: main syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples policyController: enabled: true referentialRulesEnabled: true templateLibraryInstalled: trueO Policy Controller e o Config Sync estão instalados no seu cluster. Em seguida, o Config Sync começa a sincronizar todas as configurações do
RootSyncpredefinido com o seu cluster. Estas configurações instalam e configuram os seguintes componentes principais:Os objetos
RepoSyncque configuram as apps Online Boutique e o gateway de entrada são sincronizados:Uma vez que os reconciliadores
RepoSyncprecisam de autorizações adicionais para criar recursos do Istio, também são aplicados ao seu cluster umClusterRolee dois objetosRoleBindingpara conceder estas autorizações:
Para garantir a instalação bem-sucedida do Policy Controller e do Config Sync, verifique o estado:
gcloud beta container fleet config-management statusO resultado é semelhante ao seguinte:
Name: asm-acm-tutorial Status: SYNCED Last_Synced_Token: 4b3384d Sync_Branch: main Last_Synced_Time: 2022-05-04T21:32:58Z Policy_Controller: INSTALLEDSe vir
PENDINGouNOT_INSTALLEDnas linhasStatusouPolicy_Controller, aguarde alguns minutos e executegcloud beta container fleet config-management statusnovamente.Para garantir a instalação bem-sucedida do Cloud Service Mesh, descreva o respetivo estado:
gcloud container fleet mesh describeO resultado é semelhante ao seguinte:
createTime: '2022-09-13T23:12:56.477042921Z' membershipSpecs: projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial: servicemesh: controlPlaneManagement: details: - code: REVISION_READY details: 'Ready: asm-managed' state: ACTIVE dataPlaneManagement: details: - code: OK details: Service is running. state: ACTIVE state: code: OK description: |- Revision(s) ready for use: asm-managed. All Canonical Services have been reconciled successfully. updateTime: '2022-09-14T00:19:10.571552206Z' name: projects/PROJECT_ID/locations/global/features/servicemesh resourceState: state: ACTIVE spec: {} state: state: {} updateTime: '2022-09-14T00:19:14.135113118Z'Se vir
state.code: ERRORem vez destate.code: OK, aguarde alguns minutos e executegcloud container fleet mesh describenovamente. Antes de avançar com o tutorial, tem de se certificar de que o camposervicemesh.controlPlaneManagement.details.codetem o valorREVISION_READY.Implemente a aplicação de exemplo Online Boutique e o gateway de entrada.
O comando seguinte usa
sedpara atualizar o manifestoacm-config.yamlde modo a fazer com que o Config Sync implemente os recursos necessários para implementar o gateway de entrada e a app de exemplo.sed -i "s,root-sync/init,root-sync/deployments,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlTenha em atenção que este passo pode demorar alguns minutos a ser concluído.
Veja o estado do Config Sync para o
RootSynce os doisRepoSyncs:gcloud alpha anthos config sync repo describeO resultado é semelhante ao seguinte:
getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deployments@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/deployments@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/deployments@main", "status": "SYNCED" } ]Se vir
status: RECONCILINGem vez destatus: SYNCED, aguarde alguns minutos e executegcloud alpha anthos config sync repo describenovamente.Para ver apenas as informações de um repositório, pode usar as flags
--sync-namee--sync-namespace. Para ver os recursos geridos em detalhe, adicione a flag--managed-resources. Para mais informações, consulte o artigo Veja o estado da sincronização de configuração em vários clusters.Aguarde até que o endereço IP público do gateway de entrada seja aprovisionado:
until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; doneObtenha o endereço IP público do gateway de entrada:
EXTERNAL_IP=$(kubectl get svc asm-ingressgateway -n asm-ingress -o jsonpath="{.status.loadBalancer.ingress[*].ip}")Visite o endereço IP a partir do seu navegador para verificar se a app Online Boutique foi implementada com êxito:
echo http://${EXTERNAL_IP}Para aplicar a injeção de proxies sidecar, aplique restrições.
O comando seguinte usa
sedpara atualizar o manifestoacm-config.yamlpara que o Config Sync implemente os recursos associados.sed -i "s,root-sync/deployments,root-sync/enforce-sidecar-injection,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlO comando anterior implementa os seguintes recursos:
Um
K8sRequiredLabelsConstraintque requer que qualquerNamespacena malha contenha a etiqueta de injeção de proxy sidecar da malha de serviços na nuvem específica:Um
AsmSidecarInjectionConstraintque proíbe qualquerPodna malha de ignorar a injeção de sidecar do proxy do Istio:
Veja o estado do Config Sync para
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemO resultado é semelhante ao seguinte:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-sidecar-injection@main", "status": "SYNCED" } ]Se vir
status: RECONCILINGem vez destatus: SYNCED, aguarde alguns minutos e executegcloud alpha anthos config sync repo describenovamente.Verifique se os
Constraintsforam criados:kubectl get constraintsO Policy Controller pode demorar alguns minutos a avaliar estas restrições. Se não vir valores na coluna
TOTAL-VIOLATIONS, aguarde e executekubectl get constraintsnovamente.O resultado é semelhante ao seguinte:
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 configurámos corretamente os nossos
NamespacesePods, existem0TOTAL-VIOLATIONSpara estesConstraints.Para ver estas
Constraintsem funcionamento, experimente criar umNamespaceno seu cluster sem umlabelnem umannotation:kubectl create namespace testO resultado é semelhante ao seguinte erro:
Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [namespace-sidecar-injection-label] you must provide labels: {"istio-injection"}Para aplicar a encriptação de tráfego, aplique restrições.
O comando seguinte usa
sedpara atualizar o manifestoacm-config.yamlpara que o Config Sync implemente os recursos associados.sed -i "s,root-sync/enforce-sidecar-injection,root-sync/enforce-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlO comando anterior implementa os seguintes recursos:
Um
AsmPeerAuthnMeshStrictMtlsConstraintque aplica o mTLS ao nível da malhaPeerAuthenticationno espaço de nomesistio-system:Uma restrição referencial
Configno espaço de nomesgatekeeper-system. Esta restrição referencial permite que o elementoAsmPeerAuthnMeshStrictMtlsConstraintfaça referência a outro objeto na respetiva definição (por exemplo, pesquisar qualquerPeerAuthenticationno elementoistio-systemNamespace):Uma
DestinationRuleTLSEnabledConstraintque proíbe a desativação do TLS para todos os anfitriões e subconjuntos de anfitriões no IstioDestinationRules:Um
AsmPeerAuthnStrictMtlsConstraintque impõe que todos osPeerAuthenticationsnão podem substituirSTRICTmTLS:
Veja o estado do Config Sync para
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemO resultado é semelhante ao seguinte:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-strict-mtls@main", "status": "SYNCED" } ]Se vir
status: RECONCILINGem vez destatus: SYNCED, aguarde alguns minutos e executegcloud alpha anthos config sync repo describenovamente.Execute o seguinte comando para obter mais informações sobre a violação de
PeerAuthentication:kubectl get asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls -ojsonpath='{.status.violations}' | jqO resultado é semelhante ao seguinte:
[ { "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" } ]Corrija o problema implementando um
PeerAuthenticationnoistio-system. Para impedir que todos os seus serviços na malha aceitem tráfego de texto simples, defina uma política de malha com o modo mTLS definido comoSTRICT.PeerAuthenticationQuando implementa a política, o plano de controlo aprovisiona automaticamente certificados TLS para que as cargas de trabalho possam autenticar-se entre si.O comando seguinte usa
sedpara atualizar o manifestoacm-config.yamlpara que o Config Sync implemente os recursos associados.sed -i "s,root-sync/enforce-strict-mtls,root-sync/fix-strict-mtls,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlO comando anterior implementa o seguinte
STRICTmTLSPeerAuthenticationno espaço de nomesistio-system. Isto aplica o mTLSSTRICTa toda a malha:Veja o estado do Config Sync para
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemO resultado é semelhante ao seguinte:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-strict-mtls@main", "status": "SYNCED" } ]Se vir
status: RECONCILINGem vez destatus: SYNCED, aguarde alguns minutos e executegcloud alpha anthos config sync repo describenovamente.Verifique se os
Constraintsforam criados:kubectl get constraintsTenha em atenção que pode demorar alguns minutos até que o Policy Controller avalie estes
Constraints. Aguarde e execute novamente este comandokubectl get constraintsaté obter valores na colunaTOTAL-VIOLATIONSpara cada linha.O resultado é semelhante ao seguinte:
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 o controlo de acesso detalhado, aplique restrições.
O comando seguinte usa
sedpara atualizar o manifestoacm-config.yamlpara que o Config Sync implemente os recursos associados.sed -i "s,root-sync/fix-strict-mtls,root-sync/enforce-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlO comando anterior implementa os seguintes recursos:
Um
AsmAuthzPolicyDefaultDenyConstraintque aplica a negação predefinida ao nível da malhaAuthorizationPolicyno espaço de nomesistio-system:Um
AsmAuthzPolicyEnforceSourcePrincipalsConstraintque impõe que qualquerAuthorizationPoliciesestá a definir principais de origem detalhados (exceto "*"). Apenas o gateway de entrada no espaço de nomesasm-ingressé uma exceção a esta regra para receber o tráfego dos utilizadores finais e redirecionar o tráfego para a appfrontendda Online Boutique.
Veja o estado do Config Sync para
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemO resultado é semelhante ao seguinte:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-authorization-policies@main", "status": "SYNCED" } ]Se vir
status: RECONCILINGem vez destatus: SYNCED, aguarde alguns minutos e executegcloud alpha anthos config sync repo describenovamente.Execute o seguinte comando para obter mais informações sobre a violação associada:
kubectl get asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies -ojsonpath='{.status.violations}' | jqO resultado é semelhante ao seguinte:
[ { "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" } ]Corrija o problema implementando o
AuthorizationPolicyno espaço de nomesistio-system.O comando seguinte usa
sedpara atualizar o manifestoacm-config.yamlpara que o Config Sync implemente os recursos associados.sed -i "s,root-sync/enforce-authorization-policies,root-sync/fix-default-deny-authorization-policy,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlO comando anterior implementa o seguinte deny-all
AuthorizationPolicyno espaço de nomesistio-system:Veja o estado do Config Sync para
RootSync:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-systemO resultado é semelhante ao seguinte:
getting 1 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-default-deny-authorization-policy@main", "status": "SYNCED" } ]Se vir
status: RECONCILINGem vez destatus: SYNCED, aguarde alguns minutos e executegcloud alpha anthos config sync repo describenovamente.Verifique se os
Constraintsforam criados:kubectl get constraintsTenha em atenção que pode demorar alguns minutos até que o Policy Controller avalie estes
Constraints. Aguarde e execute novamente este comandokubectl get constraintsaté obter valores na colunaTOTAL-VIOLATIONSpara cada linha.O resultado é semelhante ao seguinte:
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 0Visite a app Online Boutique a partir do navegador:
echo http://${EXTERNAL_IP}Deve receber o erro:
RBAC: access denied, que confirma que a política de negação por predefiniçãoAuthorizationPolicyé aplicada a toda a malha.Corrija este problema implementando
AuthorizationPoliciesmais detalhadas nos espaços de nomesasm-ingresseonlineboutique.O comando seguinte usa
sedpara atualizar o manifestoacm-config.yamlpara que o Config Sync implemente os recursos associados.sed -i "s,root-sync/fix-default-deny-authorization-policy,root-sync/deploy-authorization-policies,g" ~/asm-acm-tutorial-dir/acm-config.yaml gcloud beta container fleet config-management apply \ --membership ${MEMBERSHIP} \ --config ~/asm-acm-tutorial-dir/acm-config.yamlO comando anterior implementa os seguintes recursos:
Um
AuthorizationPolicynoasm-ingressespaço de nomes:Um
AuthorizationPolicypor app no espaço de nomesonlineboutique. Segue-se o exemplo para a appcartservice:Um
ServiceAccountpor app nos espaços de nomesasm-ingresseonlineboutiquepara ter uma identidade exclusiva por app avaliada comoprincipalnoAuthorizationPolicies. Segue-se o exemplo para a appcartservice:
Veja o estado do Config Sync para o
RootSynce os doisRepoSyncs:gcloud alpha anthos config sync repo describeO resultado é semelhante ao seguinte:
getting 3 RepoSync and RootSync from projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial [ { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deploy-authorization-policies@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/authorization-policies@main", "status": "SYNCED" }, { "clusters": [ "projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial" ], "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884", "errors": [], "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/authorization-policies@main", "status": "SYNCED" } ]Se vir
status: RECONCILINGem vez destatus: SYNCED, aguarde alguns minutos e executegcloud alpha anthos config sync repo describenovamente.Para ver apenas as informações de um repositório, pode usar as flags
--sync-namee--sync-namespace. Para ver em detalhe os recursos geridos, pode adicionar a flag--managed-resources. Para mais informações, consulte o artigo Veja o estado da sincronização de configuração em vários clusters.Visite novamente a app Online Boutique a partir do navegador:
echo http://${EXTERNAL_IP}Se aguardar alguns minutos, já deve ver o Website a funcionar novamente conforme esperado.
Na Google Cloud consola, aceda à página GKE Enterprise Security.
Aceder à segurança do GKE Enterprise
O Resumo das políticas apresenta o estado da segurança das aplicações, incluindo o controlo de acesso aos serviços (
AuthorizationPolicies) e o mTLS.Clique em Auditoria de políticas para ver os estados das políticas de cargas de trabalho para o cluster e ambos os espaços de nomes (
asm-ingresseonlineboutique).Os cartões Controlo de acesso ao serviço e Estado do mTLS oferecem uma vista geral de alto nível.

A lista Workloads (Cargas de trabalho) mostra o controlo de acesso ao serviço e o estado do mTLS de cada carga de trabalho.

Configure um cluster do GKE
Nesta secção, cria um cluster do GKE e, em seguida, regista-o numa frota. As frotas são um Google Cloud conceito para organizar logicamente clusters e outros recursos, o que lhe permite usar e gerir capacidades de vários clusters e aplicar políticas consistentes nos seus sistemas.
O cluster que criar nesta secção é o cluster no qual instala o Cloud Service Mesh, o Policy Controller e o Config Sync. Também é o cluster onde implementa as apps de exemplo da Online Boutique.
Para configurar o cluster, conclua os seguintes passos:
Explore os repositórios
Na secção de instalação seguinte, aplica um ficheiro acm-config.yaml de manifesto. Esta configuração do manifesto
sincroniza o cluster a partir da pasta
asm-acm-tutorial
do repositório de exemplo. Esta pasta contém todos os ficheiros de configuração necessários para concluir o resto do tutorial.
Para simplificar este tutorial, usa comandos sed para atualizar o
acm-config.yaml. Com o ficheiro acm-config.yaml, o Config Sync implementa os manifestos necessários para cada passo deste tutorial.
A atualização de um único ficheiro ajuda a focar-se nos conceitos e no fluxo de proteção dos seus clusters, malha e aplicações sem manipular repetidamente os ficheiros e executar repetidamente comandos git.
Para usar a capacidade do Config Sync de sincronizar vários repositórios, use os seguintes recursos:
Instale o Policy Controller, o Config Sync e o Cloud Service Mesh gerido
Agora que criou e registou o cluster, pode instalar o
Config Sync, o Policy Controller e o Cloud Service Mesh no cluster e
configurar o cluster para sincronizar a partir das configurações do RootSync predefinido:
Implemente um gateway de entrada e uma aplicação de exemplo
Nesta secção, implementa a aplicação de exemplo Online Boutique e um gateway de entrada para gerir o tráfego de entrada.
Aplique políticas para proteger a sua malha
Nas secções seguintes, vai usar o Policy Controller para aplicar políticas do conjunto de políticas da Cloud Service Mesh criando restrições.
Aplique a injeção de proxies complementares
Nesta secção, aplica políticas para garantir que todas as cargas de trabalho na malha têm a injeção automática de sidecar ativada.
Aplique a encriptação de tráfego
Nesta secção, aplica políticas para garantir que todo o tráfego na malha está encriptado.
Aplique o controlo de acesso detalhado
Nesta secção, aplica políticas para garantir que todas as cargas de trabalho na malha têm um controlo de acesso detalhado.
Veja o estado das funcionalidades de segurança do GKE Enterprise
Pode ver o estado das funcionalidades de segurança do GKE Enterprise, incluindo as políticas de autenticação e autorização, na Google Cloud consola.
Agora, protegeu o cluster e a malha com o Policy Controller e o Config Sync.