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:
Objetivos
- Crie um cluster do Google Kubernetes Engine (GKE) e registe o cluster numa frota.
- Instale o Policy Controller, o Config Sync e o Cloud Service Mesh num cluster.
- Configure o Config Sync para sincronizar vários repositórios
- Aplique as práticas recomendadas para implementar configurações, apps e recursos do Istio com o Config Sync.
- Implemente configurações de clusters, as apps de exemplo da Online Boutique e um gateway de entrada com o Config Sync.
- Tire partido do
conjunto de políticas do Cloud Service Mesh
do Policy Controller para aplicar as seguintes práticas recomendadas de segurança:
- Certifique-se de que todas as cargas de trabalho na malha têm injeção automática de sidecar.
- Encriptar todo o tráfego na malha.
- Garantir que todas as cargas de trabalho na malha têm um controlo de acesso detalhado.
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
- GKE.
- GKE Enterprise. The billing for GKE Enterprise includes billing for the Cloud Service Mesh, Config Sync, and Policy Controller.
Para gerar uma estimativa de custos com base na sua utilização projetada,
use a calculadora de preços.
Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.
Antes de começar
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
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.
Atualize para a versão mais recente da CLI do Google Cloud:
gcloud components update
Para armazenar os ficheiros que criar neste tutorial, crie um diretório:
mkdir ~/asm-acm-tutorial-dir
Para 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_ID
pelo 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.com
Config 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_ID
Esta 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}.svc.id.goog \ --labels mesh_id=proj-${PROJECT_NUMBER}
Config Connector
Use os seguintes manifestos
ContainerCluster
eContainerNodePool
: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
Substitua
PROJECT_NUMBER
pelo valor da variável de ambientePROJECT_NUMBER
obtida 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 RUNNING
Ligue-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-identity
O 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-tutorial
Para garantir o registo bem-sucedido do cluster do GKE, descreva o respetivo estado:
gcloud container fleet memberships list
O resultado é semelhante ao seguinte:
NAME EXTERNAL_ID LOCATION asm-acm-tutorial 0e12258c-8831-4d81-b5c0-5e7099a468cc global
root-sync
, como um repositórioRootSync
contém todas as configurações no seu cluster, incluindoRepoSyncs
,Constraints
,ClusterRole
,RoleBindings
e 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 enable
Config 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: configmanagement
Ative o Cloud Service Mesh na sua frota.
gcloud
gcloud container fleet mesh enable
Config 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: servicemesh
Ative 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_AUTOMATIC
Ative o Config Sync e o Policy Controller:
gcloud
Guarde o seguinte manifesto como
acm-config.yaml
no 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: true
Para 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.yaml
Config 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: true
O 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
RootSync
predefinido com o seu cluster. Estas configurações instalam e configuram os seguintes componentes principais:Os objetos
RepoSync
que configuram as apps Online Boutique e o gateway de entrada são sincronizados:Uma vez que os reconciliadores
RepoSync
precisam de autorizações adicionais para criar recursos do Istio, também são aplicados ao seu cluster umClusterRole
e dois objetosRoleBinding
para 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 status
O 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: INSTALLED
Se vir
PENDING
ouNOT_INSTALLED
nas linhasStatus
ouPolicy_Controller
, aguarde alguns minutos e executegcloud beta container fleet config-management status
novamente.Para garantir a instalação bem-sucedida do Cloud Service Mesh, descreva o respetivo estado:
gcloud container fleet mesh describe
O 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: ERROR
em vez destate.code: OK
, aguarde alguns minutos e executegcloud container fleet mesh describe
novamente. Antes de avançar com o tutorial, tem de se certificar de que o camposervicemesh.controlPlaneManagement.details.code
tem o valorREVISION_READY
.Implemente a aplicação de exemplo Online Boutique e o gateway de entrada.
O comando seguinte usa
sed
para atualizar o manifestoacm-config.yaml
de 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.yaml
Tenha em atenção que este passo pode demorar alguns minutos a ser concluído.
Veja o estado do Config Sync para o
RootSync
e os doisRepoSyncs
:gcloud alpha anthos config sync repo describe
O 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: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Para ver apenas as informações de um repositório, pode usar as flags
--sync-name
e--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 : ; done
Obtenha 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
sed
para atualizar o manifestoacm-config.yaml
para 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.yaml
O comando anterior implementa os seguintes recursos:
Um
K8sRequiredLabels
Constraint
que requer que qualquerNamespace
na malha contenha a etiqueta de injeção de proxy sidecar da malha de serviços na nuvem específica:Um
AsmSidecarInjection
Constraint
que proíbe qualquerPod
na 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-system
O 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: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Verifique se os
Constraints
foram criados:kubectl get constraints
O Policy Controller pode demorar alguns minutos a avaliar estas restrições. Se não vir valores na coluna
TOTAL-VIOLATIONS
, aguarde e executekubectl get constraints
novamente.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 0
Como configurámos corretamente os nossos
Namespaces
ePods
, existem0
TOTAL-VIOLATIONS
para estesConstraints
.Para ver estas
Constraints
em funcionamento, experimente criar umNamespace
no seu cluster sem umlabel
nem umannotation
:kubectl create namespace test
O 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
sed
para atualizar o manifestoacm-config.yaml
para 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.yaml
O comando anterior implementa os seguintes recursos:
Um
AsmPeerAuthnMeshStrictMtls
Constraint
que aplica o mTLS ao nível da malhaPeerAuthentication
no espaço de nomesistio-system
:Uma restrição referencial
Config
no espaço de nomesgatekeeper-system
. Esta restrição referencial permite que o elementoAsmPeerAuthnMeshStrictMtls
Constraint
faça referência a outro objeto na respetiva definição (por exemplo, pesquisar qualquerPeerAuthentication
no elementoistio-system
Namespace
):Uma
DestinationRuleTLSEnabled
Constraint
que proíbe a desativação do TLS para todos os anfitriões e subconjuntos de anfitriões no IstioDestinationRules
:Um
AsmPeerAuthnStrictMtls
Constraint
que impõe que todos osPeerAuthentications
não podem substituirSTRICT
mTLS:
Veja o estado do Config Sync para
RootSync
:gcloud alpha anthos config sync repo describe \ --sync-name root-sync \ --sync-namespace config-management-system
O 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: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.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}' | jq
O 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
PeerAuthentication
noistio-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
.PeerAuthentication
Quando 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
sed
para atualizar o manifestoacm-config.yaml
para 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.yaml
O comando anterior implementa o seguinte
STRICT
mTLSPeerAuthentication
no espaço de nomesistio-system
. Isto aplica o mTLSSTRICT
a 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-system
O 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: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Verifique se os
Constraints
foram criados:kubectl get constraints
Tenha em atenção que pode demorar alguns minutos até que o Policy Controller avalie estes
Constraints
. Aguarde e execute novamente este comandokubectl get constraints
até obter valores na colunaTOTAL-VIOLATIONS
para 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 0
Para aplicar o controlo de acesso detalhado, aplique restrições.
O comando seguinte usa
sed
para atualizar o manifestoacm-config.yaml
para 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.yaml
O comando anterior implementa os seguintes recursos:
Um
AsmAuthzPolicyDefaultDeny
Constraint
que aplica a negação predefinida ao nível da malhaAuthorizationPolicy
no espaço de nomesistio-system
:Um
AsmAuthzPolicyEnforceSourcePrincipals
Constraint
que impõe que qualquerAuthorizationPolicies
está 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 appfrontend
da 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-system
O 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: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.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}' | jq
O 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
AuthorizationPolicy
no espaço de nomesistio-system
.O comando seguinte usa
sed
para atualizar o manifestoacm-config.yaml
para 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.yaml
O comando anterior implementa o seguinte deny-all
AuthorizationPolicy
no 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-system
O 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: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Verifique se os
Constraints
foram criados:kubectl get constraints
Tenha em atenção que pode demorar alguns minutos até que o Policy Controller avalie estes
Constraints
. Aguarde e execute novamente este comandokubectl get constraints
até obter valores na colunaTOTAL-VIOLATIONS
para 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 0
Visite 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
AuthorizationPolicies
mais detalhadas nos espaços de nomesasm-ingress
eonlineboutique
.O comando seguinte usa
sed
para atualizar o manifestoacm-config.yaml
para 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.yaml
O comando anterior implementa os seguintes recursos:
Um
AuthorizationPolicy
noasm-ingress
espaço de nomes:Um
AuthorizationPolicy
por app no espaço de nomesonlineboutique
. Segue-se o exemplo para a appcartservice
:Um
ServiceAccount
por app nos espaços de nomesasm-ingress
eonlineboutique
para ter uma identidade exclusiva por app avaliada comoprincipal
noAuthorizationPolicies
. Segue-se o exemplo para a appcartservice
:
Veja o estado do Config Sync para o
RootSync
e os doisRepoSyncs
:gcloud alpha anthos config sync repo describe
O 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: RECONCILING
em vez destatus: SYNCED
, aguarde alguns minutos e executegcloud alpha anthos config sync repo describe
novamente.Para ver apenas as informações de um repositório, pode usar as flags
--sync-name
e--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-ingress
eonlineboutique
).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.
Limpar
Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.
Elimine o projeto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
Elimine recursos individuais
Para eliminar os recursos individuais:
Anule o registo do cluster na frota:
gcloud
gcloud container fleet memberships unregister ${CLUSTER} \ --project=${PROJECT_ID} \ --gke-cluster=${CLUSTER_ZONE}/${CLUSTER}
O resultado é semelhante ao seguinte:
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
Elimine o cluster:
gcloud
gcloud container clusters delete ${CLUSTER} \ --zone ${CLUSTER_ZONE}
Prima
y
quando lhe for pedido. Este comando pode demorar mais de cinco minutos a ser concluído.O resultado é semelhante ao seguinte:
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
Elimine os ficheiros que criou:
rm -r ~/asm-acm-tutorial-dir
O que se segue?
- Descubra as práticas recomendadas de segurança da Cloud Service Mesh.
- Saiba mais sobre o pacote de políticas da Cloud Service Mesh.
- Explore a biblioteca de modelos de restrições do Policy Controller.
- Explore arquiteturas de referência, diagramas e práticas recomendadas sobre o Google Cloud. Consulte o nosso Centro de arquitetura na nuvem.