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